apacheモジュールのインストール
モジュールがインストール可能か確認
dnf search mod_maxminddb
インストールされているかの確認
dnf list installed | grep mod_maxminddb
インストール
dnf install mod_maxminddb
データベースのインストール
データベースをダウンロードするには、MaxMindのサイトにアクセスして、アカウントを作る必要がある。
アカウント作成が完了したら、ログインして、GeoLite2データベースをダウンロードする。
国別のIP制限をしたいので GeoLite2 Country
を選択。
ダウンロードしたファイルをサーバーにアップロードして解凍。
tar -xvzf GeoLite2-Country.tar.gz
GeoLite2-Country.mmdbというファイルがあるので/usr/share/GeoIPに移動。
sudo mv GeoLite2-Country.mmdb /usr/share/GeoIP/
/usr/share/
は、共有データファイルやアプリケーションデータを配置するための標準的なディレクトリ。読み取り専用のデータを配置するための場所。
shareディレクトリにgeoipというディレクトリがなければ作る
sudo mkdir -p /usr/share/GeoIP
sudo chmod 755 /usr/share/GeoIP
apacheの設定
/etc/httpd/conf.d/ に maxminddb.conf というファイルができていたのでそこの記述する
<IfModule mod_maxminddb.c>
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
#MaxMindDBEnv 環境変数名 データベースパス
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
</IfModule>
# ロシア、ブラジル、北朝鮮、ウクライナ、イランを拒否
<Location "/">
SetEnvIf MM_COUNTRY_CODE ^(RU|BR|KP|UA|IR) BlockCountry
Deny from env=BlockCountry
</Location>
環境変数名(MM_COUNTRY_CODE)は揃える。$_SERVER[‘MM_COUNTRY_CODE’] で取得可能になる。
動作テスト
#110.44.113.xxx はテストしたいIPアドレス
$ curl -I -k -H "X-Forwarded-For: 110.44.113.xxx" https://example.com
HTTP/1.1 403 Forbidden が出れば拒否成功
うまく拒否してくれない場合は httpd.conf(vhost.conf) などに以下を記述
<IfModule mod_remoteip.c>
RemoteIPHeader X-Forwarded-For
</IfModule>
php用のテストコード
<html>
<head>
<style>
table { border-collapse: collapse; }
th, td{ border: 1px solid #CCC; padding: 0.3em 0.5em; font-size: 11px; font-family: Helvetica, Arial; }
th { text-align: right; background-color: #EEE; }
</style>
</head>
<body>
<table>
<?php foreach ($_SERVER as $key => $value): ?>
<!-- $_SERVER 配列 に格納されている情報のうち、キーが MM で始まるものを表示 -->
<!-- (MM_COUNTRY_CODE が表示される)-->
<?php if (substr($key, 0, 2) === 'MM'): ?>
<tr><th><?php echo $key; ?></th><td><?php echo $value; ?></td></tr>
<?php endif; ?>
<?php endforeach; ?>
</table>
</body>
</html>
設定を反映させるために再起動
sudo systemctl restart httpd
データベースの自動更新
地域の割り振られたIPアドレスの情報は常に更新されるので、データーベースも定期的に更新する必要がある。
IPv4アドレス移転履歴
データベースの更新には geoipupdate を利用する
geoipupdate がインストールされているか
dnf list installed | grep geoipupdate
インストール
sudo dnf install geoipupdate
geoipupdate がリポジトリにない場合、raven リポジトリを追加
# almalinux9用
$ sudo dnf install https://pkgs.dyn.su/el9/base/x86_64/raven-release.el9.noarch.rpm
リポジトリがインストールできたかの確認
sudo dnf repolist
GeoIP.confに以下の情報を追加
AccountID xxxx #なんらかの数字(メールアドレスではない!)
#LicenseKey YOUR_LICENSE_KEY_HERE
LicenseKey 文字列 # 公式ページにログイン後に発行が必要
EditionIDs GeoLite2-Country GeoLite2-City # 必要なデータベース名を指定
(必要であれば)
# DatabaseDirectory DATADIR #データベースの保存先(デフォルトから変更しているなら必要)
更新できるかテスト
sudo geoipupdate
ファイルを日付を見て更新できたか確認
sudo ls -l /usr/share/GeoIP
実行したらメールを受け取りたいのでシェルスクリプトに記述
geoip_update.sh
#!/bin/sh
# #!で始まる一行目の記述はインタプリタの指定
# シェルスクリプトの最初に書くおまじない
#monit の unmonitor をリフレッシュ
/usr/bin/geoipupdate
{
echo "From: GeoIP_db_Update <myshellscript@myserver.com>"
echo "To: abc@example.com"
echo "Subject:サーバーのGeoIP_db_Update"
echo
echo 表現2024サーバーがGeoIPのデータベースをアップデートした
echo "毎週月曜日にアップデートをかけている"
} | /usr/sbin/sendmail -i -t
crontabに追記
#月曜日am03:30 execution
30 3 * * 1 /var/myshellscript/geoip_update.sh
その他
MaxMindのライセンスキー取得方法はこちらが分かりやすい