Web サーバーで許可される同時接続数に制限を設けたいと考えました。filter
テーブルの下の INPUT チェーンにデフォルトの DROP ポリシーを適用した iptables (v1.4.19.1) カーネル 3.14.4-200.fc20.x86_64 で次のルールを試しました。
-A INPUT -p tcp --dport 80 -m connlimit --connlimit-upto 10 -j WEB
-A WEB -j ACCEPT
次に、Apache ベンチマークを使用して、50 の同時接続でサーバーにアクセスしました。
$ ab -kc 50 -t 10 http://mysite.com/
しかし、サーバーのアクセス ログを見ると、成功したリクエストが数百行残っています。connlimit
ルールが作動してすべての接続が切断されることを期待しています。ルールまたは同時接続の解釈に何か問題があるのでしょうか?
答え1
多くのテストを経て、デフォルトのドロップポリシーだけでは不十分であることがわかりました。
*filter
-F
-X
:INPUT DROP [0:0]
ルールが守られると想定しないことが非常に重要です。connlimit
ルールは、あなたが明示的にチェーンの最後にドロップルールを追加します。
-A INPUT -j DROP
指定された制限よりも低い同時実行数でも動作するようになりました。
$ ab -kc 7 -t 6 http://mysite.com/
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking mysite.com (be patient)
apr_pollset_poll: The timeout specified has expired (70007)
重要なのはテストすることです。ただし、これをバグとして分類するかどうかはわかりません。