Limit模块
作用:限速,控制流量
例: iptables -A INPUT -m limit --limit 3/hour
--limit-burst 默认值为5
如果处于半开放状态的连接绑定服务器上的资源,则可能通过向服务器大量发送SYN消息来占用所有这些资源。Syn flood是常见的攻击,可以通过以下iptables规则进行阻挡:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
所有进入的连接是允许的,直到达到极限:
-limit 1/s:以秒为单位的最大平均匹配率
-limit-burst 3:要匹配的包的最大初始数量
举例1:限制 ssh连接数
iptables -I INPUT -p tcp -s 0/0 -d $SERVER_IP --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 11 -j DROP
iptables -A OUTPUT -p tcp -s $SERVER_IP -d 0/0 --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT
假设您需要限制到ssh服务器(端口22)的传入连接在10分钟内不超过10个连接:
举例2:防范DoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
上面的iptables规则将帮助您防止拒绝服务(DoS)攻击您的web服务器。
在上面的例子中:
-m limit:它使用limit iptables扩展名
–limit 25/minute:这限制了每分钟最多25个连接。根据您的具体需求更改此值
-limit-burst 100:这个值表示只有当连接总数达到了limit-burst级别时才会执行limit/min。
connlimit模块
作用:用于限制每一个客户端IP的并发连接数
参数 :-connlimit-above n #限制并发个数
例:iptables -I INPUT -p tcp -syn -dport 80 -m connlimit -connlimit-above 100 -j REJECT
举例3:限制每个IP /主机的SSH连接
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
每个客户端主机只允许3个ssh连接:
举例4:限制每个IP /主机的HTTP连接
iptables -A INPUT -p tcp --syn --dport 80 -d ! 1.2.3.4 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
#请注意,大型代理服务器可能会合法地创建大量到您的服务器的连接,跳过代理服务器IP 1.2.3.4这种限制
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
#每个IP只允许20个http连接
脚本例子:限制每秒连接数
如果IP在100秒内尝试了10次以上的80端口连接(将规则添加到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脚本连接到202.1.2.3托管的web服务器:
#!/bin/bash
ip="202.1.2.3"
port="80"
for i in {1..100}
do
# do nothing just connect and exit
echo "exit" | nc ${ip} ${port}; #使用nc建立端口连接,而且传给服务端exit
done
nc命令是一个功能强大的网络工具,通过它不仅可以探测端口,还能作为客户端连接服务。