TOGAWA Satoshi <[email protected]> wrote in <[email protected]>:
to> 戸川です。 to> to> FreeBSD 10.0-Rを使って、jailを複数立ち上げていました。 to> 10.1-Rに上げたところ、起動時にこんなメッセージが出るようになりました。 ... to> 確かにepair2bとepair4bのMACアドレスが重複するので、そこから生成される to> IPv6アドレスが重複しているようです。 to> to> Webを調べてみたところ、 http://demon-lord.com/doku.php?id=vps:vps_01 にて to> ---- to> epairを一つ作成してjailerからprisonerに割り当ててから次のepairを作成すると to> MACアドレスが重複する場合がある。この場合、それぞれのepairを同じbridgeに to> 接続するとMACアドレスが重複して通信が行えなくなる。問題を回避する為、 to> epairの作成は同時期に行う。 to> ---- to> という記述がありましたが、現在の /etc/rc.d/jail の仕組みを使って、 to> この問題を解決するには、どうすれば良いのでしょうか? epair(4) の MAC アドレスは、if_index の値が使われます。 if_index は、インタフェースに付けられた連番です。 02:ff:00:00:05:0a の場合、0x05 が if_index です。上位から 0 バイト目は固定ですが 1, 2 バイト目はどういう値が入るか決まっていません。 この連番は、vnet jail 単位で管理されています。つまり、 1. ホスト環境で ifconfig epair0 create する 2. ホスト環境の if_index が 2 増える 3. ホスト環境で ifconfig epair0b vnet 1 する 4. jail 1 の if_index が 1 増え、ホスト環境の if_index が 1 減る という動作をします。ここで再度ホスト環境で ifconfig epair1 create すると、epair1a は epair0b の if_index を再利用する 可能性が生じます。 メールにあるログを具体的にたどると、次のようになると思います。 to> epair1a: Ethernet address: 02:ff:00:00:04:0a to> epair1b: Ethernet address: 02:ff:50:00:05:0b epair1a の if_index == 4 epair1b の if_index == 5 to> epair2a: Ethernet address: 02:ff:00:00:06:0a to> epair2b: Ethernet address: 02:ff:50:00:07:0b to> epair3a: Ethernet address: 02:ff:00:00:08:0a to> epair3b: Ethernet address: 02:ff:50:00:09:0b epair2a の if_index == 6 epair2b の if_index == 7 epair3a の if_index == 8 epair3b の if_index == 9 ここまでで、epair1b, 2b, 3b はまだホスト環境にあります。 to> epair4a: Ethernet address: 02:ff:00:00:05:0a epair4a の if_index == 5 この時点で、epair1b が vnet jail に移動して if_index が 再利用されています。 to> epair4b: Ethernet address: 02:ff:50:00:07:0b これも epair2b の if_index == 7 が再利用されて epair4b に付いています。したがって、 to> epair4b: DAD detected duplicate IPv6 address fe80:2::ff:50ff:fe00:70b: NS in/out=0/0, NA in=0 epair4b と epair2b に同じ MAC アドレスが付くため、 ブリッジすると通信できません。 if_index の再利用は、epair に限らず clone に対応した インタフェースであればどれでも発生します。 解決方法は 2 つあります。 a) ホスト環境から vnet jail にインタフェースを移動させる操作と、 clone の操作を並行で行なわない。 たとえばホスト環境で cloned_interfaces を定義するなどして epair をあらかじめ作成しておき、jail.conf に vnet.interface を定義することで ホスト環境から vnet jail へ移動させる。 b) "ifconfig epair0b ether 02:ff:10:10:10:0a" などを実行し、 リンク層アドレスを手動で固定してしまう。 epair の MAC アドレスは安定していませんので、a) であっても固定するほうが 扱いやすいと思います。 -- Hiroki
pgpiHij6gcpR6.pgp
Description: PGP signature
