介紹如何在 CentOS Linux 中判斷惡意攻擊來源 IP 位址,並設定防火牆阻擋網路攻擊封包。
若要找出目前正在攻擊系統的來源 IP 位址,最簡單的方式就是以 netstat
查看目前的網路連線。
直接查看與網頁伺服器建立連線的 IPv4 位址以及對應的連線數:
# 列出與網頁伺服器建立連線的 IPv4 與連線數 sudo netstat -ntp4 | grep nginx | grep ESTABLISHED |\ awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1 61.222.86.175 1 61.92.74.245 1 64.233.173.32 1 64.233.173.39 1 66.249.68.74 1 66.249.68.78 1 66.249.79.170 2 114.38.179.83 2 123.192.110.155 2 125.59.80.216 9 110.43.54.236
正常來說每個 IP 位址與網頁伺服器的連線數都不會超過 2,如果一個 IP 位址長時間都佔用 3 條以上的連線,就非常可疑。以這個例子來說,110.43.54.236
這一個 IP 位址就佔用了 9 條連線,如果持續幾分鐘都是這樣,就可以視為攻擊行為了。
列出 SYN_RECV
狀態的連線:
# 列出 SYN_RECV 狀態的連線 sudo netstat -ntp | grep SYN_RECV | sort -u
通常這種連線都在 5 條以下,出現太多的話就表示可能有問題。
找出有嫌疑的 IP 位址之後,再去檢查網頁伺服器或相關服務的 log 記錄檔,看看是不是有惡意攻擊行為,若發現確實是網路攻擊,則可用防火牆阻擋掉該 IP 的所有封包。
決定要阻擋的來源 IP 位址之後,就可以使用 firewall-cmd
指令搭配 --add-rich-rule
參數,新增一條防火牆規則,將來自於指定 IP 位址的所有流量擋掉:
# 惡意攻擊來源 IP 位址 IP_ADDR="110.43.54.236" # 阻擋特定來源 IP 位址 sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='${IP_ADDR}' reject"
上面的指令會將新的防火牆規則寫進設定檔中,接著還要載入設定檔才會生效:
# 重新載入防火牆規則 sudo firewall-cmd --reload
最後列出當前的防火牆規則,確認新的阻擋 IP 規則有被納入其中:
# 列出目前防火牆規則 sudo firewall-cmd --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="110.43.54.236" reject
若要解除阻擋特定來源 IP 位址,可以使用 firewall-cmd
搭配 --remove-rich-rule
參數,並指定要移除的防火牆規則:
# 要解除阻擋的來源 IP 位址 IP_ADDR="110.43.54.236" # 解除阻擋特定來源 IP 位址 sudo firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='${IP_ADDR}' reject"
移除阻擋 IP 位址的防火牆規則之後,同樣需要重新載入設定檔,並檢查當前設定值:
# 重新載入防火牆規則 sudo firewall-cmd --reload # 列出目前防火牆規則 sudo firewall-cmd --list-all
參考資料:Tecmint、Magento、G. T. Wang、凍仁的筆記