Skip to main content

Sinds vorig jaar september heb ik KPN glasvezel in huis. In plaats van de standaard modem/router gebruik ik een PCengines apu1c4 met daarop NixOS (Linux) als router. Initieel heb ik alleen IPv4 geconfigureerd, omdat ik enerzijds niet wist dat IPv6 beschikbaar was op het KPN netwerk, maar vooral omdat ik nog geen kaas heb gegeten van IPv6.
 
Een paar dagen geleden heb ik de sprong in het diepe gemaakt en geprobeerd om IPv6 op de router te configureren. Ik ben een end gekomen maar zit nu vast. Ik hoop dat iemand me hier verder kan helpen.
 
De ppp daemon krijgt naast een IPv4 adres ook een IPv6 (link local fe80::xxx) adres. Vervolgens draai ik dhcpcd om de prefix delegation aan te vragen voor de interne interfaces. Dat werkt, en ik krijg op elke interne interface een publiek IPv6 /64 netwerk in de range 2a02:xxx. Daarnaast draai ik CoreRAD (alternatief voor radvd) om hosts op mijn netwerk een IPv6 adres uit te delen. Tot zover werkt alles.
 
Wat uitblijft is een default route voor IPv6. Dhcpcd klaagt uiteindelijk dat er geen routers kunnen worden gevonden:

dhcpcdp12124]: ppp0: no IPv6 Routers available

Via tcpdump zie ik dat dhcpcd wel routing solicitation (RS) requests naar buiten stuurt (naar ff02::2) maar daar nooit een routing advertisement (RA) als antwoord op krijgt.
 
Mijn eerste vermoeden was dat de firewall niet goed configureerd was (ik accepteerde DHCPv6 en ICMPv6 op ppp0 naar fe80::/64). Maar ook nu ik met een volledig open IPv6 firewall draai ontvangt de router geen RA berichten. In de tcpdump zie ik alleen de DHCPv6 request, response, en vervolgens de RS requests.
 
Na tevergeefs veel verschillende settings te hebben uitgeprobeerd voor ppp en dhcpcd, heb ik een default route met de hand op de ppp0 interface geconfigureerd:

ip -6 route add default dev ppp0 scope link

Tot mijn verbazing kan ik nu vanaf de router pingen naar publieke IPv6 hosts (ping -6 google.com) en ook een curl naar ipv6.canhazip.com laat zien dat de router inderdaad over IPv6 naar buiten kan communiceren. Helaas "zien" de hosts op mijn netwerk de default route niet en kunnen dus niet naar buiten toe pingen. Misschien is dit iets wat ik in de CoreRAD config kan fixen.

Mijn vraag:
Klopt mijn assumptie dat dhcpcd via RS een RA hoort te krijgen van KPN? of hoort de ppp daemon de default route in te stellen? (zoals ik nu met de hand heb gedaan)
 
Misschien niet relevant, maar dhcpcd klaag elke 30 seconde over:

dhcpcdd12124]: route socket overflowed - learning interface state


Versies:
- ppp 2.4.8
- dhcpcd 8.1.4
- linux 5.10.37
 
ppp config:
 

plugin rp-pppoe.so internet

name "kpn"
noauth
hide-password

debug

+ipv6
ipv6cp-accept-local
# ipv6cp-use-ipaddr
# ipv6cp-use-persistent
noipdefault
defaultroute

persist
maxfail 0
holdoff 5

# lcp-echo-interval 15
# lcp-echo-failure 3
mtu 1500
mru 1500

dhcpcd config:

# Inform the DHCP server of our hostname for DDNS.
hostname

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes, ntp_servers, interface_mtu

# A ServerID is required by RFC2131.
# Commented out because of many non-compliant DHCP servers in the wild :(
#require dhcp_server_identifier

# A hook script is provided to lookup the hostname if not set by
# the DHCP server, but it should not be run by default.
nohook lookup-hostname

# Ignore peth* devices; on Xen, they're renamed physical
# Ethernet cards used for bridging. Likewise for vif* and tap*
# (Xen) and virbr* and vnet* (libvirt).
denyinterfaces br0 enp1s0 guest internet iot iptv telephony vpn enp2s0 enp3s0 ve-* vb-* lo peth* vif* tap* tun* virbr* vnet* vboxnet* sit*

# Use the list of allowed interfaces if specified
allowinterfaces ppp0

# Immediately fork to background if specified, otherwise wait for IP address to be assigned
waitip



clientid
option rapid_commit
option interface_mtu
require dhcp_server_identifier
noipv6rs
ipv6only
waitip 6

interface ppp0
ipv6rs
iaid 1
ia_pd 1 br0/0 guest/10 iot/11

sysctl:

net.ipv4.conf.all.forwarding = 1
net.ipv6.conf.all.forwarding = 1

net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.all.use_tempaddr = 0

net.ipv6.conf.ppp0.accept_ra = 2
net.ipv6.conf.ppp0.autoconf = 1

 

Ik heb een Experiabox die de routing verzorgt, dus ik kan niet uit ervaring spreken. Ik had een HE-tunnel met een routed subnet, daar volstond een default route naar de tunnel interface, dus het verbaast me niet als dat met de ppp0 ook zo werkt. Om de default route verder te zetten moet “radvd” geconfigureerd worden, met een entry in /etc/radvd.conf voor iedere interface. Iedere aangesloten PC gaat dan wijzen dan naar het link-local adres van de betreffende interface voor de default route, die dan naar ppp0 forward.

 


Bedankt voor je antwoord! Met die kennis nog is gekeken naar de ppp opties: en er is dus een optie genaamd “defaultroute6” die ik tot nu toe compleet over het hoofd heb gezien :sweat_smile: Na een reboot stelt de ppp daemon nu correct de default IPv6 route in. Ook lijkt de default route nu goed te worden geprogageert naar de hosts, ook daar kan ik nu vanaf pingen :relaxed:


Hi, zou je misschien je config willen delen? Ik ben ook bezig met nixos, maar corerad lukt me nog niet te configgen.

dank!


Hoi Jsimon,

Leuk om te horen dat je ook NixOS gebruikt!

Mijn config is een beetje complex (heb meerdere VLANs) en er zitten wat secrets in verwerkt. Ik heb de relevante config in deze gist gezet: https://gist.github.com/c0deaddict/64cc4ee262e428e8d8ff4fe507ab1f9b

Wat ontbreekt in de gist is de firewall config. Ik gebruik sinds kort nftables in plaats van de default iptables, en de config is nog een beetje warrig. Het belangrijkste is dat je DHCPv6 (sport 547 dport 546) toelaat vanaf fe80::/10 naar fe80::/10.

Laat maar weten of het lukt! Als nodig kan ik mijn nftables config ook delen.


Super bedankt! Uiteraard vergeten de DHCPv6 toe te staan. Nu werkt het :)
 

Mini tipjes van mijn kant:

Als je `password "kpn"` toevoegd in je ppp configuratie dan hoef je geen pap secrets file aan te maken.

De recente corecad versie kun je `rdnss = { servers = "::" ]; }];` doen en dan pakt ie automatisch het interface IP om als dns te adverteren.


Mooi dat het werkt!

Bedankt voor de tips, dat maakt mijn config weer iets mooier :)