On Sat, Jul 13, 2019 at 12:15:30PM +0200, Stefan Hagen wrote: > Hello, > > I have a question regarding the IPv6 behavior of OpenBSD compared to > Linux/FreeBSD. I tried to configure a static IPv6 address on my VPS. > > From my provider, I got the following data: > > IP Address: 2a01:4f8:c2c:76ef::/64 > Gateway: fe80::1 > > So I configured my interface: > > $ cat /etc/hostname.vio0 > inet6 2a01:4f8:c2c:76ef::1 128 > > $ cat /etc/mygate > fe80::1%vio0 > > Which results in: > vio0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 > lladdr 96:00:00:2a:a9:8b > index 1 priority 0 llprio 3 > groups: egress > media: Ethernet autoselect > status: active > inet6 fe80::72f2:b265:b89c:b4ec%vio0 prefixlen 64 scopeid 0x1 > inet6 2a01:4f8:c2c:76ef::1 prefixlen 128 > > $ route -n show > Internet6: > Destination Gateway Flags Refs Use Mtu Prio Iface > default fe80::1%vio0 UGS 0 26 - 8 vio0 > [...] > > $ ndp -an > Neighbor Linklayer Address Netif Expire S Flags > 2a01:4f8:c2c:76ef::1 96:00:00:2a:a9:8b vio0 permanent R l > fe80::1%vio0 d2:74:7f:6e:37:e3 vio0 8h32m58s S R > fe80::3452:7ff:fe83:fa7b%vio0 d2:74:7f:6e:37:e3 vio0 10h9m34s S R > fe80::72f2:b265:b89c:b4ec%vio0 96:00:00:2a:a9:8b vio0 permanent R l > > While this configuration (just setting IP and gateway) leads to a > working IPv6 connectivity on Linux and FreeBSD, it does not on OpenBSD > and it took me while to figure out why. > > While pinging an IPv6 only address, tcpdump revealed the following line > repeating over and over again: > > $ tcpdump -i vio0 ip6 > [...] > 21:50:58.688256 fe80::3896:ecff:fe78:2702 > ff02::1:ff2a:a98b: \ > icmp6: neighbor sol: who has fe80::9400:ff:fe2a:a98b > [...] > > I then added the address fe80::9400:ff:fe2a:a98b as alias to my > interface. > > Now IPv6 works like a charm: > > $ ifconfig vio0 > vio0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 > lladdr 96:00:00:2a:a9:8b > index 1 priority 0 llprio 3 > groups: egress > media: Ethernet autoselect > status: active > inet 116.203.83.222 netmask 0xffffffff > inet6 fe80::72f2:b265:b89c:b4ec%vio0 prefixlen 64 scopeid 0x1 > inet6 2a01:4f8:c2c:76ef::1 prefixlen 128 > inet6 fe80::9400:ff:fe2a:a98b%vio0 prefixlen 64 scopeid 0x1 > > $ ndp -an > Neighbor Linklayer Address Netif Expire S Flags > 2a01:4f8:c2c:76ef::1 96:00:00:2a:a9:8b vio0 permanent R l > fe80::1%vio0 d2:74:7f:6e:37:e3 vio0 8h20m39s S R > fe80::3452:7ff:fe83:fa7b%vio0 d2:74:7f:6e:37:e3 vio0 9h57m15s S R > fe80::72f2:b265:b89c:b4ec%vio0 96:00:00:2a:a9:8b vio0 permanent R l > fe80::9400:ff:fe2a:a98b%vio0 96:00:00:2a:a9:8b vio0 permanent R l > > My assumption is, that the gateway definition of fe80::1 instructs the OS to > "look around for a router". The router then offers(?) a new fe80 Address to > communicate with my interface. But my interface doesn't know > about it and ignores the request. > > My assumption is probably wrong. Can someone help me to understand this > scenario and how to make it work in OpenBSD without having to play with > tcpdump? > > Wasn't the router supposed to talk to me via fe80::72f2:b265:b89c:b4ec? > Or should OpenBSD have assigned fe80::9400:ff:fe2a:a98b automatically as > alias? > > Compared with FreeBSD on a VM next to the OpenBSD one: > > $ ifconfig vtnet0 > vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 > options=[...line too long...] > ether 96:00:00:2a:c9:de > inet6 2a01:4f8:c2c:70f1::1 prefixlen 64 > inet6 fe80::9400:ff:fe2a:c9de%vtnet0 prefixlen 64 scopeid 0x1 > inet 116.203.86.85 netmask 0xffffffff broadcast 116.203.86.85 > media: Ethernet 10Gbase-T <full-duplex> > status: active > nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> > > Here I see fe80::9400:ff:fe2a:c9de%vtnet0 set as local alias > automatically. I'm not sure how this address is being generated and/or > communicated between the OS and the router. But apparently there is a > mismatch between router and OpenBSD, but not on Linux and FreeBSD. > > Am I missing something? >
OpenBSD has RFC7217 enabled by default. This means your LL address does not embed your MAC address. Use "ifconfig vio0 -soii" to disable that behavior (see ifconfig(8) for details).