在我的网络中,有一台机器必须向防火墙之外的服务器发出 http 请求。
该机器的 IP 地址(从防火墙之外看到)可以从大约 5 个地址池中选择。
每个ip每天可以执行的请求次数是有上限的,超过上限就不能再使用,直到第二天;两次请求之间的时间间隔无所谓,只要不超过每日限制即可。
我想配置防火墙的路由表,这样我就可以从客户端机器发出 http 请求,而不必担心它们之间的时间间隔。我唯一关心的应该是每日总限制(即 ip 数量 * 每个 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>
并对所有五个 IP 重复该命令(最终规则是丢弃进一步的连接尝试)。
但是使用此配置,我无法突发请求。例如,如果 MAX_REQUESTS 为 9000,我无法在前两分钟内发出 9000 个请求,因为 hashlimit 模块处理的是平均值,并且一旦数据包数量超过指定的平均值,就会停止匹配规则。因此,使用此配置,我只能每 9.6 秒(=86400/9000)使用该 IP 一次:这不是我想要的。
因此,我正在寻求有关可能的 iptables 规则(或其他内容)的建议,该规则将允许我突发地执行请求并保持在每日限制之内。
谢谢你的时间
西尔维奥
编辑:我尝试过使用--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
它仍然存在上述问题(无法突发地发送数据包)。
答案1
为了严格控制,我会尝试以下方法:
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
显然,该变体使用了一种简单的循环算法 - 我会尝试一下。我希望您的外部 IP 位于一个范围内 :)
不能让其他请求自行失败吗?鉴于您有非常具体的要求,我可能会:
--log
在规则中添加- 编写一个守护进程,跟踪当天建立的服务连接数,并在 FORWARD 中插入一条规则,以丢弃与该服务的进一步连接
- 让守护进程在午夜删除该规则(如果存在)并重置其连接数
似乎尚无任何现有的东西可以准确处理您想要做的事情。