我有一台 centos 7 服务器,有 5 个 IPS,如 192.168.0.2/29 到 192.168.0.5/29。我想以循环方式更改传出流量,因为我需要将所有 IPS 用于我的项目。因此,我尝试使用以下命令配置 iptables
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/29 -m statistic --mode nth --every 4 --packet 0 -p tcp --dport 25 -j SNAT --to-source 192.168.0.3
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/29 -m statistic --mode nth --every 3 --packet 0 -p tcp --dport 25 -j SNAT --to-source 192.168.0.2
就像这样,它正常工作。它按流量升序排列(192.168.0.3,192.168.0.2)同样,我尝试配置 centos 6,它按降序运行示例
(192.168.0.2,192.168.0.3)。现在<我想知道--every 3 或 4 的含义>
答案1
有两种方法。这实际上是统计数据。第一种方法(如 OP 所述)导致:
- 1/4 (
--every 4
) 获得优先选择 --every 3
剩余的1/3 ( ) 获得第二选择
OP 的问题中只有两条规则,但可以假设会遵循另外两条规则(或另外一条加上默认规则):
- 剩余的 1/2 获得第三选择
- 剩下的获得第四选择
作为 iptables'纳特如果表只处理流的初始数据包,则整个流将遵循初始数据包的规则(同一流中的其他数据包直接由连接跟踪并且没有被看到纳特桌子)。
每个选择得 1/4:
- 1/4 = 1/4
- 1/3 * (1 - 1/4) = 1/4
对于剩下的一半(如果使用更多规则):
- 1/2 * (1 - 2 * 1/4) = 1/4
- 1 * (1 - 3 * 1/4) = 1/4
另一种方法是仅在每个规则中使用,但使用类似于以下的规则--every 4
更改模量:--packet
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/29 -m statistic --mode nth --every 4 --packet 0 -p tcp --dport 25 -j SNAT --to-source 192.168.0.3
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/29 -m statistic --mode nth --every 4 --packet 1 -p tcp --dport 25 -j SNAT --to-source 192.168.0.2
[...]
- 第一条规则获取数据包数量 % 4 = 0(% 表示“除以的余数”)的数据包:其中 1/4
- 第二条规则获取数据包数量为 % 4 = 1 的数据包:占数据包总数的 1/4
ETC。
第二种方法可能更容易理解,但第一种方法更容易扩展:前置--every
如果必须使用额外的循环,则规则的值增加一。