如何在 Linux 中根據國家位置來阻斷網路流量

Dan Nanni發表於2016-01-14

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

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

在本教程中,我將展示 另一個基於 iptables 的 GeoIP 過濾器,它由 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-addons , xt_geoip 便能夠配合 iptables 使用。

至於 xt_geoip 和 ipset 之間的比較,xtables-addons 的官方網站 上是這麼說的: 相比於 ipset,xt_geoip 在記憶體佔用上更勝一籌,但對於匹配速度,基於雜湊的 ipset 可能更有優勢。

在教程的餘下部分,我將展示如何使用 iptables/xt_geoip 來根據流量的來源地或流入的國家阻斷網路流量

在 Linux 中安裝 xtables-addons

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

為了編譯 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

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

需要注意的是,對於基於紅帽的系統(CentOS、RHEL、Fedora),它們預設開啟了 SELinux,所以有必要像下面這樣調整 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% 的準確率識別出 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/RHEL7 或 Fedora 已經用 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 資料庫本身就不是很準確或齊全,且流量的來源或目的地可以輕易地透過使用 VPN、Tor 或其他任意易受攻擊的中繼主機來達到欺騙的目的。基於地理位置的過濾器甚至可能會阻止本不該阻止的合法網路流量。在你決定把它部署到你的生產環境之前請仔細考慮這個限制。


via: http://xmodulo.com/block-network-traffic-by-country-linux.html

作者:Dan Nanni 譯者:FSSlc 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章