xtables-addons:国でパケットをフィルタリング



特定の国からのトラフィックをブロックするタスクは単純に見えますが、第一印象は欺くことです。今日は、これを実装する方法を説明します。



バックグラウンド



このトピックに関するGoogleの検索結果は動揺しています。ほとんどのソリューションは長い間「腐敗」しており、このトピックは棚上げされ、永遠に忘れられているように見えることがあります。私たちは多くの古い記録を調べ、最新版の指示を共有する準備ができています。

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

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



フィルタリングは、GeoIPデータを処理するための拡張機能を必要とするiptablesユーティリティを使用して構成されます。このような拡張機能は、xtables-addonsにあります。xtables-addonsはiptables拡張機能をスタンドアロンカーネルモジュールとしてインストールするため、OSカーネルを再コンパイルする必要はありません。



この記事の執筆時点では、xtables-addonsの現在のバージョンは3.9です。ただし、標準のUbuntu 20.04 LTSリポジトリには3.8しかなく、Ubuntu18.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 / modulesに追加して、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.


以前は、データベースは、MaxMindによってCreative Commons ASA4.0ライセンスの下で配布されたGeoLite製品(現在はGeoLite Legacyとして知られています)を使用していましたこの製品では、2つのイベントが同時に発生し、iptablesの拡張機能との互換性が「損なわれました」。



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



第二に、2019年12月以来、MaxMindは発表しましたデータベースへのアクセスの大幅な変更について。カリフォルニアの消費者保護法に準拠するために、MaxMindは登録によってGeoLite2の配布を「カバー」することを決定しました。



彼らの製品を使いたいので、このページで登録します。





その後、パスワードの設定を求めるメッセージがメールに届きます。アカウントを作成したので、ライセンスキーを作成する必要があります。個人アカウントで、[マイライセンスキー]の項目を見つけて、[新しいライセンスキーの生成]ボタンをクリックします



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





GeoLite2データベースを手動でダウンロードする機能はありますが、それらの形式はxt_geoip_buildスクリプトで期待される形式と互換性がありません。これがGeoLite2xtablesスクリプトの出番です。スクリプトを機能させるには、NetAddr :: IPperlモジュールをインストールします。



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は、1日あたり2000ダウンロードの制限を課しており、サーバーの数が多い場合は、プロキシサーバーに更新をキャッシュすることを提案します。
出力ファイルの名前はdbip-country-lite.csvである必要があることに注意してください残念ながら、20_convert_geolite2は完全なファイルを生成しません。xt_geoip_buildスクリプトは、次の3つの列を想定しています。



  • アドレス範囲の始まり。
  • アドレス範囲の終わり。
  • iso-3166-alpha2の国コード。


また、出力ファイルには6つの列が含まれています。



  • アドレス範囲の開始(文字列表現);
  • アドレス範囲の終わり(文字列表現);
  • アドレス範囲の開始(数値);
  • アドレス範囲の終わり(数値);
  • 国のコード;
  • 国の名前。


この不一致は重大であり、次の2つの方法のいずれかで修正できます。



  1. 20_convert_geolite2を編集します;
  2. xt_geoip_buildを編集します


最初のケースでは、我々短縮printfの所望のフォーマットへ、そして第二に、我々は、の割り当て変更$ 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


GeoLite2xtablesの作成 者は、自分のスクリプト本番環境の準備ができているとは考えておらず、元のxt_geoip_ *スクリプトの開発に従うことを提案していることに注意してくださいしたがって、これらのスクリプトがすでに更新されているソースからのビルドに移りましょう。



ソースバージョン



ソースからインストールする場合、xt_geoip_の*のスクリプトがされているに位置は/ usr / local / libexecに/ xtables-アドオンディレクトリこのバージョンのスクリプトは、IP to CountryLiteデータベース使用しますライセンス-CreativeCommons Attribution License、および入手可能なデータから、これらは最も必要な3つの列です。データベースをダウンロードして収集します。



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 モジュールは、次の2つのキーのみを追加します。



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接続をすべてのインターフェイスでUS以外からブロックするルール:



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がパッケージマネージャーに表示され、システム管理者の作業が大幅に簡素化されます。






All Articles