在 Linux 中根據國家位置來阻斷惡意的請求

作為一名維護 Linux 生產服務器的系統管理員,你可能會遇到這樣一些情形:你需要根據地理位置,選擇性地阻斷或允許網絡流量通過。 例如你正經歷一次由註冊在某個特定國家的 IP 發起的 DoS 攻擊;或者基於安全考慮,你想阻止來自未知國家的 SSH 登錄請求;又或者你的公司對某些在線視頻有分銷權,它要求只能在特定的國家內合法發行;抑或是由於公司的政策,你需要阻止某個本地主機將文件上傳至任意一個非美國的遠程雲端存儲。

在 Linux 中根據國家位置來阻斷惡意的請求

圖片來自學習筆記Blog【imydl.tech】

所有的上述情形都需要設置防火牆,使之具有基於國家位置過濾流量的功能。有幾個方法可以做到這一點,其中之一是你可以使用 TCP wrappers 來為某個應用(例如 SSH,NFS, httpd)設置條件阻塞。但其缺點是你想要保護的那個應用必須以支持 TCP wrappers 的方式構建。另外,TCP wrappers 並不總是能夠在各個平臺中獲取到(例如,Arch Linux 放棄了對它的支持)。另一種方式是結合基於國家的 GeoIP 信息,設置 ipset,並將它應用到 iptables 的規則中。後一種方式看起來更有希望一些,因為基於 iptables 的過濾器是與應用無關的,且容易設置。

在本教程中,我將展示 另一個基於 iptablesGeoIP 過濾器,它由 xtables-addons

來實現。對於那些不熟悉它的人來說, xtables-addons 是用於 netfilter/iptables 的一系列擴展。一個包含在 xtables-addons 中的名為 xt_geoip 的模塊擴展了 netfilter/iptables 的功能,使得它可以根據流量來自或流向的國家來進行過濾,IP 掩蔽(NAT)或丟包。若你想使用 xt_geoip,你不必重新編譯內核或 iptables,你只需要使用當前的內核構建環境(/lib/modules/uname -r/build)以模塊的形式構建 xtables-addons。同時也不需要進行重啟。只要你構建並安裝了 xtables-addonsxt_geoip 便能夠配合 iptables 使用。

至於 xt_geoipipset 之間的比較,xtables-addons 的官方網站 上是這麼說的: 相比於

ipsetxt_geoip 在內存佔用上更勝一籌,但對於匹配速度,基於哈希的 ipset 可能更有優勢。在教程的餘下部分,我將展示如何使用 iptables/xt_geoip 來根據流量的來源地或流入的國家阻斷網絡流量。

Linux 中安裝 xtables-addons

下面介紹如何在各種 Linux 平臺中編譯和安裝 xtables-addons

為了編譯 xtables-addons,首先你需要安裝一些依賴軟件包。

DebianUbuntuLinux Mint 中安裝依賴

sudo apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config

在 CentOS,RHEL 或 Fedora 中安裝依賴

CentOS/RHEL 6 需要事先設置好 EPEL 倉庫(為 perl-Text-CSV_XS 所需要)。

sudo yum install gcc-c++ make automake kernel-devel-`uname -r` wget unzip iptables-devel perl-Text-CSV_XS

編譯並安裝 xtables-addons

xtables-addons 的官方網站 下載源碼包,然後按照下面的指令編譯安裝它。

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.10.tar.xztar xf xtables-addons-2.10.tar.xzcd xtables-addons-2.10./configuremakemake install

需要注意的是,對於基於紅帽的系統(CentOSRHELFedora),它們默認開啟了 SELinux,所以有必要像下面這樣調整 SELinux 的策略。否則,SELinux 將阻止 iptables 加載 xt_geoip 模塊。

chcon -vR --user=system_u /lib/modules/$(uname -r)/extra/*.kochcon -vR --type=lib_t /lib64/xtables/*.so

xtables-addons 安裝 GeoIP 數據庫

下一步是安裝 GeoIP 數據庫,它將被 xt_geoip 用來查詢 IP 地址與國家地區之間的對應關係。方便的是,xtables-addons的源碼包中帶有兩個幫助腳本,它們被用來從 MaxMind 下載 GeoIP 數據庫並將它轉化為 xt_geoip
可識別的二進制形式文件;它們可以在源碼包中的 geoip 目錄下找到。請遵循下面的指導來在你的系統中構建和安裝 GeoIP 數據庫。

$ cd geoip$ ./xt_geoip_dl$ ./xt_geoip_build GeoIPCountryWhois.csv$ sudo mkdir -p /usr/share/xt_geoip$ sudo cp -r {BE,LE} /usr/share/xt_geoip

根據 MaxMind 的說明,他們的 GeoIP 數據庫能夠以 99.8% 的準確率識別出 ip 所對應的國家,並且每月這個數據庫將進行更新。為了使得本地安裝的 GeoIP

數據是最新的,或許你需要設置一個按月執行的 cron job 來時常更新你本地的 GeoIP 數據庫。

阻斷來自或流向某個國家的網絡流量

一旦 xt_geoip 模塊和 GeoIP 數據庫安裝好後,你就可以在 iptabels 命令中使用 geoip 的匹配選項。

$ sudo iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

你想要阻斷流量的那些國家是使用2個字母的 ISO3166 代碼 來特別指定的(例如 US(美國)、CN(中國)、IN(印度)、FR(法國))。

例如,假如你想阻斷來自也門(YE) 和 贊比亞(ZM)的流量,下面的 iptabels 命令便可以達到此目的。

$ sudo iptables -I INPUT -m geoip --src-cc YE,ZM -j DROP

假如你想阻斷流向中國(CN) 的流量,可以運行下面的命令:

$ sudo iptables -A OUTPUT -m geoip --dst-cc CN -j DROP

匹配條件也可以通過在 --src-cc

--dst-cc 選項前加 ! 來達到相反的目的:

假如你想在你的服務器上阻斷來自所有非美國的流量,可以運行:

$ sudo iptables -I INPUT -m geoip ! --src-cc US -j DROP

對於使用 Firewall-cmd 的用戶某些發行版本例如 CentOS/RHEL7Fedora 已經用 firewalld 替代了 iptables 來作為默認的防火牆服務。在這些系統中,你可以類似使用 xt_geoip 那樣,使用 firewall-cmd 來阻斷流量。利用 firewall-cmd 命令,上面的三個例子可被重新寫為:

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip --src-cc YE,ZM -j DROP$ sudo firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -m geoip --dst-cc CN -j DROP$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip ! --src-cc US -j DROP

總結

在本教程中,我展示了使用 iptables/xt_geoip 來根據流量的來源地或流入的國家輕鬆地阻斷網絡流量。假如你有這方面的需求,把它部署到你的防火牆系統中可以使之成為一個實用的辦法。作為最後的警告,我應該提醒你的是:在你的服務器上通過基於

GeoIP 的流量過濾來禁止特定國家的流量並不總是萬無一失的。GeoIP 數據庫本身就不是很準確或齊全,且流量的來源或目的地可以輕易地通過使用 VPNTor 或其他任意易受攻擊的中繼主機來達到欺騙的目的。基於地理位置的過濾器甚至可能會阻止本不該阻止的合法網絡流量。在你決定把它部署到你的生產環境之前請仔細考慮這個限制。

相關文章: