通過 openvpn 隧道路由公共 ipv6 流量
我要做的是通過 vpn 隧道路由 IPv6 流量。這樣,我應該能夠在不支持 IPv6 的網路中使用 IPv6。
我有一個分配了 IPv6 塊的 VPS。這個塊的一部分我想用於 openvpn 客戶端。我想到的範圍是
2001:db8::111:800:0/112
(前綴是匿名的),因為 openvpn 只支持 /64 和 /112 作為子網。通過隧道的 IPv6 已經在工作,從客戶端,我可以 ping 伺服器(
2001:db8::111:800:1
),也可以在伺服器上的介面(2001:db8::111:100:100
和2001:db8:216:3dfa:f1d4:81c0
)。但是,當嘗試從客戶端 ping google.com 時,我沒有得到任何響應(ping 超時)。為了調試這個問題,我使用 tcpdump 擷取伺服器上的流量,我可以看到 ping 數據包發出,但沒有回復返回。將日誌規則添加到 ip6tables 顯示相同,數據包出去,但沒有任何進入。
我使用了一個線上跟踪路由工具,它從我的伺服器獲取超時。我也嘗試直接在介面上設置ip,確實導致ip(
2001:db8::111:800:1001
)是可達的,所以我認為這是一個路由問題。我已啟用通過 ipv6 的轉發
/proc/sys/net/ipv6/conf/all/forwarding
。ip6tables 策略允許所有鏈。**我的問題是,linux究竟需要什麼來接受未分配給介面的ip的數據包並進一步路由它?**僅存在一條路線似乎還不夠。
這是我的客戶端和伺服器的設置。如果需要更多資訊,請告知。
客戶
# ip -6 addresses 10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100 inet6 2001:db8::111:800:1001/112 scope global valid_lft forever preferred_lft forever # ip -6 routes 2001:db8::111:800:0/112 dev tun0 proto kernel metric 256 2000::/3 dev tun0 metric 1024
伺服器
# ip -6 address 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000 inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic valid_lft 86254sec preferred_lft 14254sec inet6 2001:db8::111:100:100/128 scope global valid_lft forever preferred_lft forever 12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100 inet6 2001:db8::111:800:1/112 scope global valid_lft forever preferred_lft forever # ip -6 route 2001:db8::111:100:100 dev eth0 proto kernel metric 256 2001:db8::111:800:0/112 dev tun0 proto kernel metric 256 2001:db8::/64 dev eth0 proto kernel metric 256 expires 86194sec default via fe80::230:48ff:fe94:d6c5 dev eth0 proto ra metric 1024 expires 1594sec
您需要告訴路由器將您的伺服器用於此 VPN 子網:解決問題的正確方法是在路由器上為 OpenVPN 子網添加路由。
如果由於無法觸摸路由器而無法執行此操作,另一種解決方案是為
eth0
連結上的客戶端設置 NDP 代理。當您使用 VPS 時,您可能無法向路由器添加路由:您可能必須使用第二種解決方案。
為子網添加路由
您的問題的正確解決方案是告訴路由器 VPN 子網必須通過 OpenVPN 伺服器路由(這是針對 Linux 的):
ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100
您必須在伺服器上啟用 IPv6 轉發:
sysctl sys.net.ipv6.conf.all.forwarding=1
NDP 代理
似乎路由器已配置為在
eth0
連結上發送您的整個 IPv6 範圍:您可以設置 NDP 代理。
eth0
當您嘗試從客戶端訪問 Internet 的其餘部分時,您應該會在 OpenVPN 子網的伺服器介面上看到 NDP 請求。您還需要在伺服器上啟用 IPv6 轉發和 NDP 代理:
sysctl -w net.ipv6.conf.all.proxy_ndp=1
子網 NDP 代理
Linux 核心不允許為子網添加 NDP 代理,而只能為單個 IP 添加。您可以使用守護程序(例如 ndppd為整個子網設置 NDP 代理(從未使用過它)。
每個 IP NDP 代理
另一種解決方案是可以為 VPN 子網的每個 IPv6 添加一個 NDP 代理:
for i in $(seq 0 65535) ; do ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0 done
這應該可以工作,因為您在 OpenVPN 子網中的 IP 數量相對較少。
帶有 OpenVPN 掛鉤的動態 NDP 代理
您應該能夠使用 OpenVPN 掛鉤動態添加 NDP 代理。
在 OpenVPN 伺服器配置中添加鉤子:
learn-address /etc/openvpn/learn-address
使用以下
learn-address
腳本:#!/bin/sh action="$1" addr="$2" case "$action" in add | update) ip neigh replace proxy "$addr" dev tun0 ;; delete) ip neigh del proxy "$addr" dev tun0 ;; esac
看到這個執行緒。
簡短的回答
for i in $(seq 0 65535) ; do ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0 done