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