ネイティブでIPv6対応してから結構経ちますが、
なんかパケットが届いたり届かなかかったり変な感じ。
やっとまとまった時間が取れたので調べてみました。
たぶん本質的な問題はこれ。
ソースアドレスがリンクローカルアドレスだと、ルータへの NS に対して NA が帰ってこない
リンクローカルアドレスの場合
11:18:14.984159 IP6 fe80::xxxx:xxxx:xxxx:xxxx > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
11:18:16.934355 IP6 fe80::xxxx:xxxx:xxxx:xxxx > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
11:18:17.958019 IP6 fe80::xxxx:xxxx:xxxx:xxxx > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
グローバルアドレスの場合
11:32:46.224159 IP6 xxx.xxx.xxx.xxx.v6.sakura.ne.jp > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has fe80::1, length 32
11:32:46.231016 IP6 2001:e42:102:1109::1 > xxx.xxx.xxx.xxx.v6.sakura.ne.jp: ICMP6, neighbor advertisement, tgt is fe80::1, length 32
えー。そんなぁ……
回避策1
とりあえずソースアドレスをグローバルに固定してしまう方向で逃げる。
リンクローカルアドレスを削除してみる。
$ sudo ifconfig vtnet0 inet6 fe80::xxxx delete
これだと起動時に毎回コマンドをたたく必要があるので、ちょっとおいしくない。
回避策2
リンクローカルアドレスを deprecated に指定して、ソースアドレス選択から除外する。
/etc/sysctl.conf に以下の行を追加。
net.inet6.ip6.use_deprecated=0
/etc/rc.conf に以下の行を追加。
ifconfig_vtnet0_alias0="inet6 fe80::xxxx:xxxx:xxxx:xxxx deprecated"
とりあえずこれで様子を見てみることに。
そもそも論
なんでリンクローカルアドレスだと NA 帰ってこないの?