iptables,NAT:通过使用多个IP,避免限制每个IP的最大请求数

在我的networking中,有一台机器必须向超出防火墙的服务器发出http请求。

这台机器的IP地址(从防火墙之外看)可以从大约5个地址池中select。

每个ip每天可以执行最大数量的请求,之后到第二天才能再次使用; 两个请求之间的时间间隔不重要,只要没有达到每日限制

我想configuration防火墙的路由表,以便从客户机,我可以做出http请求,而不用担心它们之间的时间间隔。 我唯一的担心应该是总的每日限制(即ips *最多每个ip请求的数量)。

我尝试了这样的:

iptables -m hashlimit -m tcp -A POSTROUTING --syn --hashlimit-name x --hashlimit <MAX REQUESTS>/day -p tcp -s <CLIENT IP> -d <SERVER IP> --dports 80 --to-source <ONE OF THE IPs TO CHOOSE FROM> 

并重复五个ips的所有命令(最终的规则,进一步的连接尝试)。

但是用这个configuration我不能以突发的方式做请求。 例如,如果MAX_REQUESTS是9000,我不能在前两分钟内发出9000个请求,因为哈希限制模块处理平均值,并且一旦数据包计数超过指定的平均值就停止匹配规则。 因此,使用这个configuration我可以每9.6秒使用一次这个ip(= 86400/9000):不是我想要的。

所以我要求提供关于可能的iptables规则(或其他)的build议,这将允许我以突发方式执行请求,并保持在每日限制内。

谢谢你的时间

西尔维奥

编辑:我曾尝试使用 – --hashlimit-burst N ,但是这个参数只插入容忍的前N个数据包,即增加N个数据包,可以匹配的规则,无论平均,之后正常的条件适用。 再次,不是我想要的。

更新 :我正在使用的当前候选iptable命令是

 iptables -m hashlimit -m multiport -m tcp -A POSTROUTING -t nat --syn --hashlimit-name NAME --hashlimit MAX_REQUEST/day -p tcp -s SOURCE_IP -d DESTINATION_IP --dports 80 -j SNAT --to-source ONE_OF_THE IPs 

它仍然有上述问题(不能发送突发数据包)。

为了严格控制,我会尝试一下:

 iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn --limit MAXREQ/day -j SNAT --to-source EXT_IP1 ... 

(然后我发现你已经试过了:p)

如何使用:

 iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn -j SNAT --to-source EXT_IP_RANGE 

显然,这个变体使用了一个简单的循环algorithm – 我会尝试的。 我希望你的外部IP在一个单一的范围:)


不能让更多的请求自己失败? 鉴于你有非常具体的要求,我可能会:

  • 给规则添加一个--log
  • 编写一个守护进程,用于跟踪当天所做的服务连接数,并在FORWARD中插入一条规则,以减less与该服务的进一步连接
  • 守护进程在午夜删除该规则(如果存在)并重置其连接计数

似乎没有任何已经存在的事情来处理你想要做的事情。