Hello,
I have been helping a friend getting access to native IPv6 connectivity
at home, using OpenBSD, and have been running into a few problems. It
would be nice to hear input from any developers on this.
The setup looks like this: We are supposed to get a default route on the
outside interface (em0), using autoconf, and then recieve an IPv6 prefix
on the inside (em1) using DHCP6-PD (prefix delegation).
The IP addresses have been masked to protect the innocent (though
you can trust that "XX.XXX" and "XXXX:XXX:XXXX:" are unique and correct
representations of a single set of real addresses)
Before starting, the interface configuration and routing table looks
like this:
===
# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 32768
priority: 0
groups: lo
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr d0:50:99:51:78:e8
priority: 0
groups: egress
media: Ethernet autoselect (1000baseT full-duplex)
status: active
inet XX.XXX.8.17 netmask 0xffffff80 broadcast XX.XXX.8.127
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr d0:50:99:51:78:e9
priority: 0
media: Ethernet autoselect (1000baseT
full-duplex,master,rxpause,txpause)
status: active
inet 192.168.212.254 netmask 0xffffff00 broadcast 192.168.212.255
enc0: flags=0<>
priority: 0
groups: enc
status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
priority: 0
groups: pflog
===
===
# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Mtu Prio Iface
default XX.XXX.8.1 UGS 4 111678 - 8 em0
XX.XXX.8.0/25 link#1 UC 1 0 - 4 em0
XX.XXX.8.1 00:0c:db:f6:1c:00 UHLc 1 0 - 4 em0
XX.XXX.8.17 d0:50:99:51:78:e8 UHLl 0 0 - 1 lo0
XX.XXX.8.127 link#1 UHLb 0 0 - 1 em0
127/8 127.0.0.1 UGRS 0 0 32768 8 lo0
127.0.0.1 127.0.0.1 UHl 1 0 32768 1 lo0
192.168.212/24 link#2 UC 9 0 - 4 em1
192.168.212.1 0c:c4:7a:31:d7:38 UHLc 0 32699 - 4 em1
192.168.212.2 00:25:90:ae:ca:4a UHLc 0 383 - 4 em1
192.168.212.3 b8:27:eb:22:72:8b UHLc 0 674 - 4 em1
192.168.212.4 b8:27:eb:32:0b:66 UHLc 0 166 - 4 em1
192.168.212.109 50:55:27:f4:ff:82 UHLc 0 1079 - 4 em1
192.168.212.136 ec:a8:6b:f9:6e:35 UHLc 0 705 - 4 em1
192.168.212.249 58:6d:8f:a0:51:c8 UHLc 0 8 - 4 em1
192.168.212.252 d0:bf:9c:45:0c:a0 UHLc 0 2684 - 4 em1
192.168.212.253 d0:bf:9c:45:0c:a2 UHLc 0 1 - 4 em1
192.168.212.254 d0:50:99:51:78:e9 HLl 0 0 - 1 lo0
192.168.212.255 link#2 UHLb 0 0 - 1 em1
224/4 127.0.0.1 URS 0 0 32768 8 lo0
Internet6:
Destination Gateway Flags Refs
Use Mtu Prio Iface
::/104 ::1 UGRS 0
0 32768 8 lo0
::/96 ::1 UGRS 0
0 32768 8 lo0
::1 ::1 UHl 14
0 32768 1 lo0
::1 ::1 UH 0
0 32768 4 lo0
::127.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::224.0.0.0/100 ::1 UGRS 0
0 32768 8 lo0
::255.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::ffff:0.0.0.0/96 ::1 UGRS 0
0 32768 8 lo0
2002::/24 ::1 UGRS 0
0 32768 8 lo0
2002:7f00::/24 ::1 UGRS 0
0 32768 8 lo0
2002:e000::/20 ::1 UGRS 0
0 32768 8 lo0
2002:ff00::/24 ::1 UGRS 0
0 32768 8 lo0
fe80::/10 ::1 UGRS 0
0 32768 8 lo0
fe80::%lo0/64 fe80::1%lo0 U 0
0 32768 4 lo0
fe80::1%lo0 fe80::1%lo0 UHl 0
0 32768 1 lo0
fec0::/10 ::1 UGRS 0
0 32768 8 lo0
ff01::/16 ::1 UGRS 0
0 32768 8 lo0
ff01::%lo0/32 ::1 UC 0
0 32768 4 lo0
ff02::/16 ::1 UGRS 0
0 32768 8 lo0
ff02::%lo0/32 ::1 UC 0
0 32768 4 lo0
===
Our pf.conf contains a single inet6 rule, which is "pass inet6" to
simplify the debugging for now.
The only IPv6 related sysctl settings that have been configured in
sysctl.conf are the following (the last one to aid debugging):
===
net.inet6.ip6.forwarding=1
net.inet6.icmp6.nd6_debug=1
===
We start out by enabling autoconf on em0 to get a default route via
fe80:
===
# ifconfig em0 inet6 autoconf
===
The interface configuration now looks like this:
===
# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 32768
priority: 0
groups: lo
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
em0: flags=208843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6> mtu 1500
lladdr d0:50:99:51:78:e8
priority: 0
groups: egress
media: Ethernet autoselect (1000baseT full-duplex)
status: active
inet XX.XXX.8.17 netmask 0xffffff80 broadcast XX.XXX.8.127
inet6 fe80::d250:99ff:fe51:78e8%em0 prefixlen 64 scopeid 0x1
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr d0:50:99:51:78:e9
priority: 0
media: Ethernet autoselect (1000baseT
full-duplex,master,rxpause,txpause)
status: active
inet 192.168.212.254 netmask 0xffffff00 broadcast 192.168.212.255
enc0: flags=0<>
priority: 0
groups: enc
status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
priority: 0
groups: pflog
===
This is where possibly unexpected things start happening. Our first
note is that no default route is appearing for IPv6:
===
# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Mtu Prio Iface
default XX.XXX.8.1 UGS 4 161453 - 8 em0
XX.XXX.8.0/25 link#1 UC 1 0 - 4 em0
XX.XXX.8.1 00:0c:db:f6:1c:00 UHLc 1 0 - 4 em0
XX.XXX.8.17 d0:50:99:51:78:e8 UHLl 0 0 - 1 lo0
XX.XXX.8.127 link#1 UHLb 0 0 - 1 em0
127/8 127.0.0.1 UGRS 0 0 32768 8 lo0
127.0.0.1 127.0.0.1 UHl 1 0 32768 1 lo0
192.168.212/24 link#2 UC 9 0 - 4 em1
192.168.212.1 0c:c4:7a:31:d7:38 UHLc 0 47705 - 4 em1
192.168.212.2 00:25:90:ae:ca:4a UHLc 0 478 - 4 em1
192.168.212.3 b8:27:eb:22:72:8b UHLc 0 979 - 4 em1
192.168.212.4 b8:27:eb:32:0b:66 UHLc 0 199 - 4 em1
192.168.212.109 50:55:27:f4:ff:82 UHLc 0 1338 - 4 em1
192.168.212.136 ec:a8:6b:f9:6e:35 UHLc 0 941 - 4 em1
192.168.212.249 58:6d:8f:a0:51:c8 UHLc 0 8 - 4 em1
192.168.212.252 d0:bf:9c:45:0c:a0 UHLc 0 2820 - 4 em1
192.168.212.253 d0:bf:9c:45:0c:a2 UHLc 0 1 - 4 em1
192.168.212.254 d0:50:99:51:78:e9 HLl 0 0 - 1 lo0
192.168.212.255 link#2 UHLb 0 0 - 1 em1
224/4 127.0.0.1 URS 0 0 32768 8 lo0
Internet6:
Destination Gateway Flags Refs
Use Mtu Prio Iface
::/104 ::1 UGRS 0
0 32768 8 lo0
::/96 ::1 UGRS 0
0 32768 8 lo0
::1 ::1 UHl 14
0 32768 1 lo0
::1 ::1 UH 0
0 32768 4 lo0
::127.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::224.0.0.0/100 ::1 UGRS 0
0 32768 8 lo0
::255.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::ffff:0.0.0.0/96 ::1 UGRS 0
0 32768 8 lo0
2002::/24 ::1 UGRS 0
0 32768 8 lo0
2002:7f00::/24 ::1 UGRS 0
0 32768 8 lo0
2002:e000::/20 ::1 UGRS 0
0 32768 8 lo0
2002:ff00::/24 ::1 UGRS 0
0 32768 8 lo0
fe80::/10 ::1 UGRS 0
0 32768 8 lo0
fe80::%em0/64 link#1 UC 1
0 - 4 em0
fe80::20c:dbff:fef6:1c00%em0 00:0c:db:f6:1c:00 UHLc 0
0 - 4 em0
fe80::d250:99ff:fe51:78e8%em0 d0:50:99:51:78:e8 UHLl 0
0 - 1 lo0
fe80::%lo0/64 fe80::1%lo0 U 0
0 32768 4 lo0
fe80::1%lo0 fe80::1%lo0 UHl 0
0 32768 1 lo0
fec0::/10 ::1 UGRS 0
0 32768 8 lo0
ff01::/16 ::1 UGRS 0
0 32768 8 lo0
ff01::%em0/32 link#1 UC 0
0 - 4 em0
ff01::%lo0/32 ::1 UC 0
0 32768 4 lo0
ff02::/16 ::1 UGRS 0
0 32768 8 lo0
ff02::%em0/32 link#1 UC 0
0 - 4 em0
ff02::%lo0/32 ::1 UC 0
0 32768 4 lo0
===
When looking in dmesg, we can see the following messages related to
the net.inet6.icmp6.nd6_debug flag:
===
defrouter_select: called unexpectedly (forwarding=1)
nd6_ra_input: invalid prefixlen 48 for rfc2374 prefix XXXX:XXX:XXXX::, ignored
===
There are two kinds of messages, when looking at one of
the ISP router advertisements in wireshark, we see that it contains a /48
prefix:
===
XXXX:XXX:XXXX::/48
===
If this is "wrong" or not, we are not sure, but that explains the
"invalid prefixlen 48" message we see in dmesg. The kernel throws this
error if the prefixlen is anything other than 64.
The reason the packet contains the /48 is because this is the netmask of the
network assigned to the upstream router vlan interface. We are only supposed to
get a default route from this message, not configure an IP address however. (I
have noticed Linux will populate it's routing table with the /48 though).
The more troublesome message is "defrouter_select: called unexpectedly
(forwarding=1)". This appears to be the reason no default route is being added
to the routing table.
This probably ties in with the "be both a router (ip6 forward enabled)
and a client (using autoconf) at the same time" problem that was hinted
at in this message on tech@ (talking about SOHO routers):
http://marc.info/?l=openbsd-tech&m=140541936220074&w=2
Disabling ip6 forwarding makes the route appear:
===
# sysctl net.inet6.ip6.forwarding=0
net.inet6.ip6.forwarding: 1 -> 0
# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Mtu Prio Iface
default XX.XXX.8.1 UGS 4 217856 - 8 em0
XX.XXX.8.0/25 link#1 UC 1 0 - 4 em0
XX.XXX.8.1 00:0c:db:f6:1c:00 UHLc 1 0 - 4 em0
XX.XXX.8.17 d0:50:99:51:78:e8 UHLl 0 0 - 1 lo0
XX.XXX.8.127 link#1 UHLb 0 0 - 1 em0
127/8 127.0.0.1 UGRS 0 0 32768 8 lo0
127.0.0.1 127.0.0.1 UHl 1 0 32768 1 lo0
192.168.212/24 link#2 UC 9 0 - 4 em1
192.168.212.1 0c:c4:7a:31:d7:38 UHLc 0 64749 - 4 em1
192.168.212.2 00:25:90:ae:ca:4a UHLc 0 500 - 4 em1
192.168.212.3 b8:27:eb:22:72:8b UHLc 0 984 - 4 em1
192.168.212.4 b8:27:eb:32:0b:66 UHLc 0 204 - 4 em1
192.168.212.109 50:55:27:f4:ff:82 UHLc 0 1341 - 4 em1
192.168.212.136 ec:a8:6b:f9:6e:35 UHLc 0 1112 - 4 em1
192.168.212.249 58:6d:8f:a0:51:c8 UHLc 0 8 - 4 em1
192.168.212.252 d0:bf:9c:45:0c:a0 UHLc 0 2952 - 4 em1
192.168.212.253 d0:bf:9c:45:0c:a2 UHLc 0 1 - 4 em1
192.168.212.254 d0:50:99:51:78:e9 HLl 0 0 - 1 lo0
192.168.212.255 link#2 UHLb 0 0 - 1 em1
224/4 127.0.0.1 URS 0 0 32768 8 lo0
Internet6:
Destination Gateway Flags Refs
Use Mtu Prio Iface
::/104 ::1 UGRS 0
0 32768 8 lo0
::/96 ::1 UGRS 0
0 32768 8 lo0
default fe80::20c:dbff:fef6:1c00%em0 UG 0
0 - 56 em0
::1 ::1 UHl 14
0 32768 1 lo0
::1 ::1 UH 0
0 32768 4 lo0
::127.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::224.0.0.0/100 ::1 UGRS 0
0 32768 8 lo0
::255.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::ffff:0.0.0.0/96 ::1 UGRS 0
0 32768 8 lo0
2002::/24 ::1 UGRS 0
0 32768 8 lo0
2002:7f00::/24 ::1 UGRS 0
0 32768 8 lo0
2002:e000::/20 ::1 UGRS 0
0 32768 8 lo0
2002:ff00::/24 ::1 UGRS 0
0 32768 8 lo0
fe80::/10 ::1 UGRS 0
0 32768 8 lo0
fe80::%em0/64 link#1 UC 1
0 - 4 em0
fe80::20c:dbff:fef6:1c00%em0 00:0c:db:f6:1c:00 UHLc 1
0 - 4 em0
fe80::d250:99ff:fe51:78e8%em0 d0:50:99:51:78:e8 UHLl 0
0 - 1 lo0
fe80::%lo0/64 fe80::1%lo0 U 0
0 32768 4 lo0
fe80::1%lo0 fe80::1%lo0 UHl 0
0 32768 1 lo0
fec0::/10 ::1 UGRS 0
0 32768 8 lo0
ff01::/16 ::1 UGRS 0
0 32768 8 lo0
ff01::%em0/32 link#1 UC 0
0 - 4 em0
ff01::%lo0/32 ::1 UC 0
0 32768 4 lo0
ff02::/16 ::1 UGRS 0
0 32768 8 lo0
ff02::%em0/32 link#1 UC 0
0 - 4 em0
ff02::%lo0/32 ::1 UC 0
0 32768 4 lo0
===
Leaving the forwarding disabled for now, the next step is to fetch the
IPv6 prefix from the ISP using DHCP6-PD. We use the dhcp6c client from
the wide-dhcp6 package for this. First of all the configuration:
===
# cat /etc/dhcp6c.conf
interface em0 {
send ia-pd 0;
};
id-assoc pd {
prefix-interface em1 {
sla-id 1;
sla-len 8;
};
};
===
This will request a prefix delegation and assign it on em1. When running
dhcp6c the following can be seen:
===
# dhcp6c -Df -c /etc/dhcp6c.conf em0
Jun/30/2015 18:14:33: get_duid: extracted an existing DUID from
/var/db/dhcp6c_duid: 00:01:00:01:1d:1f:02:b3:d0:50:99:51:78:e8
Jun/30/2015 18:14:33: dhcp6_ctl_authinit: failed to open /etc/dhcp6cctlkey: No
such file or directory
Jun/30/2015 18:14:33: client6_init: failed initialize control message
authentication
Jun/30/2015 18:14:33: client6_init: skip opening control port
Jun/30/2015 18:14:33: cfdebug_print: <3>[interface] (9)
Jun/30/2015 18:14:33: cfdebug_print: <5>[em0] (3)
Jun/30/2015 18:14:33: cfdebug_print: <3>begin of closure [{] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>[send] (4)
Jun/30/2015 18:14:33: cfdebug_print: <3>[ia-pd] (5)
Jun/30/2015 18:14:33: cfdebug_print: <3>[0] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of closure [}] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>[id-assoc] (8)
Jun/30/2015 18:14:33: cfdebug_print: <13>[pd] (2)
Jun/30/2015 18:14:33: cfdebug_print: <13>begin of closure [{] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>[prefix-interface] (16)
Jun/30/2015 18:14:33: cfdebug_print: <5>[em1] (3)
Jun/30/2015 18:14:33: cfdebug_print: <3>begin of closure [{] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>[sla-id] (6)
Jun/30/2015 18:14:33: cfdebug_print: <3>[1] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>[sla-len] (7)
Jun/30/2015 18:14:33: cfdebug_print: <3>[8] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of closure [}] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of closure [}] (1)
Jun/30/2015 18:14:33: cfdebug_print: <3>end of sentence [;] (1)
Jun/30/2015 18:14:33: configure_pool: called
Jun/30/2015 18:14:33: clear_poolconf: called
Jun/30/2015 18:14:33: dhcp6_reset_timer: reset a timer on em0, state=INIT,
timeo=0, retrans=960
Jun/30/2015 18:14:34: client6_send: a new XID (bf310c) is generated
Jun/30/2015 18:14:34: copy_option: set client ID (len 14)
Jun/30/2015 18:14:34: copy_option: set elapsed time (len 2)
Jun/30/2015 18:14:34: copyout_option: set IA_PD
Jun/30/2015 18:14:34: client6_send: send solicit to ff02::1:2%em0
Jun/30/2015 18:14:34: dhcp6_reset_timer: reset a timer on em0, state=SOLICIT,
timeo=0, retrans=1069
Jun/30/2015 18:14:34: client6_recv: receive advertise from
fe80::20c:dbff:fef6:1c00%em0 on em0
Jun/30/2015 18:14:34: dhcp6_get_options: get DHCP option IA_PD, len 41
Jun/30/2015 18:14:34: IA_PD: ID=0, T1=0, T2=0
Jun/30/2015 18:14:34: copyin_option: get DHCP option IA_PD prefix, len 25
Jun/30/2015 18:14:34: copyin_option: IA_PD prefix: XXXX:XXX:XXXX:a00::/56
pltime=9000 vltime=14400
Jun/30/2015 18:14:34: dhcp6_get_options: get DHCP option client ID, len 14
Jun/30/2015 18:14:34: DUID: 00:01:00:01:1d:1f:02:b3:d0:50:99:51:78:e8
Jun/30/2015 18:14:34: dhcp6_get_options: get DHCP option server ID, len 14
Jun/30/2015 18:14:34: DUID: 00:01:00:01:1a:bc:08:bf:00:50:56:9b:dd:3c
Jun/30/2015 18:14:34: client6_recvadvert: server ID:
00:01:00:01:1a:bc:08:bf:00:50:56:9b:dd:3c, pref=-1
Jun/30/2015 18:14:34: client6_recvadvert: reset timer for em0 to 0.975240
Jun/30/2015 18:14:36: select_server: picked a server (ID:
00:01:00:01:1a:bc:08:bf:00:50:56:9b:dd:3c)
Jun/30/2015 18:14:36: client6_send: a new XID (32e604) is generated
Jun/30/2015 18:14:36: copy_option: set client ID (len 14)
Jun/30/2015 18:14:36: copy_option: set server ID (len 14)
Jun/30/2015 18:14:36: copy_option: set elapsed time (len 2)
Jun/30/2015 18:14:36: copyout_option: set IA_PD prefix
Jun/30/2015 18:14:36: copyout_option: set IA_PD
Jun/30/2015 18:14:36: client6_send: send request to ff02::1:2%em0
Jun/30/2015 18:14:36: dhcp6_reset_timer: reset a timer on em0, state=REQUEST,
timeo=0, retrans=991
Jun/30/2015 18:14:36: client6_recv: receive reply from
fe80::20c:dbff:fef6:1c00%em0 on em0
Jun/30/2015 18:14:36: dhcp6_get_options: get DHCP option IA_PD, len 41
Jun/30/2015 18:14:36: IA_PD: ID=0, T1=0, T2=0
Jun/30/2015 18:14:36: copyin_option: get DHCP option IA_PD prefix, len 25
Jun/30/2015 18:14:36: copyin_option: IA_PD prefix: XXXX:XXX:XXXX:a00::/56
pltime=9000 vltime=14400
Jun/30/2015 18:14:36: dhcp6_get_options: get DHCP option client ID, len 14
Jun/30/2015 18:14:36: DUID: 00:01:00:01:1d:1f:02:b3:d0:50:99:51:78:e8
Jun/30/2015 18:14:36: dhcp6_get_options: get DHCP option server ID, len 14
Jun/30/2015 18:14:36: DUID: 00:01:00:01:1a:bc:08:bf:00:50:56:9b:dd:3c
Jun/30/2015 18:14:36: get_ia: make an IA: PD-0
Jun/30/2015 18:14:36: update_prefix: create a prefix XXXX:XXX:XXXX:a00::/56
pltime=15199889269544, vltime=14400
Jun/30/2015 18:14:36: ifaddrconf: add an address
XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9/64 on em1
Jun/30/2015 18:14:36: update_ia: T1(4500) and/or T2(7200) is locally determined
Jun/30/2015 18:14:36: dhcp6_remove_event: removing an event on em0,
state=REQUEST
Jun/30/2015 18:14:36: dhcp6_remove_event: removing server (ID:
00:01:00:01:1a:bc:08:bf:00:50:56:9b:dd:3c)
Jun/30/2015 18:14:36: client6_recvreply: got an expected reply, sleeping.
^C
===
We now have a prefix assigned to em1:
===
# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 32768
priority: 0
groups: lo
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
em0: flags=208843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6> mtu 1500
lladdr d0:50:99:51:78:e8
priority: 0
groups: egress
media: Ethernet autoselect (1000baseT full-duplex)
status: active
inet XX.XXX.8.17 netmask 0xffffff80 broadcast XX.XXX.8.127
inet6 fe80::d250:99ff:fe51:78e8%em0 prefixlen 64 scopeid 0x1
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr d0:50:99:51:78:e9
priority: 0
media: Ethernet autoselect (1000baseT
full-duplex,master,rxpause,txpause)
status: active
inet 192.168.212.254 netmask 0xffffff00 broadcast 192.168.212.255
inet6 fe80::d250:99ff:fe51:78e9%em1 prefixlen 64 scopeid 0x2
inet6 XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 prefixlen 64
enc0: flags=0<>
priority: 0
groups: enc
status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
priority: 0
groups: pflog
===
However, no directly connected route for the /64 has been created as a result:
===
# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Mtu Prio Iface
default XX.XXX.8.1 UGS 4 322151 - 8 em0
XX.XXX.8.0/25 link#1 UC 1 0 - 4 em0
XX.XXX.8.1 00:0c:db:f6:1c:00 UHLc 1 0 - 4 em0
XX.XXX.8.17 d0:50:99:51:78:e8 UHLl 0 0 - 1 lo0
XX.XXX.8.127 link#1 UHLb 0 0 - 1 em0
127/8 127.0.0.1 UGRS 0 0 32768 8 lo0
127.0.0.1 127.0.0.1 UHl 1 0 32768 1 lo0
192.168.212/24 link#2 UC 9 0 - 4 em1
192.168.212.1 0c:c4:7a:31:d7:38 UHLc 0 92342 - 4 em1
192.168.212.2 00:25:90:ae:ca:4a UHLc 0 681 - 4 em1
192.168.212.3 b8:27:eb:22:72:8b UHLc 0 1278 - 4 em1
192.168.212.4 b8:27:eb:32:0b:66 UHLc 0 274 - 4 em1
192.168.212.109 50:55:27:f4:ff:82 UHLc 0 1344 - 4 em1
192.168.212.136 ec:a8:6b:f9:6e:35 UHLc 0 1422 - 4 em1
192.168.212.249 58:6d:8f:a0:51:c8 UHLc 0 8 - 4 em1
192.168.212.252 d0:bf:9c:45:0c:a0 UHLc 0 3228 - 4 em1
192.168.212.253 d0:bf:9c:45:0c:a2 UHLc 0 1 - 4 em1
192.168.212.254 d0:50:99:51:78:e9 HLl 0 0 - 1 lo0
192.168.212.255 link#2 UHLb 0 0 - 1 em1
224/4 127.0.0.1 URS 0 0 32768 8 lo0
Internet6:
Destination Gateway Flags Refs
Use Mtu Prio Iface
::/104 ::1 UGRS 0
0 32768 8 lo0
::/96 ::1 UGRS 0
0 32768 8 lo0
default fe80::20c:dbff:fef6:1c00%em0 UG 0
3 - 56 em0
::1 ::1 UHl 14
0 32768 1 lo0
::1 ::1 UH 0
0 32768 4 lo0
::127.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::224.0.0.0/100 ::1 UGRS 0
0 32768 8 lo0
::255.0.0.0/104 ::1 UGRS 0
0 32768 8 lo0
::ffff:0.0.0.0/96 ::1 UGRS 0
0 32768 8 lo0
2002::/24 ::1 UGRS 0
0 32768 8 lo0
2002:7f00::/24 ::1 UGRS 0
0 32768 8 lo0
2002:e000::/20 ::1 UGRS 0
0 32768 8 lo0
2002:ff00::/24 ::1 UGRS 0
0 32768 8 lo0
XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 d0:50:99:51:78:e9 UHLl
0 0 - 1 lo0
fe80::/10 ::1 UGRS 0
0 32768 8 lo0
fe80::%em0/64 link#1 UC 1
0 - 4 em0
fe80::20c:dbff:fef6:1c00%em0 00:0c:db:f6:1c:00 UHLc 1
4 - 4 em0
fe80::d250:99ff:fe51:78e8%em0 d0:50:99:51:78:e8 UHLl 0
0 - 1 lo0
fe80::%em1/64 link#2 UC 0
0 - 4 em1
fe80::d250:99ff:fe51:78e9%em1 d0:50:99:51:78:e9 UHLl 0
0 - 1 lo0
fe80::%lo0/64 fe80::1%lo0 U 0
0 32768 4 lo0
fe80::1%lo0 fe80::1%lo0 UHl 0
0 32768 1 lo0
fec0::/10 ::1 UGRS 0
0 32768 8 lo0
ff01::/16 ::1 UGRS 0
0 32768 8 lo0
ff01::%em0/32 link#1 UC 0
0 - 4 em0
ff01::%em1/32 link#2 UC 0
0 - 4 em1
ff01::%lo0/32 ::1 UC 0
0 32768 4 lo0
ff02::/16 ::1 UGRS 0
0 32768 8 lo0
ff02::%em0/32 link#1 UC 1
0 - 4 em0
ff02::1:2%em0 link#1 UHLc 0
2 - 4 em0
ff02::%em1/32 link#2 UC 0
0 - 4 em1
ff02::%lo0/32 ::1 UC 0
0 32768 4 lo0
===
Leaving this lurking problem for now, we try to enable rtadvd on em1:
===
# rtadvd em1
===
... which fails with the following error:
===
Jun 30 18:17:01 gw01 rtadvd[3118]: non zero router lifetime is specified for
em1, which must not be allowed for hosts. you must change router lifetime or
enable IPv6 forwarding.
===
At this point it is clear we need to enable forwarding again:
===
# sysctl net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1
===
After starting rtadvd, a windows client on the local network configures an
address via SLAAC, and we attempt to ping it from the router which fails:
===
# ping6 XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
PING6(56=40+8+8 bytes) XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 -->
XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
^C
--- XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1 ping6 statistics ---
19 packets transmitted, 0 packets received, 100.0% packet loss
===
The lack of a route for the /64 address on em1 makes the ping
packets go out on em0 instead, which explains why we recieve no
response:
===
# tcpdump -n -e -ttt -i em0 ip6
[...]
Jun 30 19:03:08.625595 00:0c:db:f6:1c:00 d0:50:99:51:78:e8 86dd 70:
XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 > XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1:
icmp6: echo request
Jun 30 19:03:08.625610 d0:50:99:51:78:e8 00:0c:db:f6:1c:00 86dd 70:
XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 > XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1:
icmp6: echo request
Jun 30 19:03:08.625839 00:0c:db:f6:1c:00 d0:50:99:51:78:e8 86dd 70:
XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 > XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1:
icmp6: echo request
[...]
===
If we manually create the route, then the packets stop going out on em0, but
the ping fails with a different error:
===
# route add XXXX:XXX:XXXX:a01::/64 -iface XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9
add net XXXX:XXX:XXXX:a01::/64: gateway XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9
===
===
# ping6 XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
PING6(56=40+8+8 bytes) XXXX:XXX:XXXX:a01:d250:99ff:fe51:78e9 -->
XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
ping6: sendmsg: Invalid argument
ping6: wrote XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1 16 chars, ret=-1
ping6: sendmsg: Invalid argument
ping6: wrote XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1 16 chars, ret=-1
ping6: sendmsg: Invalid argument
===
At the same time we see strange errors in dmesg:
===
[...]
nd6_storelladdr: something odd happens
nd6_storelladdr: something odd happens
nd6_storelladdr: something odd happens
[...]
===
At some point messages like these are generated as well (probably when
the windows machine was trying to perform outbound connections), making
me believe all is not well with the routing table (that address is
inside the /64 network assigned to em1, so it should be considered a
neighbour).
===
nd6_ns_input: NS packet from non-neighbor
nd6_ns_input: src=XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
nd6_ns_input: dst=ff02:2::1:ff51:78e9
nd6_ns_input: tgt=fe80::d250:99ff:fe51:78e9
nd6_ns_input: NS packet from non-neighbor
nd6_ns_input: src=XXXX:XXX:XXXX:a01:ecc3:2959:1362:32f1
nd6_ns_input: dst=ff02:2::1:ff51:78e9
nd6_ns_input: tgt=fe80::d250:99ff:fe51:78e9
===
In summary, the problems we face are these:
* Having ip6 forwarding enabled disables the possibility to learn routes
via SLAAC, this is necessary in a SOHO situation like this.
* When dhcp6c assigns the prefix on em1, no directly connected
route for that network is created.
* Even when assigning the route manually, it seems the 5.7 machine is not
happy. This is different from 5.6, where adding the route manually made the
ping packets start working.
Any input on this would be much appreciated! As a side note, related to
the "should i handle RAs when I am a router": another friend noted that the
Linux camp allows two levels of this setting:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt:
===
accept_ra - INTEGER
Accept Router Advertisements; autoconfigure using them.
It also determines whether or not to transmit Router
Solicitations. If and only if the functional setting is to
accept Router Advertisements, Router Solicitations will be
transmitted.
Possible values are:
0 Do not accept Router Advertisements.
1 Accept Router Advertisements if forwarding is disabled.
2 Overrule forwarding behaviour. Accept Router Advertisements
even if forwarding is enabled.
Functional default: enabled if local forwarding is disabled.
disabled if local forwarding is enabled.
===
So basically, setting it to 0 disables the handling of router advertisements,
setting it to 1 accepts them given that forwarding is disabled (pretty close
to what we are seeing OpenBSD doing right now when handling of RAs are enabled)
and 2 makes it handle the RAs without any regard of forwarding status (what we
would probably need in this SOHO case).
--
Patrik Lundin