负载平衡 IPTABLES POSTROUTING 规则

负载平衡 IPTABLES POSTROUTING 规则

我有一个接口,其分配了 5 个 IP 地址(作为虚拟适配器),我们将它们称为 x1、x2、x3、x4 和 x5。

目前,我有从本地源范围到特定公共 IP 地址的 SNAT POSTROUTING 转发规则。以下是当前规则的示例:

-A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source x1.x1.x1.x1

我想要实现的是,新建立的本地连接将被后路由并随机/循环地分配给上述 IP 之一 (x1/x2/x3/x4/x5)。我试着在网上寻找解决方案,但没有找到任何关于如何做到这一点的信息。我几乎确信它是可行的。

答案1

iptables 有一个统计模块,可以使用。它可以在两种模式下运行,即随机模式或确定模式。以下是使用该模块编写规则的方法。

确定性版本:

-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode nth --every 5 --packet 0 -j SNAT --to-source 192.0.2.1
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode nth --every 4 --packet 0 -j SNAT --to-source 192.0.2.2
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode nth --every 3 --packet 0 -j SNAT --to-source 192.0.2.3
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source 192.0.2.4
-A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.0.2.5

随机版本:

-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode random --probability 0.2 -j SNAT --to-source 192.0.2.1
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode random --probability 0.25 -j SNAT --to-source 192.0.2.2
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode random --probability 0.3333333333 -j SNAT --to-source 192.0.2.3
-A POSTROUTING -s 10.8.0.0/24 -m statistic --mode random --probability 0.5 -j SNAT --to-source 192.0.2.4
-A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.0.2.5

答案2

需要明确的是,这不是负载平衡。负载平衡会在多个主机上平衡负载。您只是将源地址分散到同一主机上的多个 IP 上。这不会给您带来任何性能优势,但会使您的设置更加复杂。

但是,假设您想继续。

根据 iptables-extensions 手册页。

SAME (IPv4-specific)

Similar to SNAT/DNAT depending on chain: it takes a range of addresses (`--to 1.2.3.4-1.2.3.7') and gives a client the same source-/destination-address for each connection.
N.B.: The DNAT target's --persistent option replaced the SAME target.

--to ipaddr[-ipaddr]
Addresses to map source to. May be specified more than once for multiple ranges.
--nodst
Don't use the destination-ip in the calculations when selecting the new source-ip
--random
Port mapping will be forcibly randomized to avoid attacks based on port prediction (kernel >= 2.6.21).

但显然范围必须是线性的。例如 1.2.3.4-1.2.3.7 = 1.2.3.4、1.2.3.5、1.2.3.6、1.2.3.7 我不确定这是否与您的设置相符。

但如果确实如此你可以这样做:

-A POSTROUTING -s 10.8.0.0/24 -j SAME --to x1.x1.x1.x1-x5.x5.x5.x5 --nodst

--nodst 选项应该会使选择源 IP 变得更加随机,我不知道它是否使用循环方法或简单的随机器。

相关内容