我們將學習如何使用 GeoIP 數據庫和 linux iptables 來阻止來自特定國家 IP 的流量。 iptables 是一個基於命令的實用程序,用於配置在 Netfilter 項目中實現的 linux 內核防火牆。 而 GeoIP 是與地理位置對應的 IP 集合,其中地理位置與分配在那些特定組織、城市、州和國家的 IP 地址映射。 GeoIP 數據庫中的地理坐標通常靠近人口中心,因此不應用於識別特定地址或家庭。 在一個名為 xt_geoip 的模塊的幫助下,該模塊包含一個 iptables 擴展 xtables-addon 和 GeoIP 數據庫,我們將執行基於國家/地區的流量過濾,這有助於我們阻止或允許來自特定國家/地區的流量。
升級和安裝依賴
首先,我們需要升級我們的 linux 系統,然後我們將繼續安裝 xtables-addons 所需的依賴項。 為此,我們將針對我們機器中運行的發行版運行以下命令。
基於 Debian 的系統(Debian、Ubuntu、Linux Mint)
# apt-get update && apt-get upgrade # apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config
基於 RedHat 的系統(CentOS、RHEL、 Fedora)
# yum update # yum install gcc-c++ make automake kernel-devel-`uname -r` wget unzip iptables-devel perl-Text-CSV_XS
安裝 Xtables 插件
一旦我們的系統升級並安裝了依賴項,我們現在將在我們的機器中安裝 xtables-addons。 為此,我們將從以下位置下載最新的 tarball 官方 xtables-addons 項目網站 使用 wget。 下載後,我們將解壓縮 tarball,然後編譯並將其安裝到我們的機器上。
# wget https://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
# tar xf xtables-addons-2.13.tar.xz
# cd xtables-addons-2.13
# ./configure
# make
# make install
允許 SeLinux 加載模塊(基於 RedHat 的系統)
作為基於 RedHat 的 linux 發行版,即 CentOS、RHEL、 Fedora 默認情況下啟用了 selinux,我們需要如下調整 selinux 策略。 否則,SeLinux 將阻止 iptables 加載 xt_geoip 模塊。
# chcon -vR --user=system_u /lib/modules/$(uname -r)/extra/*.ko
# chcon -vR --type=lib_t /lib64/xtables/*.so
安裝 GeoIP 數據庫
接下來,我們將運行一個名為 xt_geoip 的模塊,該模塊帶有 xtables-addons 擴展,它從以下位置下載 GeoIP 數據庫 思維導圖 並將其轉換為 xt_geoip 識別的二進制形式。 下載後,我們將構建它並將它們移動到所需的 xt_geoip 路徑,即 /usr/share/xt_geoip/ 。
# cd geoip
# ./xt_geoip_dl
# ./xt_geoip_build GeoIPCountryWhois.csv
# mkdir -p /usr/share/xt_geoip/
# cp -r {BE,LE} /usr/share/xt_geoip/
阻止進出某個國家/地區的流量
如果一切按預期進行,我們現在應該能夠使用我們的防火牆實用程序 iptables 來使用 geoip 模塊。
使用 iptables
這是將 iptables 與 geoip 模塊一起使用以阻止來自或發往某個國家/地區的流量的基本語法。 在這裡,我們需要使用 兩個字母的 ISO3166 代碼 代替國家,例如,US 代表美國,IE 代表愛爾蘭,IN 代表印度,CN 代表中國等等。
# iptables -m geoip –src-cc 國家[,country…] –dst-cc 國家[,country…]
現在,如果我們想阻止來自印度 (IN) 和美國 (US) 的傳入流量,則應該使用以下 iptables 命令。 # iptables -I INPUT -m geoip –src-cc IN,US -j DROP
如果我們想阻止我們服務器上所有傳入的非美國流量,我們需要執行以下操作。 # iptables -I INPUT -m geoip ! –src-cc 美國 -j DROP
這是我嘗試從非美國網絡 ping 到服務器時截取的屏幕截圖。 我沒有收到來自 ping 的任何回复。 由於 iptables 配置已應用於運行時且未保存,因此在我重新啟動服務器後,我收到了來自服務器的 ping 回复。
如果我們想阻止發往印度 (IN) 的傳出流量,我們需要運行以下命令。 # iptables -A OUTPUT -m geoip –dst-cc IN -j DROP
使用防火牆
如果我們正在運行基於 systemd 的系統並且我們有 firewalld 作為 iptables 的前端控制器,我們也可以分別使用 firewalld 來完成上述工作。
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip --src-cc IN,UN -j DROP
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m geoip ! --src-cc US -j DROP
# firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -m geoip --dst-cc IN -j DROP
帶有 GeoIP 模塊的 iptables 對於防止來自某些國家的 DOS、DDOS 攻擊非常重要。 當您想限制從某個國家/地區訪問您的特定網站/服務器時,這也非常有效。 因此,必須通過 iptables-addons 安裝 GeoIP 模塊,才能允許或限制某些國家/地區。 因此,如果您有任何問題、建議、反饋,請將它們寫在下面的評論框中。 謝謝 ! 享受 :-)