VLANを使っているネットワークでIPv6を使う際、各VLANを割り当てる必要がありますが、
ひかり電話を契約していない環境だとIPv6のアドレスは1つのVLANにしか割り当てられない落とし穴がありました。
これは、ひかり電話を契約していない環境では、/64のプレフィックスを受信するため、さらにサブネット分割をできず、ひかり電話契約時は /56 ~ /63 のプレフィックスを受信するため、分割可能とのことです。(IPv6はIPv4と異なり、ネットワーク部とホスト部が/64で区切られるため、/64以降でサブネット分割できない)
NATを使うことで別のVLANからでもIPv6接続できるようにしました。
ただ、IPv6は使える様になりましたが、ブラウザがIPv4を優先する設定がのこっており、改善が必要そうです。
環境

ens19側のIPv6アドレスはユニークローカルアドレス(ULA)なので、fd00から始めます。
IPv6アドレスをクライアント側(ens19)に設定
|
1 2 |
sudo rm *.yaml /etc/netplan/ sudo vim /etc/netplan/01-netcfg.yaml |
|
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 |
network: version: 2 renderer: networkd ethernets: ens18: dhcp6: true accept-ra: true addresses: - 192.168.7.239/24 routes: - to: 0.0.0.0/0 via: 192.168.7.1 nameservers: addresses: - 192.168.7.1 ens19: dhcp4: false dhcp6: false addresses: - 192.168.8.3/24 - fd00:4::3/64 nameservers: addresses: - fd00:4::2 |
|
1 2 |
sudo chmod 600 /etc/netplan/01-netcfg.yaml sudo netplan apply |
エラーが出なければ完了です。
設定後は再起動します。
sudo netplan applyでも行けるはずだが、キャッシュが残っていてうまくいかなかった。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 (省略) 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 (省略) inet6 2xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr noprefixroute ← 2xxxではじまる、ルータが広告しているアドレスになっている (省略) 3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 (省略) inet6 fd00:4::3/64 scope global ←netplanで設定したアドレスになっている。 valid_lft forever preferred_lft forever (省略) |
クライアントへULAをRA(IPv6アドレス割り当て)する設定をする
radvdをインストールしてens19に接続している端末にローカルIPv6アドレスを割り当てる設定、ens19のIPアドレスをデフォルトルートとする広告をする設定をします。
|
1 2 |
sudo apt update sudo apt install radvd |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/etc/radvd.conf interface ens19 { AdvSendAdvert on; MinRtrAdvInterval 5; MaxRtrAdvInterval 10; AdvDefaultLifetime 60; prefix fd00:4::/64 { AdvOnLink on; AdvAutonomous on; }; RDNSS fd00:4::2{ AdvRDNSSLifetime 60; }; AdvDefaultLifetime 60; }; |
|
1 2 |
sudo systemctl enable radvd sudo systemctl start radvd |
AdvDefaultLifetime 60;がポイントで、これを記述することで、ens19のIPアドレスをデフォルトルートとして広告するようになりました。
DNSサーバはRDNSS fd00:4::2~で記載しているので、適宜変更してください。
ens19のネットワークにPCを接続し、fd00:4から始まるIPv6アドレスを取得していれば成功で、ping fd00:4::3が通るはずです。
IPv6フォワーディング、NAT66の設定
ens18側とens19側がつながっていないので、つなぐ設定を行います。サブネットが異なるのでNAT66(IPv6 to IPv6)を設定しています。また、再起動をすると設定が消えてしまうので、恒久化設定も合わせて行います。
IPv6フォワーディングを有効化
|
1 |
sudo sysctl -w net.ipv6.conf.all.forwarding=1 |
恒久化設定
|
1 |
sudo echo 'net.ipv6.conf.all.forwarding=1' | sudo tee -a /etc/sysctl.conf |
NAT66の設定
|
1 |
sudo ip6tables -t nat -A POSTROUTING -o ens18 -j MASQUERADE |
NAT66の恒久化設定
|
1 |
sudo apt install iptables-persistent |
途中、現在の設定を保存するか聞かれるので、IPv4はNo、IPv6はYesとすると保存されます。表示されない場合や、設定を変更した場合は次のコマンドで上書き保存できます。
|
1 |
sudo sh -c 'ip6tables-save > /etc/iptables/rules.v6' |
動作確認
クライアントPCで行います。
NATサーバとDNSサーバにpingを確認。これでエラーならサーバにIPv6アドレスが設定されているか、radvdが正しく設定されているか疑う。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ ping -c 3 fd00:4::2 PING fd00:4::2 (fd00:4::2) 56 data bytes 64 bytes from fd00:4::2: icmp_seq=1 ttl=64 time=1.41 ms 64 bytes from fd00:4::2: icmp_seq=2 ttl=64 time=1.63 ms 64 bytes from fd00:4::2: icmp_seq=3 ttl=64 time=2.49 ms --- fd00:4::2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.406/1.842/2.491/0.467 ms $ ping -c 3 fd00:4::3 PING fd00:4::3 (fd00:4::3) 56 data bytes 64 bytes from fd00:4::3: icmp_seq=1 ttl=64 time=0.435 ms 64 bytes from fd00:4::3: icmp_seq=2 ttl=64 time=0.470 ms 64 bytes from fd00:4::3: icmp_seq=3 ttl=64 time=0.514 ms --- fd00:4::3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2039ms rtt min/avg/max/mdev = 0.435/0.473/0.514/0.032 ms |
DNSサーバで名前解決できることを確認。これでエラーだとDNSサーバでListenしていないので、サーバ側を疑う。
|
1 2 3 4 5 6 7 8 9 |
$ nslookup google.com fd00:4::2 Server: fd00:4::2 Address: fd00:4::2#53 Non-authoritative answer: Name: google.com Address: 142.251.222.46 Name: google.com Address: 2404:6800:4004:81e::200e |
広告されているDNS設定を使って名前解決をする。これでエラーだと、radvdの設定に不備がありそう。
|
1 2 3 4 5 6 7 8 9 |
$ nslookup google.com Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: google.com Address: 172.217.175.78 Name: google.com Address: 2404:6800:4004:81e::200e |
pingでGoogleに接続できればOK
|
1 2 3 4 5 6 7 8 9 |
$ ping -c 3 -6 google.com PING google.com (2404:6800:4004:821::200e) 56 data bytes 64 bytes from nrt12s35-in-x0e.1e100.net (2404:6800:4004:821::200e): icmp_seq=1 ttl=113 time=5.33 ms 64 bytes from nrt12s35-in-x0e.1e100.net (2404:6800:4004:821::200e): icmp_seq=2 ttl=113 time=4.44 ms 64 bytes from nrt12s35-in-x0e.1e100.net (2404:6800:4004:821::200e): icmp_seq=3 ttl=113 time=5.34 ms --- google.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 4.443/5.038/5.339/0.420 ms |
課題
IPv6アドレスが正しく設定され、IPv6を指定するとインターネットに接続できることは確認できましたが、PCのブラウザからtest-ipv6.comへアクセスすると利用が回避されていると出てきます。また、Androidから接続すると、IPv6アドレスが割り当ててるにもかかわらずtest-ipv6ではIPv6アドレスが見えていないと出てきて、IPv6アドレスでインターネットに接続できていないです。
RFC 8305(Happy Eyeballs v2)を使って、IPv4とIPv6を試し、早い方を使うという話があり、digのスピードを比較しましたが、IPv6のほうが早く、違いそうです。
別の理由としてはIPv6はNATを利用せずつかう前提があるため、ULAではインターネットに接続されていないとみなし、使わない設定になっているのかもしれません。

|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ ip -6 route fd00:4::/64 dev ens18 proto ra metric 100 pref medium fe80::/64 dev ens18 proto kernel metric 1024 pref medium default via fe80::xxxx:xxxx dev ens18 proto ra metric 100 pref medium $ dig google.com AAAA ; <<>> DiG 9.18.30-0ubuntu0.24.04.2-Ubuntu <<>> google.com AAAA ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40852 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;google.com. IN AAAA ;; ANSWER SECTION: google.com. 201 IN AAAA 2404:6800:4004:81e::200e ;; Query time: 49 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Thu Jul 10 11:00:07 JST 2025 ;; MSG SIZE rcvd: 67 $ dig google.com A ; <<>> DiG 9.18.30-0ubuntu0.24.04.2-Ubuntu <<>> google.com A ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50680 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 164 IN A 172.217.175.78 ;; Query time: 53 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Thu Jul 10 11:00:11 JST 2025 ;; MSG SIZE rcvd: 55 |
参考リンク
https://www.rtpro.yamaha.co.jp/RT/docs/ipoe/index.html#setting5
IPv6アドレスの取得方法について、一番詳細に書いてありました。
https://www.infraexpert.com/study/ipv6z5.html



