[FreeBSD-users-jp 95357] Re: epair*のMACアドレスが重複する
Hiroki Sato
hrs at FreeBSD.org
Sat Nov 22 09:09:35 UTC 2014
TOGAWA Satoshi <toga at puyo.org> wrote
in <20141115101119.bacccd7953f5562ab5820224 at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-users-jp/attachments/20141122/575868c5/attachment.sig>
More information about the freebsd-users-jp
mailing list