我正在尝试设置 OpenVPN 服务器,以便客户端能够使用其 IPv6 子网。服务器运行 Debian Wheezy,客户端运行 OS X 10.9.5。以下是服务器配置:
port 1194
proto udp
dev tun
tun-ipv6
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh1024.pem
server 10.100.100.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
tls-auth ta.key 0
cipher DES-EDE3-CBC
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
server-ipv6 MY:PUBLIC:IPV6:SUBNET::/64
push "route-ipv6 0::/0"
客户端配置如下:
client
dev tun
tun-ipv6
proto udp
remote server.address 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
tls-auth ta.key 1
cipher DES-EDE3-CBC
IPv4 连接工作正常,但 IPv6 存在一些奇怪的问题。客户端在连接时确实会获得 IPv6 地址,但唯一响应 ping(或接受任何 IPv6 数据包)的是服务器本身。看起来应该发送到全球互联网的数据包没有通过服务器上的相应接口(在我的情况下是 eth0)路由。IPv6 地址是从我的托管服务提供商提供的子网静态分配给 eth0 的,并且服务器上的一切正常;例如,我可以从它 ping ipv6.google.com。net.ipv6.conf.default.forwarding
和net.ipv6.conf.all.forwarding
sysctl 选项也已启用。
答案1
因此,我发现上游路由器不会无条件地将我分配的整个子网的数据包转发到我的服务器。为了让它知道转发数据包,你必须通过 NDP 协议明确地告诉它。这必须在客户端连接并分配 IPv6 地址时完成。长话短说,下面是我修复它的方法。将其添加到服务器上的 OpenVPN 配置中:
script-security 3
client-connect /etc/openvpn/client-connect.sh
创建一个名为 /etc/openvpn/client-connect.sh 的脚本,内容如下:
#!/bin/sh
ip -6 neigh add proxy $ifconfig_pool_remote_ip6 dev eth0
重启 OpenVPN。连接到服务器并享受属于您自己的互联网未来。
答案2
我也一直在努力解决同样的问题,巧合的是,Debian Wheezy 也是如此。
您现在可能错过了两个选项(在 VPN 服务器上):
- 无
ip6tables
转发规则 - 没有默认 IPv6 路由
1.ip6tables
与 IPv4 一样,您需要明确的防火墙转发规则,这对我来说很有用:
# ip6tables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# ip6tables -A FORWARD -i tun0 -o eth0 -j ACCEPT
(相应地调整接口,您可能需要添加-s VPN-IPv6-RANGE/SUBNET
第二条规则以实现更明确的转发)。
2. 默认路由
forwarding = 1
这是我这边的问题;大约两天后,有人让我重新考虑我的设置,我发现我错过了sysctl的一个重要副作用。
当您设置 时net.ipv6.conf.all.forwarding = 1
,路由器通告中的地址自动配置将被忽略。换句话说,当您的default
路由是通过自动配置设置的时,此路由会很快被丢弃,并且您会失去与服务器的 IPv6 连接。当您的默认路由现在类似于 时default via fe80::...
,可能就是这种情况。
解决方案是通过 添加明确的默认路由/etc/network/interfaces
,例如:
iface eth0 inet6 static
address 2001:db8::2
netmask 64
gateway 2001:db8::1
您可以通过查看服务器上的 IPv6 路由表来检查 VPN 设置是否(暂时)有效:ip -6 route show default
当路由表为空时,使用添加默认路由ip -6 route add default via 2001:db8::1
(相应地调整到您的本地范围)。然后检查 VPN 客户端是否可以 ping 某个外部 IPv6 地址。
OpenVPN 配置
我这边的一个小的配置差异是:
push "route-ipv6 2000::/3"
(2000::
取决于3fff:ffff...
)
代替
push "route-ipv6 0::/0"
但目前这些路线是等效的。