如何在Linux上按國別阻止網絡流量?
【 51CTO.com快譯 】作為一名維護生產環境Linux服務器的系統管理員,在有些情況下,你需要根據地理位置,有選擇性地阻止或允許網絡流量。比如說,你遇到了拒絕服務攻擊,這些攻擊主要源自在某一個國家注冊的IP地址。在其他情況下,出于安全方面的原因,你又想要阻止外國來歷不明SSH登錄請求;或者貴公司對在線視頻擁有發行權,因而只可以分發給某些國家;或者由于地域限制方面的公司政策,你需要防止本地主機將文檔上傳到非美國遠程云存儲系統。
所有這些場景都需要能夠安裝一個防火墻,可以按國別對流量進行過濾。有幾種方法可以做到這一點。舉例說,你可以使用TCP包裝器(TCP wrapper),針對個別應用程序(比如SSH、NFS和httpd)設置有條件的阻止。其缺點是,你想要保護的那個應用程序在開發當初必須支持TCP包裝器。此外,TCP包裝器并非普遍出現在不同的平臺上(比如說,Arch Linux已停止對TCP包裝器的支持)。另一種辦法就是,利用基于國家的GeoIP信息來設置ipset,然后將它運用于iptables規則。后一種方法更有希望,因為基于iptables的過濾與應用程序無關,而且易于設置。
我在本教程中將介紹另一種基于iptables的GeoIP過濾機制,這種機制實施了xtables-addons。有些讀者對它還不熟悉,所以有必要先介紹一下,xtables-addons是一套面向netfilter/iptables的擴展。xtables-addons內含了一個名為xt_geoip的模塊,該模塊擴展了netfilter/iptables的功能,可以根據來源/目的地國家,過濾、NAT或管理數據包。如果你想使用xt_geoip,不需要重新編譯內核或iptables,只需要構建xtables-addons模塊,并使用當前的內核構建環境(/lib/modules/`uname -r`/build)。也不需要重啟。一旦你構建并安裝好了xtables-addons,xt_geoip立即就可以與iptables結合使用。
至于xt_geoip和ipset之間的區別,官方來源(http://xtables-addons.sourceforge.net/geoip.php)提到,xt_geoip在內存占用空間方面少于ipset。不過在匹配速度方面,基于散列的ipset可能具有優勢。
在本教程其余部分,我會演示如何使用iptables/xt_geoip,根據來源/目的地國家,阻止網絡流量。
將Xtables-addons安裝到Linux上
下面介紹如何編譯xtables-addons,并將它安裝到不同的Linux平臺上。
想構建xtables-addons,你就需要先安裝幾個依賴程序包。
·將依賴程序包安裝到Debian、Ubuntu或Linux 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
從官方網站(http://xtables-addons.sourceforge.net)下載最新的xtables-addons源代碼,然后構建/安裝它,如下所示。
$wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons -2.10.tar.xz $ tar xf xtables-addons-2.10.tar.xz $ cd xtables-addons-2.10 $ ./configure $ make $ sudo make install
請注意:如果是默認情況下已啟用SELinux的基于紅帽的系統(CentOS、RHEL、Fedora),有必要調整SELinux策略,如下所示。要不然,SELinux會阻止iptables裝入xt_geoip模塊。
$ sudo chcon -vR --user=system_u /lib/modules/$(uname -r)/extra/*.ko $ sudo chcon -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%,數據庫更每月都更新。為了確保本地安裝的GeoIP數據庫內容最新,你就需要設置每月執行的計劃任務,以便每月更新一次本地GeoIP數據庫。
阻止來自或發往某個國家的網絡流量
一旦xt_geoip模塊和GeoIP數據庫都已安裝好,你就可以立即使用iptables命令中的geoip匹配選項。
$ sudo iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
你想要阻止的國家使用兩個字母ISO3166代碼來指定,比如說US(美國)、CN(中國)、IN(印度)和FR(法國)。
比如說,如果你想阻止來自也門(YE)和贊比亞(ZM)的入站流量,下面這個iptables命令就能實現。
$ 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/RHEL 7或Fedora這一些發行版已將iptables換成firewalld,作為默認防火墻服務器。在這類系統上,你同樣可以利用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數據庫天生就不準確/不完整,如果使用V*N、Tor或任何受到危及的中繼主機,就很容易欺騙來源/目的地國家。基于地域的過濾甚至會阻止本不該被禁止的合法流量。明白這個局限性后,再決定將它部署到你的生產環境中也不遲。
原文標題:How to block network traffic by country on Linux,作者:Dan Nanni
【51CTO.com獨家譯文,合作站點轉載請注明出處】