1

I have a Raspberry Pi connected via eth0 to a router and via eth1 to my computer.

I use systemd-networkd to masquerade IPv4 to my computer which works like a charm. Because of some reasons I now need a working global IPv6 address on both devices. My Pi already has a static working global IPv6 address configured and I have radvd running on Pi which is handing out IPv6 addresses to my computer (later I also want my wifi to do the same).

Following some clues I picked up the last few days trying to get this working (most importantly IPv6 routing Public to a subnetwork) I was able to find out some stuff, which leaves me with this:

  1. I am able to ping both devices via their local IPv6 addresses (fe80).
  2. My Pi can connect to the outside world via IPv6.
  3. My computer can't ping any global addresses, not even the one of my Pi, let alone acces the internet through IPv6.
  4. I cannot ping the global IPv6 address of my computer from my Pi, requests get through, but are ignored (tcpdump -i eno1 sees the ping).
  5. Pinging anything from my computer gets routed to my Pi (tcpdump -i eth0), which in turn forwards it to the global internet. It also gets a response but then only neighbor solicitation requests which it just ignores (tcpdump -i eth1).
  6. I tried using ndppd but I think I have to make sure my Pi and computer are able to ping each other before digging deeper into this.

So my guess is that something has to be done with my routing tables to accept requests, but I just cannot figure out what to do.

Here are my related config and log files:

Computer:

ip -6 route show:
::1 dev lo proto kernel metric 256 pref medium
fe80::/64 dev eno1 proto kernel metric 100 pref medium
default via fe80:...:b8 dev eno1 proto ra metric 20100 pref medium
tcpdump (filtered):
time IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) ArchPC > ff02::1:ff00:2: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has ***.****.de
          source link-address option (1), length 8 (1): 1c:1b:0d:9b:bc:ba
            0x0000:  1c1b 0d9b bcba
time IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) _gateway > ArchPC: [icmp6 sum ok] ICMP6, neighbor advertisement, length 24, tgt is _gateway, Flags [router, solicited]
time IP6 (flowlabel 0xa91bf, hlim 64, next-header ICMPv6 (58) payload length: 64) ArchPC > ***.****.de: [icmp6 sum ok] ICMP6, echo request, seq 1
time IP6 (flowlabel 0xfa9b8, hlim 255, next-header ICMPv6 (58) payload length: 88) _gateway > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 88
        hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
          prefix info option (3), length 32 (4): 2001:...::/64, Flags [onlink, auto, router], valid time 86400s, pref. time 14400s
            0x0000:  40e0 0001 5180 0000 3840 0000 0000 2001
            0x0010:  07c7 20f4 001d 0000 0000 0000 0000
          rdnss option (25), length 24 (3):  lifetime 600s, addr: ***.****.de
            0x0000:  0000 0000 0258 2001 07c7 20f4 001d 0000
            0x0010:  0000 0000 0002
          mtu option (5), length 8 (1):  1280
            0x0000:  0000 0000 0500
          source link-address option (1), length 8 (1): 00:e0:4c:82:00:b8
            0x0000:  00e0 4c82 00b8
time IP6 (hlim 1, next-header Options (0) payload length: 56) ArchPC > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, multicast listener report v2, 2 group record(s) [gaddr ff02:...:5bbf to_ex { }] [gaddr ff02:...:d60f to_ex { }]

Pi:

ip -6 route show (I added the second one, global ip of computer to local):
::1 dev lo proto kernel metric 256 pref medium
2001:...:5bbf via fe80:...d60f dev eth1 proto ra metric 256 pref medium
2001:...::/64 dev eth0 proto ra metric 256 pref medium
fe80:...:d60f/64 dev eth1 proto kernel metric 1024 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
default via 2001:...:1 dev eth0 proto ra metric 1024 pref medium
Radvd.conf:
interface eth1{
    AdvSendAdvert on;
    RDNSS IPv6 of Pi {};
    prefix 2001:...::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
    AdvSourceLLAddress on;
    AdvLinkMTU 1280;
};

If you need any other logs please say so. I ommited the tcpdump from the pi because it looks pretty much the same, but if needed I can add it as well.

If you have any ideas please let me know.

0

So it turns my assumption about wrong routing turned out right. Here is how I solved it using only systemd-networkd and radvd, even though it needs to much manual tweaking for my taste:

On the pi add the following things to the configuration:

Make the pi answer to neighbor solicitations for ip of computer:

eth0.network (Connected to the internet)

IPv6ProxyNDP=true
IPv6ProxyNDPAddress=2001:...:5bbf

Makes the Pi forward all traffic for computer to the local ipv6 address of the computer:

eth1.network (connected to pc)

[Route]
Destination=2001:...:5bbf
Gateway=fe80:...:d60f

Makes the devices getting the ip forward all traffic for the global ip of Pi via the local ip of the pi:

radvd.conf

interface eth1
{
    AdvSendAdvert on;
    prefix 2001:...::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
    route 2001:...::/64{};
};

As long as the ipv6 addresses don't change this works for me. I have not found a solution for changing those addresses without having to manually configure the files, but at least its something.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.