如何使用 nftables 根据概率丢弃数据包?

如何使用 nftables 根据概率丢弃数据包?

iptables統計模塊允许根据概率对数据包执行操作,我该如何使用 nftables 来做到这一点?

答案1

努姆根

nftables具有所有功能,但由于某些未知原因,它未在任何版本的nft手册页中记录。

内核处理这个问题,nft_numgen已可用自 Linux 4.9 起以及用户空间端自从nftables 0.7 发布

  • 添加号码生成支持。对于循环数据包标记设置很有用,例如。

    # nft add rule filter prerouting meta mark set numgen inc mod 2
    

    您还可以指定偏移量来指示您想要从哪个值开始。

    模数提供了计数序列的尺度。您
    也可以从地图中使用它,例如:

    # nft add rule nat prerouting \
          dnat to numgen inc mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }
    

    因此,这将以循环方式
    在 192.168.10.100 和 192.168.20.200 之间分配新连接。不要忘记特殊的 NAT 链语义:只有第一个数据包会评估规则,后续数据包依靠 conntrack 来应用 NAT 信息。

    您还可以使用间隔模拟具有不同后端权重的流量分布,例如。

    # nft add rule nat prerouting \
          dnat to numgen inc mod 10 map { 0-5 : 192.168.10.100, 6-9 : 192.168.20.200 }
    

还支持随机数。示例:在上一个示例inc(用于循环)中替换为random

nft add rule nat prerouting dnat to numgen random mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }

进一步的文档和相关内容:


回到问题

随机数是一个 32 位整数(大到足以忽略模数偏差),对其应用模数。然后可以比较其值。要丢弃 5% 的所有非本地传入 IPv4 数据包,则需要:

#!/usr/sbin/nft -f

flush ruleset

table ip filter {
    chain input {
        type filter hook input priority 0; policy accept;
        iif "lo" accept
        numgen random mod 100 < 5 drop
    }
}

示例:从其主机 ping 具有此规则集的容器时:

# ping -q -f 10.0.3.66
PING 10.0.3.66 (10.0.3.66) 56(84) bytes of data.
^C
--- 10.0.3.66 ping statistics ---
34351 packets transmitted, 32592 received, 5% packet loss, time 19744ms
rtt min/avg/max/mdev = 0.004/0.017/0.481/0.018 ms, ipg/ewma 0.574/0.017 ms

相关内容