利用linux内核防火墙防御小规模的 syn flooding

首发于http://www.linux-ch.com/post-14.html

遇到syn flooding(CC)时,很多情况下内一个ip在短时间内有可能并不会再次请求,也有可能在短时间内疯狂地发送syn请求,两个都是极端.这个时候我们可以将第一个请求丢弃,过多请求直接屏蔽ip可以取得不错的效果.脚本如下:

#!/bin/bash
modprobe ipt_recent ip_list_tot=65535 ip_pkt_list_tot=50
iptables -F
iptables -N SYN-FLOODING
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --syn -m limit --limit 1/m --limit-burst 500 -m multiport --dports 22,80,8080 -j ACCEPT
iptables -A INPUT -m tcp -p tcp --syn -m multiport --dports 22,80,8080 -j SYN-FLOODING
iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --rcheck --second 120 --hitcount 10 -j DROP
iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --update --second 120 --hitcount 1 -j ACCEPT
iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --set
iptables -A SYN-FLOODING -p tcp --syn -j DROP

iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-net-unreachable
iptables -A FORWARD -j REJECT --reject-with icmp-net-unreachable

先是修改ipt_recent的参数:
modprobe ipt_recent ip_list_tot=65535 ip_pkt_list_tot=50
记录65535个ip,然后每个ip记录50笔记录

iptables -N SYN-FLOODING
清空,建立一个SYN-FLOODING的链;重点是红色的部分内容:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --syn -m limit --limit 1/m --limit-burst 500 -m multiport --dports 22,80,8080 -j ACCEPT
当每分钟向服务器的22,80,8080三个端口发起的syn请求小于每分钟500次时,请求通过;

iptables -A INPUT -m tcp -p tcp --syn -m multiport --dports 22,80,8080 -j SYN-FLOODING
当大于500次每分钟时请求进入SYN-FLOODING链;

iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --rcheck --second 120 --hitcount 10 -j DROP
检测SYN-FLOODING数据库,如果发现在120秒内有10次或以上请求直接DROP,没有或小于则进入下一条;

iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --update --second 120 --hitcount 1 -j ACCEPT
检测SYN-FLOODING数据库,如果120秒内有1次或以上的请求通过,没有记录则进入下一条;

iptables -A SYN-FLOODING -p tcp --syn -m multiport --dports 22,80,8080 -m recent --name SYN-FLOODING --set
iptables -A SYN-FLOODING -p tcp --syn -j DROP
如果数据是第一次进入的,更新SYN-FLOODING数据库;最后丢弃该请求.

你可能感兴趣的:(syn,CC攻击,flooding,syn攻击,syn防御,cc防御)