如何在 Linux 中根據國家位置來阻斷網路流量
所有的上述情形都需要設置防火牆,使之具有基於國家位置過濾流量的功能。有幾個方法可以做到這一點,其中之一是你可以使用 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive