在 Linux 上,我可以使用诸如或其他工具tc
来iptables
控制/调整网络接口上的网络流量,以达到以下目的:
- 控制网络数据包数量速率(或者总数)。
- 控制连接(发送)的 IP 地址数量。
- 控制打开的 TCP 连接的总数(每秒)。
如果是的话,该怎么做?
答案1
对于第 2 点,我没有答案(见下文)。对于第 1 点和第 3 点,您可以使用限制模块:
控制网络包数速率:
iptables -A OUTPUT -m limit --limit 10/s -j ACCEPT
控制打开的 TCP 连接总数(每秒):
iptables -A INPUT -m state -m tcp -p tcp --dport 80 --state RELATED,ESTABLISHED -m limit --limit 10/second -j ACCEPT
或者您可以使用哈希限制模块:
控制网络包数速率:
iptables -A INPUT -m hashlimit -m tcp -p tcp --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 10/sec --hashlimit-burst 2 --hashlimit-htable-expire 30000 --hashlimit-name pktlimit -j DROP
控制打开的 TCP 连接总数(每秒):
iptables -I INPUT -m hashlimit -m tcp -p tcp --dport 80 --hashlimit-above 10/sec --hashlimit-mode srcip --hashlimit-name connlimit -m state --state RELATED,ESTABLISHED -j DROP
您可以通过查看以下内容来监控 hashlimit 的运行情况:
cat /proc/net/ipt_hashlimit/pktlimit
cat /proc/net/ipt_hashlimit/connlimit
编辑:
在 NAT 占主导地位的世界中,像您想要在第 2 点中做的那样限制源 IP 地址的数量真的有意义吗?我认为限制打开的 TCP 连接的总数更有意义,如下所示:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT --reject-with tcp-reset