root 1: | _1:1_ / | \ / | \ / | \ 10: 11: 12: / \ / \ 10:1 10:2 12:1 12:2 |
この後者の規則を直接 1:1 に所属させることもできますが、 より特殊なテストはチェインの先に置く方が、効率的になります。
なお、パケットを「上向き」にフィルタすることはできません。 また HTB では、すべてのフィルタは root に所属させなければなりません。
クラス選別器の章で説明する通り、 非常に複雑な文法が利用でき、文字通りあらゆるものにマッチが可能です。 まずは、わかりやすい例から始めましょう。 幸いこれらは簡単です。
# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \ ip dport 22 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \ ip sport 80 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2 |
ここには 'eth0' またはそのインターフェースの名前が必要です。 各インターフェースは、それぞれ他と重ならないかたちで割り当てられた、 ハンドルの名前空間を保持しているからです。
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \ match ip dst 4.3.2.1/32 flowid 10:1 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \ match ip src 1.2.3.4/32 flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 \ flowid 10:2 |
これは 4.3.2.1 へのトラフィックと、1.2.3.4 からのトラフィックに 最高の優先度のキューに入れ、その他を 2 番目のキューに入れています。
マッチ条件は連結できます。1.2.3.4 のポート 80 から来たトラフィックに マッチさせるには、次のようにします。
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 \ match ip sport 80 0xffff flowid 10:1 |
ここで説明する帯域制限コマンドは、たいていこの前置きから始まっています:
# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 .. |
発信元は 'match ip sport 80 0xffff'、 送信先は 'match ip dport 0xffff'。
/etc/protocols の番号を用います。 例えば icmp は 1 ですから、'match ip protocol 1 0xff'。
# tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1 |
# iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6 |
tc フィルタの文法全部を理解するのが面倒なら、 iptables を使うことにして、fwmark による選別だけを覚えてください。
対話的な、minimum delay のトラフィックを選別するには:
# tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 \ match ip tos 0x10 0xff \ flowid 1:4 |