GeoIP2
サーバを起動させてると海外IPから良くないアクセスが大量にくるのでGeoIPを導入した話
日本IPからも来ますけどね、amazonawsとか・・・
GeoIPとは、MaxMind社が提供してるIPアドレスに関する情報を提供してくれるサービス
以前はGeoIPだったけど今はGeoIP2が主流
有料版と無料版があり、有料版がGeoIPで無料版がGeoLite
無料版もGeoLiteからGeoLite2になった
インストール
インストールって項目ですが、何を入れたかだけでインストール作業は略
と言っても標準のまま入れただけです
以前はportsにGeoIPがあったんだけど現在は無くなってしまった模様、今回入れたのは
・geoipupdate・・・名前の通りGeoIPのDBファイルのアップデートに使う
・libmaxminddb・・・GeoIPのDBファイルを読み込むのに必要なCライブラリ
・ap24-mod_maxminddb・・・apacheで使うのに必要
の3つ、最初はよくわかってなくて「p5-GeoIP2」をperl版のGeoIPかと思って
入れたけど、perlのモジュールだった
設定・使用法等
geoipupdate
アカウント登録
GeoLite2は無料で使えますが、アカウント登録が必須です
登録方法は画像付きで他のサイトで公開されてますのでそちらを参考にしてください
まぁ、メールアドレス以外は適当に入力して、選択項目は英語ですが
それっぽいのを選んでおけば問題有りません
ログインは2段階認証になってるのでメールアドレス間違えてると
ログイン出来ませんので注意してください
ログイン出来たら、左側の「Account」項目にある「Manage License Keys」をクリック
「Generate new license key」をクリックし、License key descriptionは
そのままでもいいですし分かりすいように変えてもOKです
ラジオボタンは今回はでなかったです
「Confirm」をクリックすると、IDとライセンスキーが出るのでメモしておく
geoipupdateの設定
IDとライセンスキーをゲットしたらサーバに戻り設定ファイルを編集
/usr/local/etc/GeoIP.conf の以下2行を、先ほどゲットしたIDとライセンスキーに書き換える
AccountID YOUR_ACCOUNT_ID_HERE
LicenseKey YOUR_LICENSE_KEY_HERE
EditionIDs って項目はGeoLite2-Country GeoLite2-City があればそのままでOKです
GeoLite2-ASN を追加すればASN(Autonomous System number)も取得できますが
いらないかと、必要な人は追加してください
geoipupdateの実行
初回は手動でコマンド実行、-v を付けることで動作ログがでます
# geoipupdate -v
特に問題が無ければ以下の場所にダウンロードされます
# ls -la /usr/local/share/GeoIP/
-rw-r--r-- 1 root wheel 72265340 Sep 20 14:23 GeoLite2-City.mmdb
-rw-r--r-- 1 root wheel 6233887 Sep 20 14:23 GeoLite2-Country.mmdb
geoipupdate自動更新
実行が特に問題なければ自動更新の設定をします
DBの更新頻度について英語のみの公式サイトで探すのがめんd(略)だったので、
ググってみたら週1、週2、月1と結局どれなんだーって感じでDBの更新頻度の情報が
あったのでなんとなく週1で更新するように決定
やり方はcrontabに書くだけでOKです
時間と曜日は週1と書いてあったサイトを参考にしてます
0 3 * * 4 root /usr/local/bin/geoipupdate
libmaxminddb(mmdblookup)
「libmaxminddb」の使い方というより、コマンドの実行で確認する方法となります
まとめてインストールしてしまったので多分「libmaxminddb」入れた時だと思いますが
「mmdblookup」がインストールされるのでそれを使用します
# mmdblookup --file /usr/local/share/GeoIP/GeoLite2-Country.mmdb --ip 8.8.8.8
–fileでファイルを指定して、–ipの後に確認したいIPとなります
上記のIPはGoogle Public DNSのIPで、
結構有名(覚えやすい意味でも)でこういうテストの時とかにもよく使われます(笑)
ずらずらと結果が出てきますが、countryのiso_codeをみるとUSと書いてあるので
アメリカのIPだと分かります
ap24-mod_maxminddb
apacheの設定
ホワイトリスト形式と呼ばれるやり方、日本のIPのみ許可して他は遮断する方法です
特定の国だけ遮断したいなら、ブラックリスト方式をお勧めします
apache maxminddb_module
インストール時にhttpd.confに自動で追記してくるが、ファイルの場所がおかしいので修正
httpd.conf
LoadModule maxminddb_module /usr/ports/www/mod_maxminddb/work/stage/usr/local/libexec/apache24/mod_maxminddb.so
を
LoadModule maxminddb_module libexec/apache24/mod_maxminddb.so
に変更
httpd.conf・httpd-ssl.conf
どこの国のIPかしか見てないのでCity.mmdbの行は書いてあるだけで使用して無い
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoLite2-City.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
SetEnvIf MM_COUNTRY_CODE JP AllowCountry
以下はSSLを使っているなら、httpd.confとextra/httpd-ssl.confの
Directory等のアクセス制御項目に追記
<RequireAny> Require all denied Require env AllowCountry
</RequireAny>
複数の国を許可する場合は
SetEnvIf MM_COUNTRY_CODE ^(JP|US|gb) AllowCountry
終わったら、記述に問題ないか確認後apacheのリスタート
# /usr/local/etc/rc.d/apache24 configtest
Performing sanity check on apache24 configuration:
Syntax OK
# /usr/local/etc/rc.d/apache24 restart
最後に、自分が問題なくアクセス出来るのと
アクセスログ等で、日本以外のIPが403になっているかを確認