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 }
进一步的文档和相关内容:
- 数学运算 - 数字生成器 - nftables wiki
- 负载平衡 - nftables 维基
- 作者的首次演讲努姆根Netdev 1.2 的模块:使用 nftables II 实现负载平衡 (PDF)
- 负载均衡器使用nftables:nftlb(来自同一个人/公司)。
回到问题
随机数是一个 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