最近の社内の新卒第1期生ブームを受けて、第ゼロ期生が本気を出し始めました。
もともと才能は一級品と言われてきた逸材です。そんな第ゼロ期生のレポートを本人了承を得た上で掲載します。トラフィック制限の話です。
iptablesのhashlimitでトラフィック制限
参考サイト
- http://c-heart.sakura.ne.jp/mt/archives/2009/10/iptables.html
- http://kfujio.blog78.fc2.com/blog-entry-72.html
設定
- 特定のIPアドレスとの通信のhashlimitを1666パケット/secに設定
(mtu = 1500の場合
1666 (packets/sec) * 1500 (byte/packets) /1024/1024 = 2.38MByte/sec
となる事を意図) - それ以外の通信については all pass
とします。
以下の例で通信相手のIPアドレスをAAA.BBB.CCC.DDDと表記します。
1. iptablesの起動/終了スクリプトを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/usr/local/bin/iptables-up.sh ------------------------------------------------------------------ #!/bin/sh iptables -F iptables -X RESTRICTED_IPADDRESS1=AAA.BBB.CCC.DDD # INPUT iptables -N FW-INPUT iptables -A FW-INPUT -i lo -j ACCEPT iptables -A FW-INPUT -p tcp -s $RESTRICTED_IPADDRESS1 -m hashlimit --hashlimit 1666/sec --hashlimit-mode srcip --hashlimit-burst 2500 --hashlimit-name prot_limit_in -j ACCEPT iptables -A FW-INPUT -p tcp -s $RESTRICTED_IPADDRESS1 -j REJECT iptables -A FW-INPUT -i eth0 -j ACCEPT # OUTPUT iptables -N FW-OUTPUT iptables -A FW-OUTPUT -i lo -j ACCEPT iptables -A FW-OUTPUT -p tcp -d $RESTRICTED_IPADDRESS1 -m hashlimit --hashlimit 1666/sec --hashlimit-mode dstip --hashlimit-burst 2500 --hashlimit-name prot_limit_out -j ACCEPT iptables -A FW-OUTPUT -p tcp -d $RESTRICTED_IPADDRESS1 -j REJECT iptables -A FW-OUTPUT -i eth0 -j ACCEPT # apply iptables -A INPUT -j FW-INPUT iptables -A FORWARD -j FW-INPUT iptables -A OUTPUT -j FW-OUTPUT ------------------------------------------------------------------ |
1 2 3 4 5 6 |
/usr/local/bin/iptables-down.sh ------------------------------------------------------------------ #!/bin/sh iptables -F iptables -X ------------------------------------------------------------------ |
参考サイト
2. 起動時にこの設定を読ませる(debian系)
1 2 3 |
# ln -s /usr/local/bin/iptables-up.sh /etc/network/if-pre-up.d/iptables-up # ln -s /usr/local/bin/iptables-down.sh /etc/network/if-post-down.d/iptables-down |
とした後で/etc/network/interfacesに
1 2 |
pre-up /etc/network/if-pre-up.d/iptables-up post-down /etc/network/if-post-down.d/iptables-down |
を追加
3. 実験
とりあえずscpで実験してみたのですが、
- 受信は大体意図通りに通信量を制限出来る
- 送信は特に制限されているようには見えない
という感じになりました。
shaperdでトラフィック制限
もう少しちゃんと通信量を制御出来、なおかつ簡単そうなものは無いかと検索してみた所、shaperd というもので簡単に制御出来ると出てきました。
参考サイト
- http://semind.github.com/blog/2012/02/24/shaperwoshi-tutepotodan-wei-dezhuan-song-liang-wozhi-xian-suru/
- http://bto.la-terre.co.jp/support/shaperd.html
設定
- 特定のIPアドレス … 送受信共にtcpについて 2000 KByte/secに制限
- その他 … 全ての通信について、6000 KByte/secに制限
とします。
1. iptablesの設定を元に戻す
前回のhashlimit用のiptablesのチェーンを削除します。
1 2 3 4 5 6 7 8 9 10 |
# iptables -F # iptables -X 自動起動の設定をしている場合は /etc/network/interfacesの ------------------------------------------------------------------ pre-up /etc/network/if-pre-up.d/iptables-up post-down /etc/network/if-post-down.d/iptables-down ------------------------------------------------------------------ を削除あるいはコメントアウト |
2. ip_queueモジュールのロード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# modprobe ip_queue 起動時に自動ロードするように /etc/modules に ip_queue を追加します。 ------------------------------------------------------------------ # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Parameters can be specified after the module name. loop ip_queue ------------------------------------------------------------------ |
3. shaperdのインストール
1 |
# apt-get install shaperd |
4. 設定ファイルの編集
/usr/share/doc/shaperd 以下にある例を見て、/etc/shaperd/shaperd.confを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
------------------------------------------------------------------ log level = error packet forwarding = ipq daemon = yes pidfile = /var/run/shaperd.pid class restricted_in { ipv4 classifier proto=tcp saddr=AAA.BBB.CCC.DDD bandwidth = 2000 kbyte/s queue limits = 1000 kb 1000 packets } class restricted_out { ipv4 classifier proto=tcp daddr=AAA.BBB.CCC.DDD bandwidth = 2000 kbyte/s queue limits = 1000 kb 1000 packets } class all { ipv4 classifier proto=all bandwidth = 6000 kbyte/s queue limits = 1000 kb 1000 packets } ------------------------------------------------------------------ |
最初、class restricted_in と class restricted_out の部分のみ書いて、class all 部分を書かなかった所、unmatched packet となってAAA.BBB.CCC.DDD以外からアクセス出来なくなってしまいました。queue limits の値は何が適当なのか不明です。
5. iptablesの設定スクリプトをコピー
debianのパッケージの場合
/etc/shaperd/up.d にiptablesのチェーンの登録スクリプト、
/etc/shaperd/down.d にiptablesのチェーンの削除スクリプト、
を置くとshaperdの起動/終了時に読み込んでくれるようです。
/usr/share/doc/shaperd/examples/ にスクリプトがあるのでこれをコピーして実行権限を付与
1 2 3 4 |
# cp /usr/share/doc/shaperd/examples/up.d /etc/shaperd # cp /usr/share/doc/shaperd/examples/down.d /etc/shaperd # chmod +x /etc/shaperd/up.d # chmod +x /etc/shaperd/down.d |
1 2 3 4 5 6 7 |
/usr/share/doc/shaperd/example/up.d ------------------------------------------------------------------ #!/bin/sh iptables -A INPUT -j QUEUE iptables -A OUTPUT -j QUEUE ------------------------------------------------------------------ |
1 2 3 4 5 6 7 |
/usr/share/doc/shaperd/example/down.d ------------------------------------------------------------------ #!/bin/sh iptables -D INPUT -j QUEUE iptables -D OUTPUT -j QUEUE ------------------------------------------------------------------ |
6. shapedの起動
- /etc/init.d/shaperd start で起動
- /etc/init.d/shaperd stop で終了
自動起動の場合は sysv-rc-conf か update-rc.dあたりで設定
7. 実験
scpで実験すると送受信共に大体設定通りに動いているようです。
起動時に
1 |
shaperd: warning: kernel's queue is too short, consider increasing /proc/sys/net/ipv4/ip_queue_maxlen {config.cpp:166} |
の警告が出るのが気になる所です。
最近のコメント