2026年5月19日

2026年5月19日

Apacheのmod_limitipconnで1つのIPからの同時接続数を制限する方法

mod_limitipconn は、1つの IP アドレスから Apache への同時接続数に上限を設けるモジュールです。大きなファイルの配布ページで、ダウンロード支援ツールが何十本も同時に接続して帯域や処理枠を占有する、といった状況を抑えるのに向いています。

Apache 本体に含まれる標準モジュールではなく、David Jao 氏が配布している追加モジュールです。2026年11月時点の最新版は 0.25 で、Apache 2.4 と 2.2 での動作が確認されていると配布ページに書かれています。Debian 13 の公式リポジトリと EPEL 9 にはパッケージが見当たらなかったため、この記事ではソースからビルドします。手順は Debian 13(Apache 2.4)で動作を確かめています。

なお、作者の説明にもあるとおり、このモジュールは DoS 攻撃を防ぐためのものではありません。多数の IP アドレスから来る攻撃には効かないので、目的が攻撃対策なら後半の「ほかの方法との使い分け」も参照してください。

仕組みと前提条件

mod_limitipconn は、Apache のスコアボード(各ワーカーが今どのクライアントを処理しているかの一覧)を見て、同じ IP アドレスからの処理中の接続を数えます。上限を超えたリクエストには 503 Service Unavailable を返します。

スコアボードにクライアントの情報を記録させるため、次の2点が必要です。

  • mod_status が読み込まれていること
  • ExtendedStatus On になっていること(Apache 2.4 では mod_status を読み込むと既定で On になりますが、意図を明確にするため設定に書いておくと安全です)

Debian/Ubuntu では mod_status は既定で有効です。sudo apache2ctl -M | grep status で status_module が出るか確認してください。

ビルドしてインストールする

ビルドには Apache の開発用パッケージに含まれる apxs が必要です。Debian/Ubuntu では次のように入れます。

sudo apt update
sudo apt install apache2-dev build-essential bzip2 curl

RHEL 系では httpd-devel と gcc に apxs とコンパイラが含まれます。

配布ページからソースを取得して展開し、apxs でビルドとインストールを行います。

cd /usr/local/src
sudo curl -LO https://dominia.org/djao/limit/mod_limitipconn-0.25.tar.bz2
sudo tar xjf mod_limitipconn-0.25.tar.bz2
cd mod_limitipconn-0.25
sudo apxs -c -i -a -n limitipconn mod_limitipconn.c

-i はモジュールを Apache のモジュールディレクトリへコピーし、-a は読み込みの設定を追加します。Debian/Ubuntu では /etc/apache2/mods-available/limitipconn.load が作られ、そのまま有効化されます。読み込まれたかは次で確かめます。

sudo apache2ctl -M | grep limitipconn

limitipconn_module (shared) と表示されれば準備完了です。Apache を更新した後は、モジュールを同じ手順でビルドし直す必要がある場合があります。

同時接続数の上限を設定する

使えるディレクティブは次の3つです。

ディレクティブ 意味
MaxConnPerIP 数 1つの IP アドレスからの同時接続数の上限。0 は無制限
NoIPLimit MIMEタイプ… 指定した MIME タイプを数えない(例 image/*)
OnlyIPLimit MIMEタイプ… 指定した MIME タイプだけを数える

Debian/Ubuntu では設定ファイルを conf-available に作ります。次は /downloads 以下だけ、1つの IP からの同時接続を 2 本までにし、画像は数えない例です。

sudo nano /etc/apache2/conf-available/limitipconn.conf
ExtendedStatus On

<IfModule mod_limitipconn.c>
    <Location /downloads>
        MaxConnPerIP 2
        NoIPLimit image/*
    </Location>
</IfModule>

動画や音声だけを制限したい場合は、NoIPLimit の代わりに OnlyIPLimit audio/mpeg video のように書きます。

設定を有効にし、構文を確かめてから再起動します。

sudo a2enconf limitipconn
sudo apache2ctl configtest
sudo systemctl restart apache2

サーバー全体の上限と場所ごとの上限

<Location> の外に MaxConnPerIP 10 のように書くと、サーバー全体の上限になります。注意したいのは、サーバー全体の上限と <Location> ごとの上限は別々に計算される点です。たとえば全体を 10、/downloads を 3 にして /downloads で NoIPLimit image/* を指定しても、画像の同時リクエストが 11 本目になった時点で全体の上限に引っかかります。場所ごとに上書きしたい場合は、全体の上限を <Location /> の中に書き、その内側に個別の <Location> を入れ子にします。

画像や CSS、JavaScript を多く読み込むページでは、ブラウザが同時に何本も接続します。サイト全体に小さな上限をかけると通常の閲覧が 503 になるので、ダウンロード用のパスに絞るか、NoIPLimit で静的ファイルを外してください。

動作を確かめる

大きめのテストファイルを置き、帯域を絞った curl を同時に4本走らせます。上限を 2 にしていれば、3本目以降が 503 になります。

sudo mkdir -p /var/www/html/downloads
sudo head -c 5000000 /dev/zero | sudo tee /var/www/html/downloads/big.bin > /dev/null

for i in 1 2 3 4; do
  curl -s -o /dev/null --limit-rate 200k -w "req$i %{http_code}\n" http://127.0.0.1/downloads/big.bin &
  sleep 0.3
done
wait

結果の例です(3本目と4本目がすぐ 503 で返り、1本目と2本目は約25秒でダウンロードが終わってから 200 が表示されます)。

req3 503
req4 503
req1 200
req2 200

確認が終わったらテストファイルを削除します。実際の運用では、アクセスログで 503 の件数を見て、上限が厳しすぎないかを確かめます。

sudo rm /var/www/html/downloads/big.bin
sudo awk '$9 == 503' /var/log/apache2/access.log | tail

運用上の注意

  • 拒否したアクセスの記録: 上限で拒否したリクエストには、環境変数 LIMITIP が 1 で設定されます。CustomLog ${APACHE_LOG_DIR}/access.log combined env=!LIMITIP のように書くと、拒否分をアクセスログから外せます。
  • プロキシやロードバランサーの配下: そのままでは、すべてのクライアントがプロキシの IP アドレスとして数えられ、全員が同じ上限を共有してしまいます。Apache 2.4 標準の mod_remoteip で X-Forwarded-For から本来の IP を復元してください。RemoteIPTrustedProxy には信頼できるプロキシのアドレスだけを書きます。
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.10
  • 同じ IP を共有する利用者: 会社や学校、携帯回線では多くの利用者が1つの IP アドレスを共有します。上限を小さくしすぎると、正当な利用者が 503 を受けます。
  • IP ごとに違う上限は付けられない: すべての IP アドレスに同じ上限がかかります。
  • mod_cache との組み合わせ: mod_cache のように quick handler で応答するモジュールと併用する場合、<Location> などの場所ごとの設定は効かず、サーバー全体の設定だけが使えます。

ほかの方法との使い分け

目的 使うもの
1つの IP からの同時接続(同時ダウンロード)を抑える mod_limitipconn
1つの接続あたりの転送速度を抑える 標準の mod_ratelimit(Apacheで帯域幅を制限する方法)
短時間に大量のリクエストを送る IP を一時的に遮断する mod_evasive(mod_evasiveでDDoS対策をする方法)
接続数・リクエスト数をより細かく制御する mod_qos(mod_qosの設定方法)

多数の IP アドレスから来る攻撃は、Apache のモジュールだけでは受け止めきれません。CDN や WAF、上流のファイアウォールでの対策を組み合わせてください。

まとめ

  • mod_limitipconn は標準外のモジュールで、apxs -c -i -a -n limitipconn mod_limitipconn.c でビルドして有効にします
  • mod_status と ExtendedStatus On が前提です
  • MaxConnPerIP で上限を決め、NoIPLimit/OnlyIPLimit で数える対象を MIME タイプで絞ります
  • 上限を超えたリクエストには 503 が返ります。プロキシ配下では mod_remoteip で本来の IP を使います
  • 攻撃対策が目的なら、mod_evasive や mod_qos、CDN・WAF と組み合わせます

お気軽にご相談ください

お見積りへ お問い合わせへ
▲