# shell腳本-DOS攻擊防範(自動屏蔽攻擊IP) ## 原理: #### **找出異常ip** > 通過獲取伺服器access.log日誌信息,獲取時間在每分鐘之內每個ip訪問的次數來判斷此ip是否是DOS攻擊。 > > grep $(date +%d/%b/%Y:%H:%M) 過濾得到沒分鐘 ...
shell腳本-DOS攻擊防範(自動屏蔽攻擊IP)
原理:
找出異常ip
通過獲取伺服器access.log日誌信息,獲取時間在每分鐘之內每個ip訪問的次數來判斷此ip是否是DOS攻擊。
grep $(date +%d/%b/%Y:%H:%M) 過濾得到沒分鐘之內的page被訪問的信息
awk '{a[$1]++}END{for (i in a)print i,a[i]}' 再通過awk命令過濾得到每分鐘訪問page的ip和次數
示例:
[root@localhost /]# grep $(date +%d/%b/%Y:%H:%M) /usr/local/nginx/logs/access.log | awk '{a[$1]++}END{for (i in a)print i,a[i]}' 192.168.70.1 2
再限制一下次數(例如60次)只取ip:
grep $(date +%d/%b/%Y:%H:%M) /usr/local/nginx/logs/access.log | awk '{a[$1]++}END{for (i in a)if(a[i] > 60)print i}'
屏蔽異常ip
先查看iptables中有沒有對該ip的屏蔽,如果沒有則執行屏蔽
if [
iptables -vnL | grep -c "$IP"
-eq 0 ]; then
iptables -I -s $IP -j DROP
shell腳本
#!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) LOG_FILE=/usr/local/nginx/logs/access.log ABNORMAL_IP=`tail -n5000 $LOG_FILE | grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i] > 60)print i}'` for IP in $ABNORMAL_IP; do if [ `iptables -vnL | grep -c "$IP"` -eq 0 ]; then iptables -I -s $IP -j DROP echo "$(date + '%F_%T') $IP" >> /tmp/drop_ip.log fi done
iptables命令補充說明
查看規則
iptables [參數]
- -L 表示查看當前表的所有規則,預設查看的是 filter 表,如果要查看 nat 表,可以加上 -t nat 參數。
- -n 表示不對 IP 地址進行反查,加上這個參數顯示速度將會加快。
- -v 表示輸出詳細信息,包含通過該規則的數據包數量、總位元組數以及相應的網路介面。
iptables命令語法
iptables [-t table] COMMAND [chain] MATCH -j ACTION
規則管理-COMMAND
-A, --append chain rule-specification: 追加新規則於指定鏈的尾部;
-I, --insert chain [rulenum] rule-specification : 插入新規則於指定鏈的指定位置,預設為首部;
-R, --replace chain rulenum rule-specification : 替換指定的規則為新的規則;
-D, --delete chain rulenum : 根據規則編號刪除規則,用–line-numbers查看;匹配的條件或標準-MATCHMATCH匹配條件包括通用匹配條件和擴展匹配條件
通用匹配條件
-s, --source address[/mask][,…] : 檢查報文的源IP地址是否符合此處指定的範圍,或是否等於此處給定的地址;
-d, --destination address[/mask][,…] : 檢查報文的目標IP地址是否符合此處指定的範圍,或是否等於此處給定的地址;
-p, --protocol protocol : 匹配報文中的協議,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以數字格式指明協議;
-i, --in-interface name : 限定報文僅能夠從指定的介面流入;only for packets entering the INPUT, FORWARD and PREROUTING chains.
-o, --out-interface name : 限定報文僅能夠從指定的介面流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.-j ACTION------操作動作,ACCEPT、DROP、REJECT
ACCEPT : 接受
DROP : 忽略
REJECT : 拒絕
iptables補充說明主要參考:[第二篇:CentOS7 iptables命令使用詳情_centos7查看報文_hard-cly的博客-CSDN博客](https://blog.csdn.net/weixin_47554522/article/details/120196797?ops_request_misc={"request_id"%3A"168996413216800227431683"%2C"scm"%3A"20140713.130102334.."}&request_id=168996413216800227431683&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-120196797-null-null.142v90control,239v3insert_chatgpt&utm_term=centos7 iptables命令&spm=1018.2226.3001.4187)