如何在 Linux 中根據國家位置來阻斷網路流量
作為一名維護 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
相關文章
- 根據IP獲取國家
- 根據IP獲取國家省市
- 如何在 Linux 下統計高速網路中的流量Linux
- JavaScript字串物件 之 根據字元返回位置、根據位置返回字元、字串操作方法JavaScript字串物件字元
- 根據IP定位地理位置
- 美國國家安全域性監控全球1.6%網際網路流量
- 請教java中如何根據ip判斷另一臺機器在網路中是通的Java
- 網路安全,要靠國家買單才有未來
- 如何在Excel中根據數量生成抽獎名單Excel
- 網際網路女皇:流量排名前十公司有四家來自中國
- js根據IP地址判斷城市JS
- 在 Linux 核心中診斷網路流量異常問題Linux
- SQL 如何在時間序列中根據欄位變化分組SQL
- 如何在列表,字典,集合中根據條件篩選資料
- FreeBSD根據Windows網路設定Samba(轉)WindowsSamba
- Windows 根據埠號,找出檔案安裝位置Windows
- Chitika:iPad 2網路流量佔據美國iPad流量60%iPad
- 資料庫防火牆的阻斷方式:行為阻斷或者Session阻斷資料庫防火牆Session
- php根據地理座標獲取國家、省份、城市,及周邊資料類PHP
- 在Linux中,如何實時監控網路流量?Linux
- js根據ip地址獲取城市地理位置JS
- 百度地圖:根據位置獲取座標地圖
- Linux 中 根據SRA號獲取下載連結Linux
- Sql Server2008如何在儲存過程中實現根據判斷插入更新資料SQLServer儲存過程
- Linux網路流量安全審計Linux
- 網傳美國關閉根伺服器分分鐘掐斷中國網路?專家:無稽之談伺服器
- 網路安全威脅國家安全
- linux 下根據埠kill 程式Linux
- Linux 初學者:如何在 Ubuntu 中重啟網路LinuxUbuntu
- laravel 中根據請求路徑、方法匹配路由例項Laravel路由
- 如何在 Linux 中擴充套件 XFS 根分割槽Linux套件
- 根據軌跡分析出使用者家在哪
- 根據使用者來獲取渠道
- 11個國家同時斷網,這個鍋運維來背剛剛好?運維
- jQuery根據滾動條位置載入相應的內容jQuery
- 根據dom物件或其id獲取物件位置的程式碼物件
- 如何根據網站訪問量計算出所需要的頻寬或流量大小網站
- 英國國家醫療服務體系陷入中斷!因服務提供商遭受網路攻擊