アーカイブ

2012 年 7 月 のアーカイブ

Debianなマシンで IPv6 bridge

2012 年 7 月 19 日 コメントはありません

すでにだいぶ経ってますが、ここにメモってなかったので駄文。

引っ越してフレッツ光ネクストに切り替えたんでフレッツ光ネクスト上で提供されているIPv6接続サービスが利用できるようになりました。接続形態にはIPv4 と同じような PPPoE を使った接続と IPoE 接続 (とか書くとなんのこっちゃだけどネイティブ方式と呼ばれてた要は Etherでそのままつながってます方式)があるわけですが、余計なもの(PPPoEのトンネル)がはさまらない分 IPoE の方がレイテンシなどで有利なわけで、当然こっちを選択して接続しました。ISPにはIIJmioのFiberAccess/NFを選択。

なお、IPoEでの接続に関しては「ひかり電話を契約しているかどうか」によってネットワーク側の挙動が少し変わってきます。ここの説明が非常に詳しくてわかりやすいので興味がある方は見てみましょう。

さて、hanzubon.jp NOCにはひかり電話は導入されていません。ということで、ここの説明にあるように RAで取得した64bit長のprefixを使ってネットワークを構成することになります、RAを受け取ってごにょごにょして再広告するようなことをしてもいいんですが面倒だし特にメリットもないように思うのでRAをそのまま中でも受け取って動くようにIPv6ブリッジを作ってみることにしました(ひかり電話契約がある場合は、上記の記事で説明があるようにIPv6ルータを用意した方が楽しいように思います)。

仙石さんの昔の記事が大変参考になります。というか、ここに解説されてる通りに設定すれば(おおむね) OK です(わら ただし、ここの記事の最後に記述がありますが、現在ではすでにip6tablesにもphysdevモジュールが実装されてますので、ここでやっているようなebtablesでマークしてもげもげするような方法ではなくphysdevモジュールを使う方法をとってみることにします。

以下、ONU側につながっているインタフェースを eth0、内側のその他のサーバ類等々ぶら下がっているセグメント側のインタフェースをeth1とします。

まずは単純にbridgeを作成します。bridgeの操作にはbridge-utilsが必要なのでインストールしといてください。あとは、ebtablesとip6tables(はiptablesパッケージに入ってます)も使いますので入ってなければ入れておきましょう。

apt-get install bridge-utils ebtables iptables

/etc/network/interfaces には以下のように記述して br0 という名前で bridge インタフェースを作成します。

auto br0
iface br0 inet manual
      bridge_ports eth0 eth1

これだけです。さて、上記で bridge はできますが このままだとあらゆるパケットが通ってしまう状態になってしまうんでIPv6なパケットのみが通過するようにebtablesでフィルタしておきます。コマンドとしてはこう(注: bridgeインタフェースがひとつしかない前提でインタフェースの指定してないので 複数あるような場合は適宜 -i br0 とか指定してくださいな)

ebtables -t broute -P BROUTING DROP
ebtables -t broute -I BROUTING -p IPv6 -j ACCEPT

以下雑ですがこんな感じのスクリプトにして /etc/if-up.d/ipv6bridge とかいう名前にでもして放り込んでおくと、br0インタフェースがupした時に上記のフィルタが実行されると思います。

#!/bin/sh

[ "$IFACE" != "br0" ] && exit 0

ebtables -t broute -P BROUTING DROP
ebtables -t broute -I BROUTING -p IPv6 -j ACCEPT

exit 0

これで、IPv6 bridge の作成はおしまいです。ifup br0 とでもすれば br0 が有効になって内側のセグメントにもRAが流れ始めて(各マシンで RA を受け取って autoconfig するようにしてあれば) IPv6 で通信できるようになるはずです。

ただ、この状況だと各マシンにはIPv6のグローバルアドレスがそのままふられますしなんのフィルタもないので、うちから外へのパケットが通るのと同じく外から内へのパケットも自由自在に通りますので(わら 内側のセグメントのマシンにもアクセスし放題になります。

ということで、ふつーなんらかのフィルタをしたくなるだろうと思います。例えばこんな感じにします。

ip6tables -N v6-in
ip6tables -N v6-out

ip6tables -A FORWARD -i br0 -m physdev --physdev-in eth0 -j v6-in
ip6tables -A FORWARD -i br0 -m physdev --physdev-in eth1 -j v6-out

ip6tables -A v6-in -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A v6-in -j DROP

ip6tables -A v6-out -j ACCEPT

最初の2行で v6-in と v6-out というchainを新たに作成しています(あとで、フィルタを消すようなときに楽だからなだけ)。

キモはその次の2行です。bridge に対して physdev モジュールを使って実際にパケットが入ってくるインタフェースを識別した上でそれぞれのルールセットのchainにjumpさせます(仙石さんの記事ではこの部分の処理を ebtables でつけた mark で行なっています)。

あとは、v6-inとv6-outに適宜必要なルールをてきとーに追加してやれば動作します(上記の例だと外向きのパケットは全部素通し、内向きは特定のstateのパケット以外は全部DROPします)。

ip6tables-save なりで save しておいて読み込ませるなり、スクリプトにするなり 適当に準備してどこかで設定するようにしましょう(オレはipv6filterとかいう名前のスクリプトにして/etc/network/if-up.dに放り込んであります)

というあたりで、特になにか目新しいことがあるわけじゃないですがこんな感じでIPv6 bridgeが作れます。

市販のいわゆるブロードバンドルータにもIPv6ブリッジ機能があるものがありますが安いもの(家電量販店とかで売っているようなもの)だと、IPv6パケットのフィルタリングができるようなものは現状皆無のようなので、ちょっと遊ぶだけならいいんですが実用的にはちょっと厳しいんじゃないかと思われます(というあたりも、IPv6 の一般家庭への普及の阻害要因の一つなんじゃないかなぁと思ったりします)。

カテゴリー: Debian, IPv6, Linux タグ: , , , , , ,