Raspberry Pi をIPv6に繋ごうとしたらハマったのでメモ。
自宅にIPv6(IPoE)回線が開通したので、Raspberry Pi で ip a
を叩いたが、リンクローカルアドレスのみ表示されて、グローバルユニキャストアドレスが見えない。。。
同じルーターに接続しているWindows端末では、ちゃんとダンシング亀が見えるのに。
% ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever
OSのバージョンやiptablesの設定について。
% cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
% sudo ip6tables -L -v -n
Chain INPUT (policy DROP 2 packets, 370 bytes)
pkts bytes target prot opt in out source destination
37 3644 ACCEPT all lo * ::/0 ::/0
5326 6783K ACCEPT all * * ::/0 ::/0 state RELATED,ESTABLISHED
% sudo iptables -L -v -n
Chain INPUT (policy DROP 7894 packets, 2297K bytes)
pkts bytes target prot opt in out source destination
16 800 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
26736 7192K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
で、早速結論ですが、下記のみっつの事実がポイントでした。
- 今回の私の回線ではSLAAC(RA)によりグローバルユニキャストアドレスが決定される。
- SLAACの中でICMPv6が使われる
- 自ホスト発でも、このICMPv6のパケットは RELATED ルールでマッチしない
というわけで、
-A INPUT -p ipv6-icmp -j ACCEPT
というルールを追加して、
% sudo ip6tables -L -v -n
Chain INPUT (policy DROP 2 packets, 370 bytes)
pkts bytes target prot opt in out source destination
39 3784 ACCEPT all lo * ::/0 ::/0
5986 7626K ACCEPT all * * ::/0 ::/0 state RELATED,ESTABLISHED
186 17076 ACCEPT icmpv6 * * ::/0 ::/0
としてあげれば無事グローバルユニキャストアドレスが取れました。
% ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet6 2xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxx/64 scope global mngtmpaddr noprefixroute dynamic
valid_lft 2591910sec preferred_lft 604710sec
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever