TOGAWA Satoshi <t...@puyo.org> wrote
  in <20141115101119.bacccd7953f5562ab5820...@puyo.org>:

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

Attachment: pgpiHij6gcpR6.pgp
Description: PGP signature

メールによる返信