Linux 防火牆實作地區性的 IP 封鎖

最近讀到一則來自 AdGuard 部落格的消息《EasyList is in trouble and so are many ad blockers》,其內容描述 EasyList 這個由社群維護的廣告過濾清單,近期曾一度因為過多的連線請求,形成就像被 DDoS 的情形而變得難以存取。而問題的來源,似乎是印度地區的某款 Android 網頁瀏覽器存在設計缺失,會以不正常的頻率反覆下載該清單,而造成嚴重的流量負載。

 

像這樣的案例,倘若技術條件可行,也許在必要時得先暫時封禁特定的地區,讓其它地區的用戶不致受到影響,直到問題的來源消弭為止。而這也讓 DR 想起自己幾年前在虛擬主機商做值班工程師的一個故事。不過在此之前,DR 得先描述一下背景,以便讓人瞭解為什麼當下似乎只能採取這種作法。

 

在這間主機商所提供的各項服務裡,Linux 虛擬主機(shared hosting)算是最主要、也是租戶數目最多的一項產品。然而比較麻煩的是,Linux 虛擬主機同時也是我們所有產品中,其背後架構最為原始、也是最不容易靈活應對事故的一項服務。它背後的 Linux 實體伺服器並沒有任何類似叢集化、高可用性、容錯移轉或者負載平衡方面的建置。而是每一部伺服器都是獨自運作的,各自供應其內數十或數百名租戶的所有服務,也就是網頁空間、FTP、SQL 資料庫、信箱及 DNS 等。

 

外寄郵件及異機備份這兩項任務,應該是這些伺服器少數會依賴其它伺服器的工作。前者在預設情況下,會統一發送給內部的郵件閘道伺服器接收再寄出;後者則會每日定期傳送資料備份到內部的檔案伺服器裡。除此之外,伺服器是完全獨自運作的,包含網路防火牆在內。這些伺服器的上游並沒有一層額外的 NAT 來制訂防火牆規則,上游層級只能做 VLAN 或 BGP 的變更,其餘的網路連線管制,都是單純透過 Linux 系統的 iptables 防火牆來實現。

 

現在回到故事本身,話說 DR 某日在值班時,發現其中一部伺服器的 Apache 網頁服務遭遇大量的連線請求,以致出現異常壅塞的情形。並且在列出詳情後,發現這些連線 IP 全部都是來自於南美洲的阿根廷。由於我們虛擬主機上的網站,絕大多數都是以中文為主的台灣本土網站,所以這顯然是一件非常詭異的事情。從 access_log 所留下的線索進一步搜查下,似乎是當地有某個很熱門的影音平台軟體,不知何故會連接我們主機上一個毫無關聯的網站,開啟裡面一個毫不相干的圖片。

 

在這樣的情況下,從 Apache 封禁請求,或者將檔案刪除是沒有作用的,因為伺服器還是得回應大量的 403 或 404 錯誤。然而儘管不曉得究竟那邊發生了什麼事,當下還是得有所反應,不能讓服務持續受到影響。於是決定得從 iptables 直接擋掉所有來自阿根廷的 IPv4 位址,而且考量到 iptables 的規則筆數不宜過多,所以得利用 iptables 的 ipset 功能。

 

具體的實作方式,首先可以從 IPdeny 網站找尋各地區的 IP 區段清單,以阿根廷來說,就是 ar-aggregated.zone。然後便開始使用 ipset 指令來設定集合。舉例來說,可以建立一個名為 ar 的集合:

  • ipset create ar nethash

 

倘若已經建立過,只是要將既有集合清單先清空的話,則可以執行:

  • ipset flush ar

 

接著便可以根據先前取得的清單,將 IP 區段逐一加入。其動作如下所示,不過這顯然應寫成腳本來批次執行會比較省事:

  • ipset add ar 24.152.57.0/24

 

可以使用以下指令來檢視集合清單:

  • ipset list ar

 

最後,使用 iptables 指令,針對 TCP 80 及 443 連接埠丟棄所有來自該集合的連線:

  • iptables -I INPUT -p tcp -m set --match-set ar src -m tcp --dport 80 -j DROP
  • iptables -I INPUT -p tcp -m set --match-set ar src -m tcp --dport 443 -j DROP

 

檢視寫入的 iptables 規則:

  • iptables -S

 

在完成了前述配置後,Apache 的負載確實整個緩解下來了。只不過那些奇特的連線請求始終不知其緣由,經一段時間的觀察也沒有消弭的跡象。考量到我們的用戶群體絕大多數以台灣本土為主,會需要從阿根廷開啟網站的需求應該非常稀少,尤其這也只是眾多伺服器的其中一部而已。所以那部伺服器的特殊封禁規則就一直維持著,也儲存到防火牆的常態性設定裡。也許即便在 DR 離職後,那些規則都依然在運作著也說不定。

 

分類: