Raspberry-Pi

IPv6的正確路由

  • February 12, 2020

我有一個 Raspberry Pi 通過 eth0 連接到路由器並通過 eth1 連接到我的電腦。

我使用 systemd-networkd 將 IPv4 偽裝到我的電腦上,這就像一個魅力。由於某些原因,我現在需要在兩台設備上都有一個有效的全球 IPv6 地址。我的 Pi 已經配置了一個靜態工作的全域 IPv6 地址,並且我在 Pi 上執行了 radvd,它將 IPv6 地址分發給我的電腦(稍後我也希望我的 wifi 也這樣做)。

根據一些線索,我在最近幾天試圖讓這個工作(最重要的是IPv6 路由 Public 到子網)我能夠找到一些東西,這讓我有了這個:

  1. 我可以通過它們的本地 IPv6 地址 (fe80) ping 兩個設備。
  2. 我的 Pi 可以通過 IPv6 連接到外部世界。
  3. 我的電腦無法 ping 任何全球地址,甚至連我的 Pi 也不能,更不用說通過 IPv6 訪問網際網路了。
  4. 我無法從我的 Pi ping 我的電腦的全域 IPv6 地址,請求通過,但被忽略(tcpdump -i eno1 看到 ping)。
  5. 從我的電腦 ping 任何東西都會被路由到我的 Pi (tcpdump -i eth0),然後將它轉發到全球網際網路。它也得到一個響應,但只有它忽略的鄰居請求請求(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,因為它看起來幾乎相同,但如果需要,我也可以添加它。

如果您有任何想法,請告訴我。

所以它證明了我關於錯誤路由的假設是正確的。以下是我僅使用 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 地址不改變,這對我有用。我還沒有找到無需手動配置文件即可更改這些地址的解決方案,但至少它是一些東西。

引用自:https://unix.stackexchange.com/questions/566508