在 VPS 上使用 IPv6 的 OpenVPN
我正在嘗試在 Debian Sid 上使用 OpenVPN 創建 IPv6 隧道。IPv4 工作正常,但我無法讓 IPv6 工作。我可以使用 IPv6 ping 伺服器和其他客戶端,但我無法從客戶端訪問 Internet。
我已經進行了數小時的研究,但我仍然不完全了解 IPv6,所以這個問題可能很容易解決。一些解釋會很好!
問題是我使用的是 VPS,而我只有一個 /64 子網來處理所有事情:
2a00:a123:4:b5::/64
所以我想我可以將它添加到我的 OpenVPN 配置中(
/112
為 OpenVPN 創建一個較小的子網):server-ipv6 2a00:a123:4:b5:80::/112 push "route-ipv6 2000::/3"
現在,當我跑步時,
ifconfig tun0
我得到:inet6 addr: 2a00:d880:6:f2:80::1/112 Scope:Global
我的客戶得到:
client1,10.8.0.2,2a00:d880:6:f2:80::1000 client2,10.8.0.3,2a00:d880:6:f2:80::1001
我在 SolusVM CP 中添加了所有這 4 個 IP(我不知道這是否有必要,我認為這將用於路由回 VPS)。我也設置
net.ipv6.conf.all.forwarding
為1
.儘管如此,我還是無法從客戶端通過 IPv6 訪問網際網路。如果我
traceroute6 google.com
在客戶端上執行,我會到達伺服器 IP,但之後只會超時。我也發現了這個類似的問題,但是使用以下命令,NDP 代理似乎對我不起作用:
ip neigh add proxy 2a00:d880:6:f2:80::1000 dev tun0 ip neigh add proxy 2a00:d880:6:f2:80::1001 dev tun0
我也不認為 SNAT 是正確的。我有一個類似的問題,發現我只需要稍微調整一下正確的 FORWARD 規則。本質上,您只需將 IPv6 流量從 OpenVPN 介面轉發到具有 IPv6 設置的外部 WAN 介面。
ip6tables 允許來自 OpenVPN 的 IPv6 流量通過我的 VPS
在你的情況下,我認為這應該會更好:
ip6tables -A FORWARD -m state --state NEW -i tun+ -o $WAN -s 2a00:a123:4:b5::/64 -j ACCEPT ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
我假設您使用路由(tun)而不是乙太網橋接(tap)
似乎您只有一個 /64 塊,這應該是您需要的唯一 FORWARD 規則。
$WAN 是具有 IPv6 連接的外部介面的佔位符。我的 VPS 上沒有本地 IPv6,所以在我的情況下,它是隧道介面 sat1 (CentOS)。似乎您已經獲得了 IPv6 塊,那麼它將是外部 WAN 介面的任何內容。
一旦制定了正確的轉發規則,IPv6 流量就可以通過而不會被防火牆阻止。在大多數情況下,NAT 不需要涉及 IPv6。
首先你需要啟用proxy_ndp:
sysctl -w net.ipv6.conf.all.proxy_ndp=1
(並在 中添加相應的行
/etc/sysctl.conf
)。那麼正確的命令是:
ip neigh add proxy 2a00:d880:6:f2:80::1000 dev eth0 ip neigh add proxy 2a00:d880:6:f2:80::1001 dev eth0
假設這
eth0
是您的非 OpenVPN 網路設備的名稱。這意味著該主機應該在設備上提供一個 NDP 代理
eth0
:
- 當有人在 dev0 連結上詢問“2a00:d880:6:f2:80::1000”時,它應該說“是的,是我”;
- 這意味著該主機將接收來自 eth0 連結的 2a00:d880:6:f2:80::1000 數據包;
- 您不需要告訴他哪個介面是真正的 2a00:d880:6:f2:80::1000,IPv6 路由表會注意將正確路由到合適的目的地。
並且不要忘記啟用 IPv6 IP 轉發:
sysctl -w net.ipv6.conf.all.forwarding=1