GeoIPで特定の海外IPをブロックする

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アドレス移転履歴

IPv4アドレス移転履歴 - JPNIC

データベースの更新には 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のライセンスキー取得方法はこちらが分かりやすい

タイトルとURLをコピーしました