----------------------------------------
一、connlimit模块
模块实现实现连接数限定
connlimit
--connlimit-above [num] :连接数限定
# iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m connlimit ! --connlimit-above 5 -j ACCEPT #默认为DROP时,表示不超过5个连接数时,允许访问
----------------------------------------
二、recent模块
模块实现限制一段时间内的连接数
利用iptables的recent模块来抵御DOS攻击,建立一个列表,保存有所有访问过指定的服务的客户端IP
示例:防御SSH暴力破解
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP # iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH # iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: " # iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
也可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
三、nf_conntrack模块
模块实现iptables访问跟踪记录
跟踪记录文件路径:/proc/net/nf_conntrack
跟踪记录数配置文件:/proc/sys/net/nf_conntrack_max
已建立连接的状态的追踪时长,默认情况下timeout 是5天(432000秒):/proc/sys/net/ipv4/netfilter/nf_conntrack_tcp_timeout_established
如果高并发应用场景下必须启用追踪,则尽可能调大nf_conntrack_max,调小nf_conntrack_tcp_timeout_established