我有一个 Raspberry Pi 通过 eth0 连接到路由器,并通过 eth1 连接到我的计算机。
我使用 systemd-networkd 将 IPv4 伪装到我的电脑上,效果非常好。由于某些原因,我现在需要在两个设备上都使用一个有效的全局 IPv6 地址。我的 Pi 已经配置了一个静态有效的全局 IPv6 地址,并且我在 Pi 上运行了 radvd,它将 IPv6 地址分发给我的电脑(稍后我也希望我的 wifi 也能这样做)。
根据一些线索,我在过去的几天里尝试让这个工作(最重要的是IPv6 路由公共到子网)我找到了一些东西,这让我得到了这个:
- 我可以通过本地 IPv6 地址 (fe80) 对这两个设备执行 ping 操作。
- 我的 Pi 可以通过 IPv6 连接到外界。
- 我的计算机无法 ping 通任何全球地址,甚至无法 ping 通我的 Pi,更不用说通过 IPv6 访问互联网了。
- 我无法从 Pi 上 ping 计算机的全局 IPv6 地址,请求可以通过,但会被忽略(tcpdump -i eno1 看到 ping)。
- 从我的计算机上执行的任何 ping 操作都会被路由到我的 Pi (tcpdump -i eth0),而 Pi 又将其转发到全球互联网。它也会得到响应,但只有邻居请求请求,它会忽略这些请求(tcpdump -i eth1)。
- 我尝试使用 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 地址不改变,这对我来说就有效。我还没有找到无需手动配置文件即可更改这些地址的解决方案,但至少它是这样。