Apache Webサーバーから外国勢アクセスを締め出す。

[主題]
Apache Webサーバーのアクセス制限方法について説明したい。

[背景]
筆者は、2018年製のMacBook ProをWebサーバーマシンとして使っている。先日、OSをmacOS Sequoia 15.xからmacOS Monterey 12.xにダウングレードした。このMacにインストールしているWebサーバーはApacheである。ただし、それはOS同梱のものではなく、自前ビルドしたものである。
さて、アクセス制限を考えるようになった事の発端は、このWebサーバーに対する中国勢からの大量アクセスだった。これを排除したいと考えたが、中国に割り振られているIPアドレスは膨大で、簡単ではないと思われた。また、中国以外の拒否リストを設定する必要が出た場合、いちいち追加するのは面倒である。
そこで、日本に割り振られているIPアドレスのみアクセスを許可する事に方針転換した。中国以外の外国勢は、いわば巻き添えだが、元々プライベートな用途なので、良しとする事にした。

[環境]
参考までに、筆者の環境を記載しておく
MacBook Air 2023 15.3inch(Apple Silicon Mac, M2)
macOS Tahoe 26.0.1
Xcode 26.0.1
CommandLine Tools for Xcode 16.4.0.0.1

MacBook Pro 2018 MacBook Pro 201815.4inch(インテルMac)
macOS Monterey 12.7.6
CommandLine Tools for Xcode 14.2.0.0.1

[手順]

  1. 日本に割り振られているIPアドレスリストの入手
    以下のリンクを開き、少し下にスクロールすると、どの国のIPアドレスリストを、どのような形式でダウンロードするかを選択するフォームがある。
    国はJapanを選択、IP VersionはIPv4を選択(そのまま)、Output FormatはApache 2.4 .htaccess allowを選択してDOWNLOADボタンを押す。

    Block Visitors by Country | IP2Location

    なお、お金を出せば、ダウンロードを自動化できるようだが、筆者はお金がないのでやっていない。

  2. ファイルの解凍
    ダウンロードされるファイル(firewall.txt.gz)はGZ形式で圧縮されているので解凍する。

    gunzip ~/Downloads/firewall.txt.gz

    もちろん、Finderで開いても良いし、Safariならば、自動で解凍してくれるようだ。

  3. ファイルのコピー
    ファイル(firewall.txt)を適当な場所にコピーする。筆者はApacheの設定ファイルがある場所にコピーした。

    sudo cp -p ~/Downloads/firewall.txt /usr/local/apache2/conf/extra/
  4. httpd.confの変更
    Apacheの設定ファイルを次のように変更する。変更をdiff形式で示す。

    $ diff -u a/httpd.conf b/httpd.conf 
    --- a/httpd.conf	2025-08-29 09:56:07
    +++ b/httpd.conf	2025-11-02 18:01:06
    @@ -177,7 +177,7 @@
     </IfModule>
     #LoadModule dav_fs_module modules/mod_dav_fs.so
     #LoadModule dav_lock_module modules/mod_dav_lock.so
    -#LoadModule vhost_alias_module modules/mod_vhost_alias.so
    +LoadModule vhost_alias_module modules/mod_vhost_alias.so
     #LoadModule negotiation_module modules/mod_negotiation.so
     LoadModule dir_module modules/mod_dir.so
     #LoadModule imagemap_module modules/mod_imagemap.so
    @@ -510,7 +510,7 @@
     #Include conf/extra/httpd-info.conf
     
     # Virtual hosts
    -#Include conf/extra/httpd-vhosts.conf
    +Include conf/extra/httpd-vhosts.conf
     
     # Local access to the Apache HTTP Server Manual
     #Include conf/extra/httpd-manual.conf
    @@ -538,3 +538,4 @@
     SSLRandomSeed connect builtin
     </IfModule>
     
    +ErrorDocument 403 /404.html
    

    8,9及び17,18行目は、今回Vertual hostsを使ったための変更である。Vertual hostsを使わない場合は、httpd.confのドキュメントルート設定に直接書いても良い。
    26行目は締め出されたIPに対する偽の404ドキュメントを表示させるための設定である。(これは任意である)

  5. 偽の404ドキュメントの準備(任意)
    次の内容のHTMLファイルを作成し、Apacheのドキュメントルート(筆者の場合はhtdocs)に置く。
    この偽ドキュメントは、迷惑な訪問者に対して403を返すものの、内容は404にするという目的で設置する。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>404 Not Found</title>
    </head>
    <body>
    <h1>Not Found</h1>
    <p>The requested URL was not found on this server.</p>
    </body>
    </html>
  6. httpd-vhosts.confの変更
    筆者は、ローカル用と公開サーバー用の2つの設定を使っており、これをVirtual hostsに定義している。締め出しが必要なのは、公開サーバーの方なので、そちらの設定に以下の記述を追加する。

    $ diff -u a/extra/httpd-vhosts.conf b/extra/httpd-vhosts.conf 
    --- a/extra/httpd-vhosts.conf	2025-10-18 13:30:11
    +++ b/extra/httpd-vhosts.conf	2025-11-02 21:50:26
    @@ -22,11 +22,14 @@
     #
     <VirtualHost *:80>
         ServerAdmin webmaster@dummy-host.example.com
    -    DocumentRoot "/usr/local/apache2/docs/dummy-host.example.com"
    +    DocumentRoot "/usr/local/apache2/htdocs"
         ServerName dummy-host.example.com
         ServerAlias www.dummy-host.example.com
         ErrorLog "logs/dummy-host.example.com-error_log"
         CustomLog "logs/dummy-host.example.com-access_log" common
    +    <Directory "/usr/local/apache2/htdocs">
    +        Include /usr/local/apache2/conf/extra/firewall.txt
    +    </Directory>
     </VirtualHost>
     
     <VirtualHost *:80>
  7. Apacheの再起動
    設定変更に間違いがないか確認(1行目)後、設定変更を反映するため、apacheを再起動する。(筆者は一旦止めてからスタートしている)

    sudo apachectl configtest
    sudo apachectl stop
    sudo apachectl start

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL