如何使用 Iptables 对传出流量进行负载平衡?

如何使用 Iptables 对传出流量进行负载平衡?

我有一台 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如果必须使用额外的循环,则规则的值增加一。

相关内容