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 と組み合わせます