オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

IPv6のifconfigとping6(Linux)

»

Linuxでifconfigコマンドを使い、2台のホストで同じIPv6アドレスを割り当てるとどうなるでしょうか?

host1# ifconfig eth0 add 2001:298:2065:ff::101/64
host1#ping6 -c 1 -w 10 -I 2001:298:2065:ff::101 2001:298:2065:ff::100
PING 2001:298:2065:ff::100(2001:298:2065:ff::100) from 2001:298:2065:ff::101 : 56 data bytes
64 bytes from 2001:298:2065:ff::100: icmp_seq=1 ttl=64 time=0.028 ms

--- 2001:298:2065:ff::100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.028/0.028/0.028/0.000 ms

host2# ifconfig eth0 add 2001:298:2065:ff::101/64
host2# ping6 -c 1 -w 10 -I 2001:298:2065:ff::101 2001:298:2065:ff::100
ping: bind icmp socket: 要求アドレスに割り当てられません

ifconfigコマンドはなんのエラーも出さずに、IPv6アドレスが追加されます。しかし、ping6コマンドを使ってみると、2台目はエラーになります。

host1でIPv6アドレスを消してもエラーのままです。

host1# ifconfig eth0 del 2001:298:2065:ff::101/64

host2# ping6 -c 1 -w 10 -I 2001:298:2065:ff::101 2001:298:2065:ff::100
ping: bind icmp socket: 要求アドレスに割り当てられません

host2でIPv6アドレスを消してもう一度追加すると成功します。

host2# ifconfig eth0 del 2001:298:2065:ff::101/64
host2# ifconfig eth0 add 2001:298:2065:ff::101/64
host2# ping6 -c 1 -w 10 -I 2001:298:2065:ff::101 2001:298:2065:ff::100
PING 2001:298:2065:ff::100(2001:298:2065:ff::100) from 2001:298:2065:ff::101 : 56 data bytes
64 bytes from 2001:298:2065:ff::100: icmp_seq=1 ttl=64 time=1.20 ms

--- 2001:298:2065:ff::100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 1.209/1.209/1.209/0.000 ms

仮想IPでサービスIPを切り替えるような冗長化を構成するときに、たまたまアクティブが2台になって方系に譲るような処理の場合、ifconfigが成功して、IPv6アドレスを持っているように見えても、ping6のように使えないということが起きる可能性があるのです。この状態だと上位スイッチやルーターなどもping6が使えない側にパケットを飛ばしてくれません。

ping6はバインドできないときは終了ステータスが2、タイムアウトだと1で、成功の場合は0です。終了ステータスが2の場合はifconfigでdel,addするようにしないと駄目ですね。

ちなみに、IPv4だとpingはエラーにならず、パケットがどう流れるかはそれぞれの機器のMACテーブルやARPテーブルによる感じになります。どちらが良いかは微妙ですねぇ。本当はifconfigコマンド実行時に重複を検知したらエラーになってくれる方が処理しやすい気もします。

Comment(0)