阻止來自某些國家/地區的流量的任務看似簡單,但第一印象可能具有欺騙性。 今天我們將告訴您如何實現這一點。
底
關於這個主題的谷歌搜尋結果令人失望:大多數解決方案早已“腐爛”,有時似乎這個主題已被永遠擱置並被遺忘。 我們梳理了許多舊記錄,並準備分享現代版本的說明。
我們建議您在執行這些命令之前閱讀整篇文章。
操作系統準備
將使用該實用程式配置過濾 iptables的,這需要擴充才能處理 GeoIP 資料。 該擴展可以在以下位置找到
在撰寫本文時,xtables-addons 的當前版本是 3.9。 但是,在標準 Ubuntu 20.04 LTS 儲存庫中只能找到 3.8,而在 Ubuntu 18.04 儲存庫中只能找到 3.0。 您可以使用以下命令從套件管理器安裝擴充功能:
apt install xtables-addons-common libtext-csv-xs-perl
請注意,3.9 版本和專案目前狀態之間存在微小但重要的差異,我們將在稍後討論。 要從原始碼構建,請安裝所有必需的軟體包:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl
克隆儲存庫:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
xtables-addons 包含許多擴展,但我們只感興趣 xt_geoip。 如果您不想將不必要的擴充功能拖曳到系統中,可以將它們從建置中排除。 為此,您需要編輯該文件 配置文件。 對於所有需要的模組,安裝 y,並標記所有不需要的 n。 我們收集:
./autogen.sh
./configure
make
並以超級使用者權限安裝:
make install
在安裝核心模組的過程中,可能會出現類似如下的錯誤:
INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory
這種情況的出現是由於無法簽署內核模組,因為沒有什麼好簽署的。 您可以透過幾個命令解決這個問題:
cd /lib/modules/(uname -r)/build/certs
cat <<EOF > x509.genkey
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
CN = Modules
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF
openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem
已編譯的核心模組已安裝,但係統未偵測到。 讓我們要求系統建立一個考慮到新模組的依賴關係圖,然後載入它:
depmod -a
modprobe xt_geoip
讓我們確保 xt_geoip 已載入到系統中:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tables
此外,請確保擴充功能已載入到 iptables 中:
# cat /proc/net/ip_tables_matches
geoip
icmp
我們對一切都很滿意,剩下的就是將模組名稱添加到 / etc /模塊以便模組在重新啟動作業系統後可以工作。 從現在開始,iptables 可以理解 geoip 命令,但它沒有足夠的資料可以使用。 讓我們開始載入 geoip 資料庫。
取得 GeoIP 資料庫
我們建立一個目錄,其中將儲存 iptables 擴充功能可以理解的資訊:
mkdir /usr/share/xt_geoip
在文章開頭,我們提到來自原始程式碼的版本和來自套件管理器的版本之間存在差異。 最明顯的區別是資料庫供應商和腳本的變化 xt_geoip_dl,下載最新數據。
套件管理器版本
腳本位於路徑 /usr/lib/xtables-addons 中,但是當您嘗試執行它時,您將看到一個資訊不多的錯誤:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.
此前,GeoLite 產品(現稱為 GeoLite Legacy)經許可分發,並被用作資料庫
首先是2018年XNUMX月
其次,自2019年XNUMX月起MaxMind
由於我們想使用他們的產品,因此我們將在此頁面上註冊。
然後您將收到一封電子郵件,要求您設定密碼。 現在我們已經建立了一個帳戶,我們需要建立一個許可證金鑰。 在您的個人帳戶中我們找到該項目 我的許可證密鑰,然後按一下按鈕 產生新的許可證密鑰.
建立金鑰時,我們只會被問到一個問題:我們會在 GeoIP 更新程式中使用此金鑰嗎? 我們給予否定的回答並按下按鈕 確認。 該密鑰將顯示在彈出視窗中。 將此密鑰保存在安全的地方,因為一旦關閉彈出窗口,您將無法再查看整個密鑰。
我們可以手動下載 GeoLite2 資料庫,但其格式與 xt_geoip_build 腳本所需的格式不相容。 這就是 GeoLite2xtables 腳本可以發揮作用的地方。 若要執行腳本,請安裝 NetAddr::IP perl 模組:
wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz
tar xvf NetAddr-IP-4.079.tar.gz
cd NetAddr-IP-4.079
perl Makefile.PL
make
make install
接下來,我們使用腳本克隆儲存庫,並將先前獲得的許可證密鑰寫入檔案:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
讓我們運行腳本:
# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv
MaxMind 限制每天 2000 次下載,並且擁有大量伺服器,並提供在代理伺服器上快取更新的功能。
請注意,輸出檔案必須被調用 dbip-國家/地區-lite.csv... 很遺憾, 20_convert_geolite2 不會產生完美的文件。 腳本 xt_geoip_build 預計三列:
- 地址範圍的開始;
- 地址範圍結束;
- iso-3166-alpha2 中的國家代碼。
輸出檔包含六列:
- 地址範圍的開始(字串表示);
- 位址範圍結束(字串表示);
- 地址範圍的開始(數字表示);
- 地址範圍結束(數字表示);
- 國家代碼;
- 國家的名稱。
這種差異至關重要,可以透過以下兩種方式之一進行糾正:
- 編輯 20_convert_geolite2;
- 編輯 xt_geoip_build.
在第一種情況下,我們減少
/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip
. . .
2239 IPv4 ranges for ZA
348 IPv6 ranges for ZA
56 IPv4 ranges for ZM
12 IPv6 ranges for ZM
56 IPv4 ranges for ZW
15 IPv6 ranges for ZW
請注意,作者
原始碼版本
從原始碼腳本安裝時 xt_geoip_* 位於目錄中 /usr/local/libexec/xtables-addons。 此版本的腳本使用資料庫
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
完成這些步驟後,iptables 就可以開始工作了。
在 iptables 中使用 geoip
模 xt_geoip 僅添加兩個鍵:
geoip match options:
[!] --src-cc, --source-country country[,country...]
Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
Match packet going to (one of) the specified country(ies)
NOTE: The country is inputed by its ISO3166 code.
一般來說,為 iptables 建立規則的方法保持不變。 若要使用其他模組中的按鍵,您必須使用 -m 開關明確指定模組的名稱。 例如,在所有介面上封鎖連接埠 443 上非來自美國的傳入 TCP 連線的規則:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
xt_geoip_build 建立的檔案僅在建立規則時使用,但在過濾時不考慮。 因此,要正確更新 geoip 資料庫,必須先更新 iv* 文件,然後在 iptables 中重新建立所有使用 geoip 的規則。
結論
根據國家過濾資料包是一種被時間遺忘的策略。 儘管如此,用於此類過濾的軟體工具正在開發中,也許很快帶有新 geoip 資料提供者的新版本 xt_geoip 將出現在套件管理器中,這將大大簡化系統管理員的工作。
只有註冊用戶才能參與調查。
您曾經使用過按國家/地區過濾嗎?
-
企業排放佔全球 59,1%是13
-
企業排放佔全球 40,9%9號
22 位用戶投票。 3 名用戶棄權。
來源: www.habr.com