2011/12/21(Wed)同一セグメントの対向IPv6ホストアドレスを知るライフハック

2011/12/21 2:05 Hardware::NetworkSwitch
さて、今回のポストはIPv6ネットワークのライフハックを一つ。
ネットワークにマシンを足したけどそのアドレス、何がついたかいちいちメモるのが大変*1だというお悩みや、ルーティング先ルータのリンクローカルアドレスってなんだっけ?というお悩みを解消できまする。

*1 : とくにIPv6のEUI-64生成された2001:db8:2413:2012:204:83ff:fe21:4dbaみたいなアドレスだと

決め手は全ノードマルチキャスト

さて、IPv6には全ノードマルチキャストアドレスという特別なアドレスがあります。
"ff02::1"というアドレスがそれで、スコープはリンクローカルです。つまり、各ネットワーク毎に存在するアドレスですね。
基本的に、このアドレスはIPv4のブロードキャストアドレスの置き換えで、全てのノードが受信してくれる*2ので、ここにping6を投げるわけです。

先ほども書いたようにリンクローカルのアドレスなので、インタフェースの指定が必須です。
そして、応答時間が一番短いのが自分自身なので、DUP!印の付いているものを順番に確かめていけば良いでしょう。

Linux

Linuxの例。
$ ping6 -I eth0 ff02::1

PING ff02::1(ff02::1) from fe80::212:34ff:fe56:789a eth0: 56 data bytes
64 bytes from fe80::212:34ff:fe56:789a: icmp_seq=0 ttl=64 time=0.031 ms
64 bytes from fe80::212:34ff:fe56:0bcd: icmp_seq=0 ttl=64 time=0.370 ms (DUP!)
64 bytes from fe80::212:34ff:fe56:efa1: icmp_seq=0 ttl=64 time=0.456 ms (DUP!)
64 bytes from fe80::212:34ff:fe90:abcd: icmp_seq=0 ttl=64 time=0.557 ms (DUP!)
...
^C

Solaris

Solaris(OpenIndiana)の例。
ちょっとオプションが色々違いますが、基本的にはLinuxと同じスタイル。
  • Iでインターバル付けないとうまく出てこない…?
$  ping -i nge0 -I 30 -s ff02::1

PING ff02::1: 56 data bytes
64 bytes from fe80::212:34ff:fe56:789a: icmp_seq=0. time=0.136 ms
64 bytes from fe80::212:34ff:fe56:0bcd: icmp_seq=0. time=1016.315 ms
64 bytes from fe80::212:34ff:fe56:efa1: icmp_seq=0. time=2027.804 ms
64 bytes from fe80::212:34ff:fe90:abcd: icmp_seq=0. time=2028.937 ms
...
^C

AlaxalA

AlaxalAのスイッチの例。
アドレスの後に%とVLAN番号を書くパターンで同じ事が可能です。
ちなみにAlaxalA IPv6導入ガイドによれば、"VLAN"は大文字かつVLAN番号は4桁に0フィルしないといけないらしいのでご注意。
> ping ipv6 ff02::1%VLAN0025

PING6(56=40+8+8 bytes) fe80::212:34ff:fe56:0bcd%VLAN0025 --> ff02::1%VLAN0025
16 bytes from fe80::212:34ff:fe56:0bcd%VLAN0025, icmp_seq=0 hlim=64 time=1.949 ms
16 bytes from fe80::212:34ff:fe56:789a%VLAN0025, icmp_seq=0 hlim=64 time=4.989 ms(DUP!)
16 bytes from fe80::212:34ff:fe56:efa1%VLAN0025, icmp_seq=0 hlim=64 time=8.25 ms(DUP!)
16 bytes from fe80::212:34ff:fe90:abcd%VLAN0025, icmp_seq=0 hlim=64 time=11.951 ms(DUP!)
...
^C

AlliedTelesis

こちらも同様。
VLANインタフェースの指定と同じようにそのまま書けばOKです。0フィルは不要でvlanは小文字。
> ping ff02::1%vlan25

Echo reply 1 from fe80::212:34ff:fe90:abcd time delay 0.003 ms
Echo reply 1 from fe80::212:34ff:fe56:789a time delay 0.714 ms (DUP!)
Echo reply 1 from fe80::212:34ff:fe56:0bcd time delay 0.769 ms (DUP!)
...
^C

Cisco

手元に実機がないのですが、こんな感じ。
# ping ipv6 ff02::1 repeat 1 timeout 5

Output Interface: GigabitEthernet 0
...


D-Link

割と同様。
VLANとは別にIPv6インタフェースをcreate ipifで作る必要があるので、show ipifして存在していなければcreate ipif myifname VLAN25のように作る必要がある。
default vlanはSystemという名前みたい。*3
# ping6 ff02::1%System

Command: ping6 FF02::1%System

Reply to request 1 from FE80::212:34FF:FE56:EFA1, bytes=100 time<10 ms
Reply to request 1 from FE80::212:34FF:FE90:ABCD, bytes=100 time=10 ms
Reply to request 1 from FE80::212:34FF:FE56:0BCD, bytes=100 time=10 ms
Reply to request 1 from FE80::212:34FF:FE56:789A, bytes=100 time=30 ms
...
^C

YAMAHA

"インタフェース"指定と、"% + スコープ識別子"(show ipv6 addressで確認)の両方が指定可能で、"lanN"の部分は、"pp N"や"tunnel N"のような指定も可能。
後ろの"1"は送信回数。
% ping6 ff02::1 lan1 1

...

Windows

ちなみにWindowsならば、netsh経由などでインタフェース番号を調べてから、アドレスの最後に%xxという形で指定できることはできるわけですが…
> netsh int ipv6 show ad

(略)
インターフェイス 12: ローカル エリア接続

アドレス種類  DAD 状態    有効期間   優先有効期間 アドレス
------------  ----------- ---------- ------------ ---------------------
Public     設定           23h59m51s   3h59m51s 2001:db8:1234:5678:9abc:9078:6756:abcd
Temporary  設定           23h59m51s   3h59m51s 2001:db8:1234:5678:212:34ff:fe56:efa1
その他        設定            infinite   infinite fe80::9abc:9078:6756:abcd%12
(略)


> ping ff02::1%12

ff02::1%12 に ping を送信しています 32 バイトのデータ:
ff02::1%12 からの応答: 時間 =1ms
ff02::1%12 からの応答: 時間 =1ms
ff02::1%12 からの応答: 時間 =1ms
...
^C
うおお、だんまりか。
この記事を書く過程で同じ現象を経験したらしい人のpostも見かけたけど、Windows 7辺りは返事もしてくれないらしいのでご注意。

*2 : 後に書いてますが、Windows 7等応答を返さないものもあります。ご注意。

*3 : ものによっては、IPv6インタフェースは一つしか扱えないみたいなので、System I/Fにアドレスを振っている場合はそれ以外には無理っぽい

総括

まあ、ICMPやICMPv6を返す設定にしている時点で、そのホストの存在を知らせてしまうようなものなので、このセグメントのグローバルプレフィックスがRAで知らせれれば、簡単に対向ノードのグローバルアドレスを知る事も出来ますが、そういうリスクもあると思っておくべきですね。