利用shell腳本拒絕TCP連接數大於20的IP

最近服務器頻繁遭到CC***,抓包、分析連接數後,發現單臺服務器的併發連接數達到5萬多,本想利用iptables的connlimit模塊對連接數據進行限制的,無奈我接手的這幾臺服務器都沒打此補丁,決定利用shell腳本對於一些連接數過大的IP進行屏蔽

 
vi /opt/drop_tcp.sh
 
#!/bin/sh
netstat-nat -n > /opt/netstat-net.log
file=/opt/drop_ip.log
//判斷連接數大於20的IP
/bin/awk -F: '/tcp/{a[$(NF-2)]++}END{for(i in a)if(a[i]>20)print i}' /opt/netstat-net.log > $file
drop_ip=`cat $file |awk '{print $2}'`
for iptables_ip in $drop_ip
do
//如果iptables的PREROUTING鏈中,沒有出現過這個IP,則直接用iptables丟棄所有來自這個IP地址發送的請求
        if [ $iptables_ip != $0 ] && [ -z "` iptables -nvL -t nat|grep $iptables_ip`" ];then
        /sbin/iptables -t nat -I PREROUTING -s $iptables_ip -j DROP
        fi
done
 
//定期執行此腳本
crontab -e
*/5 * * * * sh /opt/drop_tcp.sh
 
       這樣對於單IP連接數超過20的進行屏蔽
 
       爲了避免iptables規則過於臃腫,也要對已經屏蔽IP進行解封
 
vi /opt/drop_iptables.sh
 
#!/bin/sh
iptables=/opt/iptables.log
iptables-save > $iptables
drop_ip1=`cat $iptables |awk /DROP/'{print $4}'`
for iptables_ip1 in $drop_ip1
do
        /sbin/iptables -t nat -D PREROUTING -s $iptables_ip1 -j DROP
done
 
//定期執行此腳本
crontab -e
* */3 * * * sh /opt/drop_iptables.sh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章