我正在尝试使用 OpenVPN 从我的 VPS 建立 IPv6 连接隧道,因为我的 ISP 不支持 IPv6。我的 VPS 有一个 /64 IPv6 子网。我使用 OpenWRT 路由器作为客户端,因此我希望 OpenVPN 服务器分配完整的 IPv6 子网,然后路由器可以使用该子网。我当前的配置如下所示:
port myport
proto udp
dev tun
tun-ipv6
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
server 192.168.200.0 255.255.255.0
server-ipv6 2a03:4000:6:b11b:2::/80
push "redirect-gateway def1 bypass-dhcp"
push "route-ipv6 2000::/3"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
duplicate-cn
keepalive 20 60
comp-lzo
persist-key
persist-tun
daemon
log-append /var/log/myvpn/openvpn.log
verb 3
但 OpenVPN 服务器只分配 IPv6 地址,如下所示:2a03:4000:6:b11b:2::1000。
所以,我的问题是,如何设置 OpenVPN 服务器来为客户端分配完整的 IPv6 子网?
答案1
使其在客户端和服务器之间工作
首先,您需要将数据包路由到服务器上的 TUN 设备:
route-ipv6 $PREFIX
此外,您需要要求 OpenVPN 服务器将此前缀路由到您的客户端:
# This one needs to be in a CCD file:
iroute-ipv6 $PREFIX
这样,服务器应该能够将该前缀的数据包路由到客户端。
在客户端上,您需要从此前缀配置(手动)一些 IPv6 地址。 (在 Linux 上:)ip -6 addr $PREFIX dev tun0
。
此时您应该能够
从服务器 ping 一个该客户端 IP;
从该客户端 IP ping 服务器。
将此前缀路由到子网
如果服务器上的本机接口是点对点接口,它应该可以工作。路由器已经将该前缀的所有数据包转发到您的服务器,服务器将它们转发到您的客户端。
如果您的本机接口不是点对点接口, 你有麻烦了。当尝试将数据包转发到您的前缀的 IP 时,本机链路上的主机将尝试使用 NDP 查找与此 IPv6 地址关联的 MAC 地址。您的服务器不会响应它们(因为此 IPv6 地址不是其地址之一)。客户端不在同一链路上,并且看不到 NDP 请求(无论如何它都无法答复它们)。因此,没有人会回答这些 NDP 请求,数据包也不会发送到您的服务器。
您可以:
在路由器上添加一条路由,以便将您的服务器用作此前缀 (
ip -6 route add $PREFIX via $ipv6_of_the_server
) 的网关。但是,如果这不是您的路由器,您可能无法执行此操作。添加 NDP 代理规则 (
ip -neigh add proxy $some_ipv6 dev eth0
)。这将使服务器代表客户端响应 NDP 请求。但是(至少在 Linux 上),您无法添加整个 IPV6 子网作为 NDP 代理,因此您必须为要委派的每个 IPv6 地址添加规则。
使用 TAP 隧道
如果您的本机接口是以太网接口,另一种可能性是使用 TAP(基于以太网)OpenVPN 隧道而不是 TUN(基于 IP)隧道,并将虚拟 Tap 设备与本机接口桥接。这样,客户端将与路由器位于同一链路上,并且能够响应 NDP 请求。