IPv6的正确路由

IPv6的正确路由

我有一个 Raspberry Pi 通过 eth0 连接到路由器,并通过 eth1 连接到我的计算机。

我使用 systemd-networkd 将 IPv4 伪装到我的电脑上,效果非常好。由于某些原因,我现在需要在两个设备上都使用一个有效的全局 IPv6 地址。我的 Pi 已经配置了一个静态有效的全局 IPv6 地址,并且我在 Pi 上运行了 radvd,它将 IPv6 地址分发给我的电脑(稍后我也希望我的 wifi 也能这样做)。

根据一些线索,我在过去的几天里尝试让这个工作(最重要的是IPv6 路由公共到子网)我找到了一些东西,这让我得到了这个:

  1. 我可以通过本地 IPv6 地址 (fe80) 对这两个设备执行 ping 操作。
  2. 我的 Pi 可以通过 IPv6 连接到外界。
  3. 我的计算机无法 ping 通任何全球地址,甚至无法 ping 通我的 Pi,更不用说通过 IPv6 访问互联网了。
  4. 我无法从 Pi 上 ping 计算机的全局 IPv6 地址,请求可以通过,但会被忽略(tcpdump -i eno1 看到 ping)。
  5. 从我的计算机上执行的任何 ping 操作都会被路由到我的 Pi (tcpdump -i eth0),而 Pi 又将其转发到全球互联网。它也会得到响应,但只有邻居请求请求,它会忽略这些请求(tcpdump -i eth1)。
  6. 我尝试使用 ndppd,但我想我必须确保我的 Pi 和计算机能够相互 ping 通,然后再深入研究这个问题。

所以我的猜测是,必须对我的路由表进行一些操作才能接受请求,但我只是不知道该怎么做。

这是我的相关配置和日志文件:

电脑:

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 { }]

圆周率:

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;
};

如果您需要任何其他日志,请说明。我从 pi 中省略了 tcpdump,因为它看起来几乎相同,但如果需要,我也可以添加它。

如果您有任何想法请告诉我。

答案1

因此,我关于错误路由的假设被证明是正确的。以下是我仅使用 systemd-networkd 和 radvd 解决该问题的方法,尽管它需要根据我的口味进行大量手动调整:

在 pi 上将以下内容添加到配置中:

让 pi 回答邻居对计算机 IP 的请求:

eth0.network (Connected to the internet)

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

使 Pi 将计算机的所有流量转发到计算机的本地 ipv6 地址:

eth1.network (connected to pc)

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

使获取 ip 的设备通过 pi 的本地 ip 转发 Pi 的全局 ip 的所有流量:

radvd.conf

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

只要 ipv6 地址不改变,这对我来说就有效。我还没有找到无需手动配置文件即可更改这些地址的解决方案,但至少它是这样。

相关内容