Raspberry-Pi
IPv6的正確路由
我有一個 Raspberry Pi 通過 eth0 連接到路由器並通過 eth1 連接到我的電腦。
我使用 systemd-networkd 將 IPv4 偽裝到我的電腦上,這就像一個魅力。由於某些原因,我現在需要在兩台設備上都有一個有效的全球 IPv6 地址。我的 Pi 已經配置了一個靜態工作的全域 IPv6 地址,並且我在 Pi 上執行了 radvd,它將 IPv6 地址分發給我的電腦(稍後我也希望我的 wifi 也這樣做)。
根據一些線索,我在最近幾天試圖讓這個工作(最重要的是IPv6 路由 Public 到子網)我能夠找到一些東西,這讓我有了這個:
- 我可以通過它們的本地 IPv6 地址 (fe80) ping 兩個設備。
- 我的 Pi 可以通過 IPv6 連接到外部世界。
- 我的電腦無法 ping 任何全球地址,甚至連我的 Pi 也不能,更不用說通過 IPv6 訪問網際網路了。
- 我無法從我的 Pi ping 我的電腦的全域 IPv6 地址,請求通過,但被忽略(tcpdump -i eno1 看到 ping)。
- 從我的電腦 ping 任何東西都會被路由到我的 Pi (tcpdump -i eth0),然後將它轉發到全球網際網路。它也得到一個響應,但只有它忽略的鄰居請求請求(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,因為它看起來幾乎相同,但如果需要,我也可以添加它。
如果您有任何想法,請告訴我。
所以它證明了我關於錯誤路由的假設是正確的。以下是我僅使用 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 地址不改變,這對我有用。我還沒有找到無需手動配置文件即可更改這些地址的解決方案,但至少它是一些東西。