2009年10月27日火曜日

iptablesを用いた帯域制御

たまには技術的な記事でも。

何らかの理由で帯域制御(トラフィックシェーピング)をしたい場合。
Catalystなどのスイッチで制御することも可能ですが、Linuxならiptablesのhashlimitを使うという方法があります。
(limitでも同じことができますが、hashlimitの方が接続元・先のIPやポート番号ごとに個別のシェーピングをかけることができるなど、細かな制御が行えます)

たとえば、LinuxサーバへのTCPパケットの入力を40Mbpsに制限したい場合は以下のようなルールをチェーンに追加します。

iptables -A INPUT -j ACCEPT -p tcp -m hashlimit --hashlimit 3333/sec --hashlimit-mode dstip --hashlimit-burst 3333 --hashlimit-name 40Mbps
iptables -A INPUT -j REJECT -p tcp

3333pps × 1500 × 8 = 約40Mbps です。

--hashlimit で単位時間あたり通過を許可するパケット数を、--hashlimit-burst でバーストリミットを指定します。
--hashlimit-burst のサイズを --hashlimit で指定したサイズかそれ以上にしておかないと、バースト通信時にパケットを受け入れるバケツのサイズが不足し、指定した通信速度が出ないので注意。
なお、--hashlimit で /sec を指定する場合、割り込みタイミングとの兼ね合いなのか厳密な値を指定することができないようです。
(3333/sec の上は 5000/sec。その上は 10000/sec に自動的に合わせられてしまいます)

なお、hashlimitのそのほかのオプションの詳細についてはこちらをご覧ください。

0 件のコメント:

コメントを投稿