iptables限制每个IP的连接

时间:2020-01-09 10:41:04  来源:igfitidea点击:

如何使用iptables限制单个IP地址到服务器的端口80和25使用的连接数?
您需要使用connlimit模块,该模块允许您限制每个客户端IP地址(或地址块)与服务器的并行TCP连接数。

语法

语法如下:

/sbin/iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset
# save the changes see iptables-save man page, the following is redhat and friends specific command
service iptables save

示例:限制每个IP /主机的SSH连接

每个客户端主机仅允许3个ssg连接:

/sbin/iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# save the changes see iptables-save man page, the following is redhat and friends specific command
service iptables save

示例:限制每个IP /主机的HTTP连接

每个IP仅允许20个http连接(在httpd.conf中将MaxClients设置为60):

警告!请注意,大型代理服务器可能会合法地与您的服务器建立大量连接。
您可以使用!语法

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
# save the changes see iptables-save man page, the following is redhat and friends specific command
service iptables save

从这种限制中跳过代理服务器IP 1.2.3.4:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -d ! 1.2.3.4 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

示例:C类限制

在此示例中,将并行http请求限制为每个C类大小的网络20个(24位网络掩码)

/sbin/iptables  -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT --reject-with tcp-reset
# save the changes see iptables-save man page
service iptables save

示例:每秒限制连接

如果IP在100秒内对端口80进行了10次以上的连接尝试,则以下示例将丢弃传入连接(将规则添加到iptables shell脚本中)

#!/bin/bash
IPT=/sbin/iptables 
# Max connection in seconds
SECONDS=100
# Max connections per IP
BLOCKCOUNT=10
# ....
# ..
# default action can be DROP or REJECT
DACTION="DROP"
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j ${DACTION}
# ....
# ..

如何测试防火墙正常工作?

使用以下shell程序脚本连接到托管在192.1.2.3上的Web服务器:

#!/bin/bash
ip="192.1.2.3"
port="80"
for i in {1..100} 
do
  # do nothing just connect and exit
  echo "exit" | nc ${ip} ${port};
done