本篇紀錄我的伺服器關閉 Linux 的 ICMP 功能,避免封包洪流 Ping Flood 攻擊的過程。
最近發現我的 Linode VPS 伺服器有異常的流量,檢查後發現是有人蓄意以密集的 ICMP 封包攻擊伺服器,也就是用常見的 Ping 一直送封包過來的意思,因為最近真的很忙,所以也不想做太多處理,索性直接關掉 Linux 的 ICMP 功能,把這些浪費網路資源的流量擋掉,以下是處理過程與紀錄。
再看一下整個月的流量圖,很明顯就可以看出這幾天的流量有異常增加。
登入伺服器,用 iftop
看了一下,發現是一個台灣的 IP 一直有大量的網路流量。
用 tcpdump
看一下網路封包的狀況:
tcpdump -i eth0 host 112.104.32.195
從 tcpdump
的輸出可以看出,我們的伺服器與這台機器之間傳送的資料,全部都是 ICMP 的封包。接著使用 tcpdump
抓一個 ICMP 的網路封包下來看一下:
tcpdump -nnvXSs 0 -c1 icmp
封包的類型屬於 echo request,這個狀況看起來大概就是用 Ping 一直送大量的封包給伺服器,試圖癱瘓伺服器的網路,所以我乾脆直接把伺服器的 ICMP 功能關掉(反正平常也很少會用到它):
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
關掉之後,用 iftop
再看一下,流量瞬間下降很多,往外的 ICMP echo reply 完全沒有了,只剩下少量來自於這台主機的 ICMP echo request 流量:
而伺服器的流量也恢復到比較正常的狀態,不過雖然系統直接忽略 ICMP 的封包、不予回應,但是在 Linode 的流量上面依然看得到少量流入的封包流量(也就是攻擊者發出的 ICMP echo request 網路封包):
過了幾個小時之後,攻擊者關閉了發送封包的程式,所以流量又往下降了一次,這次就真的恢復正常了:
若要永久關閉 ICMP,則在 /etc/sysctl.conf
中加入:
# Disable ICMP net.ipv4.icmp_echo_ignore_all=1
若要立即讓系統根據設定檔更新目前的設定,可以執行:
system -p
若要從防火牆擋掉 ICMP 的封包,可以參考以下指令:
# 新增過濾 ICMP 封包請求 firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply # 新增過濾 ICMP 封包回應 firewall-cmd --permanent --zone=public --add-icmp-block=echo-request # 清除過濾 ICMP 封包請求 firewall-cmd --permanent --zone=public --remove-icmp-block=echo-reply # 清除過濾 ICMP 封包回應 firewall-cmd --permanent --zone=public --remove-icmp-block=echo-request # 重新載入防火牆規則 firewall-cmd --reload # 查看 public 區域永久的防火牆設定 firewall-cmd --permanent --zone=public --list-all
依據《刑法》第 360 條規定:「無故以『電腦程式』或其他電磁方式干擾他人電腦或其相關設備,致生損害於公眾或他人者,處三年以下有期徒刑、拘役或科或併科十萬元以下罰金。」。簡單來說,使用「分散式阻斷攻擊」(DDoS)或「封包洪流」(Ping Flood)等手法,攻擊網站伺服器,雖未入侵他人電腦,但靠程式發送大量封包,以達癱瘓特定網站之目的,也足以構成此項犯罪。
所以只要在自己的伺服器上面,用 tcpdump
把攻擊的封包直接儲存下來,就是最直接、且明確的犯罪證據:
tcpdump -i eth0 host 112.104.32.195 -w output.pcap
若要讀取儲存下來的 pcap 封包檔案,可以使用 tcpdump
的 -r
指令:
tcpdump -r output.pcap
若要報案的話,直接去警察局做筆錄即可,這種案件警察受理之後應該會轉給偵九隊,接著就會去 ISP(例如中華電信或遠傳)依據 IP 位址調閱那個犯罪嫌疑人的資料。
另外我發現現在警察局還有網路報案的服務,可以直接上傳檔案,我想下次如果還遇到這樣的狀況,我就乾脆把封包都錄起來,直接去報案網頁上傳這些封包當作證物,跟大家分享警方偵辦案件的過程。