12.5. IPv6 トラフィックのフィルタリング

12.5.1. なぜ IPv6 では tc フィルタが動かないのか

Linux カーネルでは、 経路ポリシーデータベース (Routing Policy Database: RPDB) が IPv4 のルーティング・アドレッシング構造を置き換え、 この HOWTO で説明している素晴らしい機能の源となっています。 残念ながら、Linux での IPv6 構造は、コアの構造の外側で実装されています。 共有している機能もあるのですが、基本的には RPDB の構造は、 IPv6 のルーティング・アドレッシング構造とは別々なのです。

この状況はもちろん変わるでしょう。少々待てば良いだけです。

FIXME: 既に作業している人がいれば、何かアイデアは? 計画は?

12.5.2. IPv6 パケットに ip6tables で印を付ける

ipv6tables はパケットに印を付け、数値を割り当てることができます。

# ip6tables -A PREROUTING -i eth0 -t mangle -p tcp -j MARK --mark 1

しかしこうしても、このパケットは RPDB 構造には渡されないので、 役に立ちません。

12.5.3. u32 選別器を使って IPv6 パケットにマッチさせる

IPv6 は通常 SIT トンネルにカプセルされて IPv4 ネットワークを輸送されます。 このようなトンネルの設定については、IPv6 トンネリングの節を参照してください。 この場合、IPv6 パケットをペイロードに持つ IPv4 パケットに対して、 フィルタを適用することが可能です。

次のフィルタは、IPv6 をカプセルした IPv4 パケットすべてにマッチします。

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
            match ip protocol 41 0xff flowid 42:42

この方向ですすめましょう。IPv6 パケットが IPv4 経由で送信されたとし、 これらのパケットには何のオプションもセットされていないとします。 次のフィルタを用いると、オプションのない、 IPv4 中の IPv6 中の ICMPv6 にマッチします。 0x3a (58) は ICMPv6 の next ヘッダタイプです。

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
           match ip protocol 41 0xff \
           match u8 0x05 0x0f at 0 \
           match u8 0x3a 0xff at 26 \
           flowid 42:42

送信先 IPv6 アドレスにマッチさせるには、もう少々作業が必要です。 次のフィルタは送信先アドレスが 3ffe:202c:ffff:32:230:4fff:fe08:358d: である場合にマッチします。

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
            match ip protocol 41 0xff \
            match u8 0x05 0x0f at 0 \
            match u8 0x3f 0xff at 44 \
            match u8 0xfe 0xff at 45 \
            match u8 0x20 0xff at 46 \
            match u8 0x2c 0xff at 47 \
            match u8 0xff 0xff at 48 \
            match u8 0xff 0xff at 49 \
            match u8 0x00 0xff at 50 \
            match u8 0x32 0xff at 51 \
            match u8 0x02 0xff at 52 \
            match u8 0x30 0xff at 53 \
            match u8 0x4f 0xff at 54 \
            match u8 0xff 0xff at 55 \
            match u8 0xfe 0xff at 56 \
            match u8 0x08 0xff at 57 \
            match u8 0x35 0xff at 58 \
            match u8 0x8d 0xff at 59 \
            flowid 10:13

同じテクニックはサブネットへのマッチにも使えます。 例えば 2001:: の場合は次のようになります。

# tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
            match ip protocol 41 0xff \
            match u8 0x05 0x0f at 0 \
            match u8 0x20 0xff at 28 \
            match u8 0x01 0xff at 29 \
            flowid 10:13