
特定の国からのトラフィックをブロックするタスクは簡単そうに見えますが、第一印象は欺かれる可能性があります。 今日はこれをどのように実装できるかを説明します。
背景
このトピックに関する Google 検索の結果は残念です。ほとんどの解決策は長い間「腐っていて」、時にはこのトピックが棚上げされ、永遠に忘れ去られているように見えることがあります。 私たちは多くの古い記録を調査し、最新バージョンの説明書を共有する準備ができています。
これらのコマンドを実行する前に、記事全体を読むことをお勧めします。
オペレーティング システムの準備
フィルタリングはユーティリティを使用して構成されます iptables、GeoIP データを操作するには拡張機能が必要です。 この拡張機能は次の場所にあります。 。 xtables-addons は、iptables の拡張機能を独立したカーネル モジュールとしてインストールするため、OS カーネルを再コンパイルする必要はありません。
執筆時点での 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。 不要な拡張機能をシステムにドラッグしたくない場合は、それらをビルドから除外できます。 これを行うには、ファイルを編集する必要があります mconfig。 必要なすべてのモジュールをインストールします。 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 /モジュールOS の再起動後にモジュールが動作するようにします。 今後、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 として知られています) がデータベースとして使用されていました。 会社 。 この製品では、iptables 拡張機能との互換性を「壊す」という XNUMX つのイベントが同時に発生しました。
まずは2018年XNUMX月に 製品のサポート終了について、2019 年 2 月 2 日、旧バージョンのデータベースをダウンロードするためのリンクがすべて公式 Web サイトから削除されました。 新規ユーザーには、GeoLiteXNUMX 製品またはその有料バージョンの GeoIPXNUMX を使用することをお勧めします。
次に、2019 年 XNUMX 月以降、MaxMind データベースへのアクセスの大幅な変更について。 カリフォルニア州消費者プライバシー法を遵守するために、MaxMind は GeoLite2 の配布を登録で「カバー」することを決定しました。
同社の製品を使用したいので、このページに登録します。

その後、パスワードの設定を求めるメールが届きます。 アカウントを作成したので、ライセンス キーを作成する必要があります。 あなたの個人アカウントでアイテムを見つけます 私のライセンスキーをクリックし、ボタンをクリックします。 新しいライセンスキーを生成する.
キーを作成するときに尋ねられる質問は XNUMX つだけです。このキーを 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 日あたり XNUMX 件のダウンロード制限を課しており、サーバーの数が多い場合は、プロキシ サーバーに更新をキャッシュすることを提案しています。
出力ファイルを呼び出す必要があることに注意してください。 dbip-country-lite.csv..。 不幸にも、 20_変換_ジオライト2 完璧なファイルは生成されません。 脚本 xt_geoip_build XNUMX つの列が必要です。
- アドレス範囲の開始。
- アドレス範囲の終わり。
- iso-3166-alpha2 の国コード。
出力ファイルには XNUMX つの列が含まれています。
- アドレス範囲の開始 (文字列表現)。
- アドレス範囲の終わり (文字列表現)。
- アドレス範囲の開始 (数値表現)。
- アドレス範囲の終わり (数値表現);
- 国のコード。
- 国の名前。
この不一致は重大であり、次の XNUMX つの方法のいずれかで修正できます。
- 治世 20_変換_ジオライト2;
- 治世 xt_geoip_build.
最初のケースでは、次のように削減します。 必要な形式に変更し、XNUMX 番目で変数への割り当てを変更します。 $cc на $行->[4]。 この後、以下を構築できます。
/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_* スクリプトの開発用。 したがって、これらのスクリプトがすでに更新されているソース コードからアセンブリに進みましょう。
ソースバージョン
ソースコードスクリプトからインストールする場合 xt_geoip_* カタログに掲載されています /usr/local/libexec/xtables-addons。 このバージョンのスクリプトはデータベースを使用します 。 ライセンスはクリエイティブ コモンズ表示ライセンスであり、利用可能なデータから非常に必要な XNUMX つの列があります。 データベースをダウンロードして組み立てます。
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 追加するキーは XNUMX つだけです。
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%No9
22 人のユーザーが投票しました。 3名のユーザーが棄権した。
出所: habr.com
