目標
我正在嘗試設定僅使用 IPv6 的 WireGuard VPN,我 (a) 希望透過該 VPN 路由所有流量,並且 (b) 使用可從互聯網存取的伺服器。因為我甚至無法讓 (a) 工作,所以我只是嘗試讓它工作,(b) 只是為了上下文。
我有一個具有全球可路由 IPv6 的 VPS,2a03:4000:xx:xx:18d7:b1ef:fe48:7d35/64
(這就是ip a
告訴我的)eth0
。我將用主機名稱來引用它vps
。出於測試目的,伺服器沒有防火牆,net.ipv6.conf.all.forwarding=1
並且
net.ipv6.conf.all.accept_ra=2
。
2001:1715:yy:yy:db2d:ab24:ed3f:39d4/64
然後我還打開了我的設備,它也有一個 IPv6 位址wlan0
(這不應該是相關訊息,因為當我在另一個 WLAN 上時,此位址會發生變化)。它帶有主機名稱laptop
。
我想得到這樣的結果:
Internet <-> vps <-> laptop
對於 IPv4,我會使用 NAT,但在 IPv6 世界中,不鼓勵使用 NAT。很難找出該怎麼做,但如果我讀得正確,那麼我應該從2a03:4000:xx:xx::/64
VPS 到達筆記型電腦的區塊中提供另一個 IP 位址。
設定
所以我寫了這兩個wireguard配置:
虛擬專用伺服器:
[Interface]
Address = fc01::1/128 # Shouldn't really matter?
ListenPort = 1935 # This port is open to UDP on most networks
PrivateKey = uLxxxxxxxxxxxxxxxxxxxxxxxxEQ=
[Peer]
# laptop
PublicKey = swxxxxxxxxxxxxxxxxxxxxxxxxxmQ=
AllowedIPs = 2a03:4000:xx:xx:ffff::3/128 # Is inside the vps' /64 block
筆記型電腦:
[Interface]
Address = 2a03:4000:xx:xx:ffff::3/128 # The globally routable IP addr of my laptop via the vps
ListenPort = 1935
PrivateKey = yMxxxxxxxxxxxxxxxxxxxxxxxxxxxxm8=
[Peer]
PublicKey = pCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzs=
AllowedIPs = ::/0 # Route all traffic through this peer
Endpoint = [2a03:4000:xx:xx:18d7:b1ef:fe48:7d35]:1935
我把它們提出來:
[root@vps ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add fc01::1/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -6 route add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[root@laptop ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
...aaa 它不起作用。
WireGuard 似乎沒有成功連線。筆記型電腦顯示連線並計算發送流量(但收到 0B),但 VPS 不顯示連線。
如何正確設定僅支援 IPv6 的 WireGuard VPN?如果這是正確的,為什麼一端發送的流量沒有到達隧道的另一端?
如果更多資訊(pcap、ip
輸出等)有用,我會很樂意修改這個問題。
答案1
這不起作用,因為您的伺服器的網關假設整個 /64 是“on-link”,也就是說,每個位址都可以在同一乙太網路段上直接存取- 因此網關會進行鄰居發現查詢您的筆記型電腦的MAC 位址,但不會收到任何回复,因為筆記型電腦根本不在同一鏈路上。
(通常,伺服器不會代表路由到其他地方的位址進行回應 - 它只回應直接分配給其自己的 eth0 介面的位址。)
要使其與連結位址一起工作,您需要使用“代理 NDP”,即實際上使伺服器代表筆記型電腦提供 NDP 答复(以及您嘗試透過隧道路由的任何其他位址)。
對於 IPv6,最可靠的方法是在 eth0 上執行ndpresponder
守護程序。它將偵聽鄰居請求資料包並發送正確的鄰居通告。
(類似地,您可以使用ndppd
甚至內核的內建proxy_ndp
功能,但這些功能的行為輕微地與真實的 NDP 回覆不同,有時不會透過某些 VPS 託管業者所做的反欺騙檢查。
但理想情況下,託管公司應該為您提供路由的字首– 資料中心閘道被明確設定為「通過」伺服器的主位址路由所有內容。這對他們來說也稍微有利,因為單一靜態路由比許多動態鄰居快取條目更有效。
(不幸的是,許多伺服器託管公司內部使用某種 VPS 管理平台,阻止他們提供路由前綴 - 我聽說這是 SolusVM 的錯,它堅持「扁平連結/48」模型。)
注意:這無論如何都不是 IPv6 特有的 - IPv4 中也存在“鏈路上”和“路由”之間的相同區別,唯一的區別是 IPv4 使用 ARP 而不是 NDP。 (例如,如果您的伺服器位於 eth0 上的 192.168.1.0/24,並且您想要將 192.168.1.7 路由到 VPN 用戶端,那麼您將遇到完全相同的問題,並且需要代理 ARP 來解決該問題。 )