2023年8月10日 星期四

用 iptables 對付惡意幫派網頁爬蟲

前一陣子查看了一下我的 apache 伺服器的 access.log, 發現竟然有成群結隊 (來自同一網段) 的惡意網頁爬蟲在輪流攻擊, 用 fail2ban 逐一擋根本對他們太客氣了, 甚至不一定擋得到。 於是改成連坐處分, 直接用 iptables 永久封鎖整個網段, log 檔變得安靜多了。

請下載、 解壓縮 access.mal.log.gz。 這是我某一天的 log 檔。 一如以往, 以下大量使用 perl-compatible regular expressions

  1. 先查看每一分鐘的流量: perl -ne 'print "$1 $2:$3\n" if m#\[(\d\d)/[A-Z][a-z][a-z]/2023:(\d\d):(\d\d):#' access.mal.log | uniq -c | less 大部分時候, 每分鐘的瀏覽數是個位數字; 有些時段突然持續好幾分鐘爆大量, 顯然 是主力在出貨 有問題。
  2. 查看 18:50 左右的記錄, 有很多 "深層目錄" 的 "瀏覽" 行為, 像這樣: "GET /ckhung/index.php/a/b/re/b/phy/b/b/svg/z/z/b/phy/b/%3C?%3E/i/fdl.html/ HTTP/1.1" 果然跟從前遇過的 收割機騷擾 一樣, 只是我架新的伺服器就忘記設定了 (^_^;) 沒關係, 這次我會更凶狠 😠
  3. 撈出所有 "深層目錄" 的爬蟲行為: perl -ne 'print("$1\n") if m#GET\s+((/\S*){8,})#' access.mal.log
  4. 列出上述行為的 IP 網段, 統計每個網段出現的攻擊次數, 排序: perl -ne 'print("$1\n") if m#(\S+)\.\d+\s.*?GET\s+((/\S*){8,})#' access.mal.log | sort | uniq -c | sort -n
  5. 最頻繁的八組攻擊次數都在兩百次以上... 但是且慢! 這是每個網段的攻擊次數
  6. 我想統計的應該是 每個網段參與攻擊的 IP 個數perl -ne 'print("$1\n") if m#((\d+\.){3}\d+)\s.*?GET\s+((/\S*){8,})#' access.mal.log | sort | uniq | perl -pe 's/\.\d+$//' | uniq -c | sort -n
  7. 這個網段: 66.249.66.* 有 13 個 IP 參與攻擊, 那就 ban 它了: iptables -A INPUT -s 66.249.66.0/24 -j DROP
  8. iptables -S 可以看到目前的 iptables 規則。
  9. 再來要 把規則變成常設的, 即使重開機後也不能忘記: apt install iptables-persistent 安裝過程中會把目前的規則寫入 /etc/iptables/rules.v4 。 但如果你有在用 ufw 之類的防火牆的話, 就不能安裝這個了, 用 apt show ufw 會看到它 "Breaks: iptables-persistent, netfilter-persistent"
  10. 但是有一些是 fail2ban 設定的暫時規則: iptables -S | grep 'f2b-.*/32' 編輯 /etc/iptables/rules.v4 , 把這些暫時規則刪掉, 然後重新載入 iptables、 重新啟動 fail2ban: iptables-restore < /etc/iptables/rules.v4 ; systemctl restart fail2ban

以上只是在門口就把惡意的網域一口氣 ban 掉, 減輕 fail2ban 的負擔。 其他零散的惡意網址, 還是需要用 fail2ban 個別阻擋。

隔一陣子要再檢查一下 access.log, 用相同的方式檢查看看有沒有新的惡意網段。 也要看看剩下的流量裡面, 是不是還有不同類型的大量惡意爬蟲行為。 像我的另一個 log 檔裡面有很多在 php 網址後面 加上一大串 %%20echo%%20 或 %%252525 之類的奇怪攻擊, 所以用相同的方法、 不同的比對字串, 另外又 ban 了一些網域。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。