noqqe » blog | sammelsurium | photos | projects | about

OpenBSDs IPv6 on Vultr

2018-02-04 @ IPv6, OpenBSD, vultr

Es ist ein nie enden wollendes Thema dieses Blogs zu erklären wie man IPv6 konfiguriert. Auf Vultr läuft so die eine oder andere meiner Maschinen und das bisher ohne v6. Die Konfiguration verlief nicht so reibungslos wie die letzten male, weshalb dieser Post viel mehr Details enthält und ich nun viel besser verstehe was eigentlich passiert!

In den Settings zeigt einem das Webinterface von Vultr die v6 Adresse die man für seine VM benutzen kann daneben der Hinweis:

Gateway: (use router discovery)

Cool, dachte ich. Das kenne ich ja schon. In den Beispielen wird für OpenBSD aber noch die bereits deaktivierte Option für hostname.if rtsol empfohlen.

Das funktioniert schonmal nicht, aber gut. Hab den Support zumindest mal darauf hingewiesen. Mal sehen ob sie antworten.

Wie man eine statische IP und Router Discovery unter OpenBSD konfiguriert hier der Vollständigkeit halber nochmal.

$ cat /etc/hostname.vio0
dhcp
inet6 2001:19f0:6c01:db:5400:00ff:fe69:d0d4 64
inet6 autoconf

Die Konfiguration mittels /etc/netstart vio0 angewendet. Passiert nichts. route -n show ausgeführt, aber in dem Wust kein Default Gateway für v6 finden können. Was nun. Wie läuft das eigentlich genau? Darum geht es hier in diesem Post.

Ich fing etwas an zu kramen und fand heraus, dass slaacd(8) die Konfiguration meines Default Gateways zuständig ist. Ein kurzes ps aux bestätigte auch das dieser Daemon läuft. Den Daemon neu gestartet, rcctl restart slaacd. Weiterhin ließ mich ping6 heise.de enttäuscht zurück.

Ich begann die Manpage zu lesen.

slaacd(8)

It listens for IPv6 router advertisement messages on interfaces with the AUTOCONF6 flag set.

Das heisst… das die int6 autoconf Option das ich oben in /etc/hostname.vio0 setzte nichts anderes tut als…

# ifconfig vio0
vio0: flags=208843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6> mtu 1500

Genau! ifconfig setzt einfach nur das Flag am Interface, damit ein Daemon es später wieder finden kann. Wieder so ein “Aha, geil!” Moment im Umgang mit OpenBSD. Am Ende der Manpage ist auch das Client Programm referenziert mit dem ich mit slaacd kommunizieren kann: slaacctl(8).

$ slaacctl show interface vio0
vio0:
         index:   1 running: yes privacy: yes
        lladdr: 56:00:00:69:8c:bf
         inet6: fe80::5400:ff:fe69:8cbf%vio0

Das sieht erstmal nicht so aus als wäre die Router Discovery erfolgreich gewesen. Nur die poplige fe80 Adresse. Irgendwas fehlte. Liegts an mir? Oder vielleicht ist einfach Infrastruktur von Vultr genau so fehlerhaft wie die Doku? Als ich dann nochmal die Manpage öffnete und “It listens […]” laß klingelte nochmal was im Hinterkopf. Firewall! IPv6 nutzt das ICMPv6 Protokoll um Neighbor Discovery und Router Advertisements zu verschicken. Meine pf Settings lehnen aber all das erstmal ab.

# Allow receiving ipv6 types
icmp6types = "{128, 133, 134, 135, 136, 137}"
pass in quick on $extif inet6 proto ipv6-icmp icmp6-type $icmp6types keep state

Aber das lässt sich natürlich ändern. Um via pf eine Hand voll ICMPv6 Types zuzulassen, kann man wie oben gezeigt vorgehen. Welche Codes man genau braucht einfach in Wikipedia/RFC nachlesen.

Aber jetzt…

pfctl -f /etc/pf.conf
sh /etc/netstart vio0
rcctl restart slaacd

und zack, hab ich ein funktionierendes v6.

# slaacctl show interface vio0
vio0:
         index:   1 running: yes privacy: yes
        lladdr: 56:00:00:6e:5a:b9
         inet6: fe80::5400:ff:fe6e:5ab9%vio0
        Router Advertisement from fe80::fc00:ff:fe6e:5ab9%vio0
                received: 2018-02-04 16:11:41; 342s ago
                Cur Hop Limit:  64, M: 0, O: 0, Router Lifetime:  1800s
                Default Router Preference: Medium
                Reachable Time:         0ms, Retrans Timer:         0ms
                prefix: 2001:19f0:6c01:232::/64
                        On-link: 1, Autonomous address-configuration: 1
                        vltime:    2592000, pltime:     604800
                rdns: 2001:19f0:300:1704::6, lifetime: 3600
        Address proposals
                id:    2, state:      CONFIGURED, privacy: y
                vltime:     589027, pltime:      70493, timeout:      68838s
                updated: 2018-02-04 15:50:04; 1640s ago
                2001:19f0:6c01:232:782f:b082:b044:b5ef, 2001:19f0:6c01:232::/64
                id:    1, state:      CONFIGURED, privacy: n
                vltime:    2592000, pltime:     604800, timeout:     604443s
                updated: 2018-02-04 16:11:41; 342s ago
                2001:19f0:6c01:232:5400:ff:fe6e:5ab9, 2001:19f0:6c01:232::/64
        Default router proposals
                id:    3, state:      CONFIGURED
                router: fe80::fc00:ff:fe6e:5ab9%vio0
                router lifetime:       1800
                Preference: Medium
                updated: 2018-02-04 16:11:41; 342s ago, timeout:       1443s

Und sogar ping6 heise.de tickt fröhlich vor sich hin.

Warum schreibe ich das alles? Es war ein sehr großer Spass für mich zu “entdecken” wie das eigentlich funktioniert und demonstriert einmal mehr wie einfach Dinge sein können wenn man das richtige OS benutzt. Etwas das man sich auch nur leisten kann, wenn Kernel und Userland vom selben Team entwickelt werden.