IPv6ブリッジ機能付きルーター (ブルータ) を使えば、 NAT 内の LAN でそのまま IPv6 を使えるわけで、 IPv6 の敷居は一気に下がる。
つまり、ほとんどの OS がすでに IPv6 をサポートしているので、 ルータが IPv6 を素通し (ブリッジ) しさえすれば、 LAN 内で IPv6 を意識せずに使える。
今まで通り IP を (NAT 経由したプライベートアドレスで) 使いながら、IPv6 のオイシイところ (end-to-end 通信ができる) だけを ツマミ食いできるわけで、 今度こそ (^^;) IPv6 が普及するのではないかと...
Linux でブルータを実現するには、 まずブリッジ機能をカーネルに組み込んでおく。
# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.00022Axxxxxx no eth0
eth1
このままだと IP までブリッジしてしまうので、 IP に対してはルータとして機能し、 IPv6 に対してだけブリッジさせるために、ebtables を使う。
# ebtables -t broute -L Bridge table: broute Bridge chain: BROUTING, entries: 3, policy: DROP …… (3) -j mark --set-mark 0x0 --mark-target CONTINUE …… (0) -p IPv6 -i eth0 -j mark --set-mark 0x600 …… (1) -p IPv6 -i eth1 -j mark --set-mark 0x601 …… (2)
上記設定の意味は、
(0) まず全パケットに対し 0x0 のマークをつける。
で、
(1) eth0 から入ってきた (LAN内から外へ出ていく)
IPv6 パケットは、0x600 のマークをつけてブリッジする。
(2) 逆に eth1 から入ってきた (外から入ってきた)
IPv6 パケットは、0x601 のマークをつけてブリッジする。
(3) それ以外 (IP パケットや PPPoE パケット) はブリッジしない (DROP)
つまり IP に対してはルータとして機能する
さらに ip6tables を使ってフィルタリングする。
ip6tables -P FORWARD DROP …… (*) ip6tables -I FORWARD -j incoming -m mark --mark 0x601/0xffff …… (2) ip6tables -I FORWARD -j ACCEPT -m mark --mark 0x600/0xffff …… (1)
(1) 0x600 のマークがついているパケットは、素通し (ACCEPT) する。 (2) 0x601 のマークがついているパケットは、incoming チェインへ渡す。 incoming チェインで ACCEPT されなかったパケットは、 (*) FORWARD チェインのポリシーに従って、DROP される。
ebtables でマーク付して ip6tables でそのマークに基づいて フィルタリングするという、 まわりくどい方法をとっているのは、 ebtables はあくまで L2 のフィルタなので IPv6 アドレスに基づいたフィルタリングができず、 逆に ip6tables は L3 のフィルタなので eth0/eth1 はまとめてブリッジインタフェース br0 としてしか見えず、 どちらの物理インタフェースから入ってきたパケットか 判別できないため。
ちなみに iptables だと、 L3 フィルタといいながら physdev モジュールがあるので、 ブリッジのどちら側から入ってきたか判別できたりする。 ip6tables の機能拡張に期待したいところ。