xtables-addons: 国ごとにパッケージをフィルタリングします

xtables-addons: 国ごとにパッケージをフィルタリングします
特定の国からのトラフィックをブロックするタスクは簡単そうに見えますが、第一印象は欺かれる可能性があります。 今日はこれをどのように実装できるかを説明します。

背景

このトピックに関する Google 検索の結果は残念です。ほとんどの解決策は長い間「腐っていて」、時にはこのトピックが棚上げされ、永遠に忘れ去られているように見えることがあります。 私たちは多くの古い記録を調査し、最新バージョンの説明書を共有する準備ができています。

これらのコマンドを実行する前に、記事全体を読むことをお勧めします。

オペレーティング システムの準備

フィルタリングはユーティリティを使用して構成されます iptables、GeoIP データを操作するには拡張機能が必要です。 この拡張機能は次の場所にあります。 xtables-アドオン。 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 として知られています) がデータベースとして使用されていました。 クリエイティブ コモンズ ASA 4.0 会社 MaxMind。 この製品では、iptables 拡張機能との互換性を「壊す」という XNUMX つのイベントが同時に発生しました。

まずは2018年XNUMX月に 発表した 製品のサポート終了について、2019 年 2 月 2 日、旧バージョンのデータベースをダウンロードするためのリンクがすべて公式 Web サイトから削除されました。 新規ユーザーには、GeoLiteXNUMX 製品またはその有料バージョンの GeoIPXNUMX を使用することをお勧めします。

次に、2019 年 XNUMX 月以降、MaxMind 彼は述べました データベースへのアクセスの大幅な変更について。 カリフォルニア州消費者プライバシー法を遵守するために、MaxMind は GeoLite2 の配布を登録で「カバー」することを決定しました。

同社の製品を使用したいので、このページに登録します。

xtables-addons: 国ごとにパッケージをフィルタリングします
その後、パスワードの設定を求めるメールが届きます。 アカウントを作成したので、ライセンス キーを作成する必要があります。 あなたの個人アカウントでアイテムを見つけます 私のライセンスキーをクリックし、ボタンをクリックします。 新しいライセンスキーを生成する.

キーを作成するときに尋ねられる質問は XNUMX つだけです。このキーを GeoIP 更新プログラムで使用しますか? 否定的に答えてボタンを押します 確認します。 キーがポップアップ ウィンドウに表示されます。 ポップアップ ウィンドウを閉じるとキー全体を表示できなくなるため、このキーを安全な場所に保存してください。

xtables-addons: 国ごとにパッケージをフィルタリングします
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 つの方法のいずれかで修正できます。

  1. 治世 20_変換_ジオライト2;
  2. 治世 xt_geoip_build.

最初のケースでは、次のように削減します。 printf 必要な形式に変更し、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

作者に注意してください GeoLite2xテーブル スクリプトが本番環境に準備が整っているとはみなしておらず、 フォローする オリジナルの xt_geoip_* スクリプトの開発用。 したがって、これらのスクリプトがすでに更新されているソース コードからアセンブリに進みましょう。

ソースバージョン

ソースコードスクリプトからインストールする場合 xt_geoip_* カタログに掲載されています /usr/local/libexec/xtables-addons。 このバージョンのスクリプトはデータベースを使用します IPからカントリーライトへ。 ライセンスはクリエイティブ コモンズ表示ライセンスであり、利用可能なデータから非常に必要な 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 の新しいバージョンがパッケージ マネージャーに表示され、システム管理者の作業が大幅に簡素化されるでしょう。

xtables-addons: 国ごとにパッケージをフィルタリングします

登録ユーザーのみがアンケートに参加できます。 ログインお願いします。

国によるフィルタリングを使用したことがありますか?

  • 59,1%はい13

  • 40,9%No9

22 人のユーザーが投票しました。 3名のユーザーが棄権した。

出所: habr.com

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster