記一次與自動論壇發帖機的鬥爭

來源:互聯網
上載者:User

幫朋友維護他那個網站的伺服器,最近突然流量大漲,伺服器壓力也陡增。上去看了一下nginx日誌,有大量的POST某幾個特定php請求,一個IP一秒鐘就POST四五個。基本都是什麼reg.php,login.php,article_add.php這一類的。明顯是一群裝了自動發帖機的肉雞或者個人機在進行攻擊。

說好聽點,也就是發點廣告貼,說不好了,掛點木馬什麼的也是難說的。雖然說這個網站的論壇和背景php已經沒有那些註冊發貼機可以利用的漏洞了,完全是白刷,但是也相當的消耗系統資源和頻寬。每次請求也都會轉到後端去調用mysql什麼的。正常訪問都巨慢,本來流量就有限,不帶這麼玩的。

伺服器是我給裝的FreeBSD,非常穩定,也編譯了核心載入了ipfw,比較好辦。不過一開始太小看這幫孫子了,嘗試手工封鎖,過濾出IP以後,手工運行ipfw封ip,結果搞了一個多小時,還是沒完沒了的,就乾脆寫兩個指令碼來幹這事,放到crontab裡面自動跑。

指令碼一:過濾自動發貼IP -- tail.sh

 
  1. #!/bin/sh 
  2.  
  3. tail -F /var/log/nginx-access.log | grep -E "/member/article_add.php|/member/login.php|/include/vdimgck.php" | awk '{print $1}' | grep -v your_admin_ip >> /usr/local/etc/nginx/ipfw.rules.tmp & 

詳細解說一下,tail -F 是不斷的滾動日誌,-F代表無論日誌是否rotate,都滾動這個檔案名稱。跟-f是有區別的。然後grep正則匹配多個過濾條件,然後用awk列印ip,然後去掉你自己的遠端管理ip,追加輸出給一個叫ipfw.rules.tmp的臨時檔案。

指令碼一執行一次即可,無需重複執行。

 

指令碼二:註冊機IP去重,放入ipfw指令碼中 -- ipfw.sh

 

 
  1. #!/bin/sh 
  2. cat /usr/local/etc/nginx/ipfw.rules.tmp | sort -u > /usr/local/etc/nginx/ipfw.rules 
  3.  
  4. ipfw -f flush 
  5.  
  6. ipfw add 00100 allow ip from any to any via lo0 
  7. ipfw add 00200 deny ip from any to 127.0.0.0/8 
  8. ipfw add 00300 deny ip from 127.0.0.0/8 to any 
  9. ipfw add 00400 deny ip from any to ::1 
  10. ipfw add 00500 deny ip from ::1 to any 
  11. ipfw add 00600 allow ipv6-icmp from :: to ff02::/16 
  12. ipfw add 00700 allow ipv6-icmp from fe80::/10 to fe80::/10 
  13. ipfw add 00800 allow ipv6-icmp from fe80::/10 to ff02::/16 
  14. ipfw add 00900 allow ipv6-icmp from any to any ip6 icmp6types 1 
  15. ipfw add 01000 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 
  16.  
  17. ipfw add 10010 deny udp from any to any 80 
  18.  
  19. seq=10100 
  20. for i in $(cat /usr/local/etc/nginx/ipfw.rules); do 
  21.         ipfw add $seq deny all from $i to any 80 
  22.         seq=$(($seq+1)) 
  23. done 

逐行解釋一下

02. 將指令碼一產生的臨時檔案排序去重後放入新的檔案中將第二行替換成下面這行就是封鎖C類的IP位址區段了)

 
  1. cat /usr/local/etc/nginx/ipfw.rules.tmp | awk -F'.' '{print $1"."$2"."$3".0/24"}' | sort -u > /usr/local/etc/nginx/ipfw.rules 

04. 強制移除所有ipfw規則

06-15. ipfw原有預設規則。04行刪除了,要重新補回去。

17. 拒絕80連接埠udp串連,就是所謂的阿拉丁DDoS攻擊

19. 規則序號,從10100開始

20. 迴圈去重後的ip地址清單

21. ipfw添加到規則$seq序號,拒絕所有來自$i到任意的80連接埠串連

22. 序號累加。

ipfw可以在一個規則序號裡添加多個ip,之所以做了序號累加,主要是ipfw在刪除某個規則時,是按照規則序號刪除,不是按照ip刪除。都放在一個裡面,一刪就全刪了。如果有哪個特定ip需要訪問網站,只要刪除對應的單個序號就好了。

指令碼放入crontab裡面,每12小時運行一次,其實我手工運行了幾次,2個多小時,已經封鎖了將近300個ip了,以福建莆田的ip最多,其次是廈門,泉州,福州的IP。其他各省也有一些,但是很少。

 

上Google查了一下,福建的莆田,廈門,泉州是全國垃圾郵件和垃圾文章最大的集散地。看到這三個地方的IP,直接封IP段就對了,27.159.0.0/16,就這樣封,不用留面子。

 

熟悉iptables,把指令碼改成iptables,就可以用在linux下面了。

這些論壇自動註冊發貼機實在是討厭的要死。

還有個注意事項,tail的內容,可以直接列印在螢幕上,但是往磁碟上寫是有緩衝的,也就是系統輸入輸出的buffer,這個buffer要累積達到16k才會往磁碟上寫入並flush掉。所以,如果攻擊ip很少的話,一開始建立的臨時檔案並不會馬上接收到內容,需要等一會才可以。

 

本文出自 “實踐檢驗真理” 部落格,轉載請與作者聯絡!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.