pppd and IPv6 routes
Mikulas Patocka <[email protected]> Mon, 13 Apr 2026 14:37:51 +0200 (CEST)
| Newsgroups | org.kernel.vger.linux-ppp |
|---|---|
| Message-ID | <[email protected]> |
Hi
I have a problem with pppd and IPv6. I use pppd 2.4.9 from Debian 12.
I get this ppp0 device from my ISP (using ppp-over-ethernet):
23: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 state UNKNOWN qlen 3
inet6 2a00:1028:8391:4349:4839:8541:daa4:adcf/64 scope global dynamic mngtmpaddr
valid_lft 86287sec preferred_lft 3487sec
inet6 fe80::4839:8541:daa4:adcf peer fe80::e681:84ff:fec2:4b34/128 scope link
valid_lft forever preferred_lft forever
I run wide-dhcpv6-client, it sends "dhcp6 solicit" to "ff02::1:2":
fe80::4839:8541:daa4:adcf.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
I receive dhcp6 advertise from the ISP:
e681:84ff:fec2:4b34.dhcpv6-server > fe80::4839:8541:daa4:adcf.dhcpv6-client: dhcp6 advertise
The problem is that the kernel doesn't pass the packet to the dhcp6c
daemon, it rejects the packet with a redirect to itself:
fe80::4839:8541:daa4:adcf > fe80::e681:84ff:fec2:4b34: ICMP6, redirect, fe80::4839:8541:daa4:adcf to fe80::4839:8541:daa4:adcf, length 176
According to RFC, redirect to itself means that the sender should send the
packet to the same interface to a different host.
"ping fe80::e681:84ff:fec2:4b34%ppp0" also doesn't work - tcpdump shows
that the reply arrives, but the kernel rejects it with a redirect to
itself.
There are the following routes set up on the ppp0 interface:
anycast 2a00:1028:8391:4349:: dev ppp0 proto kernel metric 0 pref medium
2a00:1028:8391:4349::/64 dev ppp0 proto kernel metric 256 expires 85949sec pref medium
fe80::fe80::4839:8541:daa4:adcf dev ppp0 proto kernel metric 256 pref medium
fe80::e681:84ff:fec2:4b34 dev ppp0 proto kernel metric 256 pref medium
multicast ff00::/8 dev ppp0 proto kernel metric 256 pref medium
default via fe80::e681:84ff:fec2:4b34 dev ppp0 proto ra metric 1024
expires 4049sec hoplimit 64 pref medium
If I delete the route to "fe80::fe80::4839:8541:daa4:adcf" and add the
same route with the "local' specifier, the problem is fixed, ping works
and dhcp6c correctly receives the responses and sets up IPv6 addresses in
the inner network:
# ip -6 route del fe80::4839:8541:daa4:adcf dev ppp0
# ip -6 route add local fe80::4839:8541:daa4:adcf dev ppp0
So, the question is - why doesn't pppd set the local route as "local"? Is
it a bug in pppd? Or a bug in the kernel?
I tried to set up the local route in
/etc/ppp/ipv6-up.d/wide-dhcpv6-client, but it is not reliable, sometimes
it works and sometimes it doesn't, the script is probably racing with pppd
setting the routes:
#!/bin/sh
sleep 3
ip -6 route del "$PPP_LOCAL" dev ppp0
ip -6 route add local "$PPP_LOCAL" dev ppp0
systemctl restart wide-dhcpv6-client.service
Mikulas