IPTables 负载平衡与粘性会话(IP 亲和性)

IPTables 负载平衡与粘性会话(IP 亲和性)

我一直在 IPTables 模块文档中寻找如何通过源 IP 会话状态亲和性实现负载分配的想法。让我们澄清一下,我不是在进行负载平衡,只是将与我的 NAT 链匹配的数据包分发到本地侦听端口。一旦数据包被重定向到端口,我希望这个状态保持 n 分钟,然后不再跟踪其连接并移动到下一个概率规则等...

我目前的状态:

/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10001
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10002
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10003
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10004
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10005
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10006
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10007
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10008
/sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability .10 -j REDIRECT --to-ports 10009
/sbin/iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 10010

答案1

嗨,让我来回答/说明一下部分内容:
由于规则是按顺序而不是并行评估的,所以您的分布与您假设的并不一样。
每行都是 10%,但不是来自同一个基数。因此,第一行是“真正的”10%,但第二行是来自其余部分(90%)的 10%,因此从技术上讲它“仅”是 9%。第三行是 10%,但来自其余部分(81%),因此它“仅”是 8.1% 等。

10 个端口的分布如下:

0.1
0.11
0.13
0.14
0.17
0.2
0.25
0.33
0.5
1

最后一个意味着所有其余的,所以你的“最后”一行;-)。

答案2

以下是正确制定这些规则的 bash 片段:

rules=10
calc() { bc -l <<< "scale=3; $@"; }
for ((i = rules ; i >= 1 ; i--)); do
  echo /sbin/iptables -t nat -A REDSOCKS -p tcp -m statistic --mode random --probability $(calc 1/$i) -j REDIRECT --to-ports $(calc 10001+$rules-$i)
done

相关内容