いっつもやり方を忘れてググるのだが、ストレートにやりたいことを記載したページがなく、断片的な情報から組み立てるのに時間がかかってしょうがないので備忘録。そもそもtcについてちゃんと理解してないので覚えられないんだろうが、勉強はおいおい。
ちなみにtcのフィルタで直接指定する方法もあるけど、iptablesの方が慣れてるし分かりやすいよね、ってことでこっちのやり方が好き。
192.168.0.1宛のicmpだけ20%のパケロスを発生させる
フローの指定はiptablesでマッチ条件が書けるものなら何でもよい。一例として記載したパターンを示す。
# まずキューを作成する
# ...のだが、のっけから意味わかってなくておまじない状態
tc qdisc add dev veth105 root handle 1: prio bands 9 priomap 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
# ロス20%のキューを作成する
tc qdisc add dev veth105 parent 1:2 handle 20: netem loss 20%
# ^^^ (1) ^^^ (2)
# (1) このキューのclass id? 次にフィルタを作成する時に指定するので、この値は重要
# (2) なんぞこれ。handle id? とりあえず被らないようにしておこう(^ω^)
# フィルタを作成してロス20%のキューに入るパケットを定義する
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 2 fw flowid 1:2
# ^ (3) ^^^ (4)
# (3) iptablesでmarkする際の番号を指定する。この番号がマークされたパケットが次で指定するキューに入る
# (4) 割り当てる先のキューのclass idを指定。先ほど作成したキューの(1)と合わせる!
# iptablesでmarkのルールを作る
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.1 -o veth105 -j MAKR --set-mark 2
# ^ (5)
# (5) markする番号。(3)と合わせる!
# やめたいときは、キューを削除すればフィルタごとまるっと消える
tc qdisc del dev veth105
# iptablesのルールを消すのも忘れずに
iptables -t mangle -F
これでとりあえずOK!!
応用
netemの部分を書き換えてあげれば、遅延や帯域制限等好きに使える。netemで出来る内容は以下に丁寧に記載されているので、そちらを参照。
色々なnetemのキューを作ってフロー毎に割り当てたいときは、上に書いたマッチングの部分に注意して複数ルールを記載してやればよい。
# おまじない(^ω^)
tc qdisc add dev veth105 root handle 1: prio bands 9 priomap 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
# いろんなキューを作成する
tc qdisc add dev veth105 parent 1:3 handle 30: netem loss 40%
tc qdisc add dev veth105 parent 1:4 handle 40: netem delay 1234ms
tc qdisc add dev veth105 parent 1:5 handle 50: netem delay 1000ms 50ms 25% duplicate 30% loss 30% 25%
# ^^^ これ
# キューとmarkのマッチング
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 3 fw flowid 1:3
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 4 fw flowid 1:4
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 5 fw flowid 1:5
# ^ コレ ^^^ これ
# フロー毎にmarkを変える
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.3 -o veth105 -j MAKR --set-mark 3
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.4 -o veth105 -j MAKR --set-mark 4
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.5 -o veth105 -j MAKR --set-mark 5
# ^ コレ
ちなみにフローを限定する必要がなければ直接デバイスにnetemをかけると楽ちん。めんどくさい時はこっちで。ただdelayとかlostとか入れるとsshも引きずられて大変なことになる。
tc qdisc add dev veth100 root netem loss 20%
netem超便利。nagiosの検証はかどる。