如果我们有一个有10个IP地址的服务器,有没有一个干净的方法可以在每个发出的请求中随机select一个作为源IP?
我尝试了Apache Mod Proxy,但显然即使我通过脚本自动更改源IP地址,每次我都要重新加载Apache。
有什么工具或清洁方法可以处理这个?
在服务器上托pipe多个客户,
他们中的很多人正在调用相同的API(使用cURL),每秒限制速率为2,所以基本上当客户发送2个请求时,其他人无法获得!
我试图在每个请求(这里的问题)上随机轮换服务器“传出IP地址(源IP)”,或者为每个主机分配一个专用的“OUTGOING”IP(这不是问题)。
您可以使用SNAT规则statistic iptables模块,如下所示:
$ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP2 $ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP3 Other rules for remaining IPs ...
您可以selectrandom模式或nth模式。 10个IP为每个IP提供0.1的概率。 无需为主接口IP(IP1)添加规则,因为它默认使用。
以上规则适用于所有stream量types。 您可以根据需要将其限制为特定的协议/端口等。
(作为一个单独的答案张贴,因为它是很长的,以评论哈立德的答案)
在使用statistic模块的时候,math不在这里。 对于任何给定的数据包, p=0.1一个规则的命中为p=0.1 。 第二个规则匹配剩下的10%,所以它总体上达到了p=0.1*0.9=0.09 。 第三条规则适用于p=0.1*0.9*0.9=0.081等等。 对于九条规则,只有p=0.651的总概率,所以隐含的DROP将匹配所有分组的三分之一。 你可以自己尝试:
$ for n in `seq 9`; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode random --probability 0.1 -j ACCEPT; done $ sudo iptables -A OUTPUT --dest 10.10.10.10 -j ACCEPT $ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10 $ sudo iptables-save -c | grep 10.10.10.10 [103:8652] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [90:7560] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [74:6216] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [70:5880] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [44:3696] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [43:3612] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [50:4200] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP [380:31920] -A OUTPUT -d 10.10.10.10/32 -j DROP
你可以看到,第一条规则匹配大约10%的包,一场比赛的概率下降了,而最终的DROP得到了很多比它应该。 你可以调整你的概率,或者更容易,不使用probability模式,但是nth :
$ sudo iptables -F OUTPUT $ for n in `seq 10 -1 2`; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode nth --every $n --packet 0 -j DROP; done $ sudo iptables -A OUTPUT --dest 10.10.10.10 -j DROP $ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10 [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 10 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 9 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 8 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 7 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 6 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 5 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 4 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 3 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 2 --packet 0 -j DROP [100:8400] -A OUTPUT -d 10.10.10.10/32 -j DROP