まずはデフォルトの状態。
結構入ってます。 ディストリビューションによっては空だったりするのですが。。。
で、本題のトラフィック制御は以下のようにします。
# iptables -I INPUT -p tcp --dport 80 -m tcp -m hashlimit --hashlimit-name limit --hashlimit-upto 3666/s --hashlimit-burst 3666 -j ACCEPT
# iptables -I INPUT 2 -p tcp --dport 80 -j DROP
この2行はセットで入れる必要があります。 1行目のように「-I INPUT」で定義するとINPUTチェインの最初に定義されます。 そして「-I INPUT 2」で定義すると2番めに定義されます。 このため上の定義は以下のようになります。
- 1行目:INPUTチェイン(パケットが入ってくる時にフィルタ)で、80/tcp宛の通信は1秒間に3666パケットは許可します
- 2行目:INPUTチェイン(パケットが入ってくる時にフィルタ)で、80/tcp宛の通信はすべて破棄します
となるのです。 2行目を書かないとpolicyがACCEPTなんかだったら結局意味がないので注意してくださいね。
もう1回定義を確認すると確かにちゃんと入っていました。
ちなみに設定は「3666/s」だったはずなのに、「5000/sec」で設定されています。 これはおそらくOSの割り込みタイミングなどで都合の良いあたりに修正されているものと思いますので、これ以上は調べません。
で、5000/secは実際どれくらいかというと。。。。
5,000 パケット/秒 = 5,000 * 1,500 バイト/秒 = 5,000 * 1,500 * 8 ビット/秒
となるので(1パケット1,500バイト前提ですが)、 60Mbps ということになりますね。 でもiptablesの制御は挙動といい、なんか納得いきませんね。 後一番の問題は
インタフェース単位の設定ができないということでしょうか? サーバなど複数のインタフェースを持っている場合で特定のインタフェースだけ狙って制御したい場合は候補にすらなりません。