家のネットワークからインターネットへ出るとき IPoE を使ってたけど、家庭内 LAN のネットワークは IPv6 を off にしていた。 この LAN 内 IPv6 化していなかった理由としては、昔 Linux (だけじゃないかも)が IPv6 が利用できる状態だと 先に IPv6 で繋ぎにいこうとして IPv6 で通信できなかったら IPv4 にフォールバックするという挙動で、すごくストレスフルだった。 この挙動の対処として、カーネルレベルで IPv6 を off にしてました。 そうこうしているうちに契約している ISP が IPv6 オプションなしで IPoE を利用できるようになったので、 とりあえず IPoE だけを利用できるようにして、家庭内の LAN はそのままという状態にしていました。 いいかげんこの家庭内 LAN のネットワークを IPv6 化し、インターネットと IPv6 で通信できるようにした顛末をのこす。のこします。

家庭内 LAN 環境

  • ゲートウェイ: NEC IP38X/1210 (YAMAHA RTX1200)
  • PC: 6.0.0-gentoo

IPoE 化と家庭内 LAN の IPv6 化

設定は YAMAHA の設定例集に載ってあるのでそれを参考にします。 IPoE 化はこの設定例でいけるのですが、どうも設定したときにミスったらしく、 LAN の IP アドレスが IPv4 ではインターネットへ出ることができるが、 IPv6 ではインターネットへ出ることができない状態になってしまいました。

旧設定

どのような設定だったかは以下に

ip route default gateway tunnel 1
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 prefix ra-prefix@lan2::/64
ipv6 lan1 rtadv send 1
ipv6 lan1 dhcp service server
ipv6 lan2 address auto
ipv6 lan2 secure filter in 1010 1011 1012 2000
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 106
ipv6 lan2 dhcp service client ir=on
ngn type lan2 ntt
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:100
 tunnel enable 1
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 2000 reject * * * * *
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * tcp
ipv6 filter dynamic 106 * * udp

この設定ではインターネットとは IPv4 でしか通信できていない状態でした。 でこのトラブルシュートとして知人(@n_kane, @paina) のちからを借りてどこまで通じてどこから通じないかを確認しました。

troubleshooting

とりあえず ping6traceroute6 で通じていないことを確認します。

$ ping6 -c 3 google.com

PING  google.com(nrt13s55-in-x0e.1e100.net (2404:6800:4004:824::200e)) 56 データ長(byte)

--- google.com ping 統計 ---
送信パケット数 3, 受信パケット数 0, パケット損失 100%, 時間 2067ミリ秒

$ traceroute6 google.com
traceroute to google.com, 30 hops max, 80 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

通ってないですね。 先述したように PC は IPv6 を on にしたばかりなのでクライアント側の設定でブロックしていないかを確認します。 まずクライアント側で考えられるのは iptables でのパケットフィルタリングですね。 ルーターの下にある PC なので、ここでブロックすることは低いのですが、確認します。

# ip6tables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

なにもフィルタリングしていないですね。 ということで、クライアント側には問題なさそうですね。 どこまで通じてどこまで通じていないのか別のエンドポイントで確認します。

まず、手元と相手で tcpdump 利用してパケットが送っているか届いているかを確認します。

# tcpdump -nei enp8s0f0 icmp6
dropped privs to pcap
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp8s0f0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:35:41.158558 00:a0:de:69:40:9d > 33:33:ff:51:5e:63, ethertype IPv6 (0x86dd), length 86: fe80::212:e2ff:fe70:6144 > ff02::1:ff51:5e63: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00:d903:ddb5:851:5e63, length 32
22:35:58.765783 ee:60:51:38:43:9c > 33:33:ff:00:00:01, ethertype IPv6 (0x86dd), length 86: 2409:10:a5c0:1f00:5ce3:afcb:9bb2:5c1b > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00::1, length 32
22:36:09.249427 ee:60:51:38:43:9c > 33:33:ff:00:00:01, ethertype IPv6 (0x86dd), length 86: 2409:10:a5c0:1f00:5ce3:afcb:9bb2:5c1b > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00::1, length 32

送れてはいるようで対向側にも届いていたらしく戻りのパケットは送ってたようですが、手元では戻ってくるパケットは見えていないですね。

ということはやはりルーターの設定が悪そうということが推察されますね。 設定のどこが悪いのかあやしいところを見ていきます。

最初に怪しいとおもったのはルーターのフィルターまわりです。一旦、no ipv6 interface secure filer in で全部無効化しましょう。しかしとくに変りはないです。これはフィルターが原因ではなさそうですね。

次にあやしい点は以下2つの設定

  1. ipv6 interface address
  2. ipv6 interface prefix

上のコマンドは ISP から自動で振ってきている IP を割り当てる設定で、下のコマンドは ISP から振ってきた IPv6 のプレフィックスを付けるようにするための設定となります。 どうもこの下のコマンドが邪魔なようです。 no ipv6 interface prefix で無効化できるので一旦外してみましょう。 すると

$ ping6 -c 3 google.com
PING google.com(nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e)) 56 データ長(byte)
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=1 ttl=57 時間=6.53ミリ秒
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=2 ttl=57 時間=2.73ミリ秒
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=3 ttl=57 時間=2.81ミリ秒

--- google.com ping 統計 ---
送信パケット数 3, 受信パケット数 3, パケット損失 0%, 時間 2002ミリ秒
rtt 最小/平均/最大/mdev = 2.731/4.023/6.532/1.773ミリ秒

のように通りました!勝ったッ!第三部完!

おわり

以前中途半端に設定したおかげで IPv6 有効化に時間が掛ってしまった顛末をまとめました。 これで家のネットワークから IPv6 で通信できるようになりました。 ありがとうございました!

次回 katsyoshi.org お名前.COM やめるってよ