Routing

通過 openvpn 隧道路由公共 ipv6 流量

  • January 27, 2018

我要做的是通過 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:1002001: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

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