今天有个人找我,说要给 Vultr 机器上的 VPS 配一下 OpenConnect IPv6 (因为他想通过这种办法变通给客户端获得 IPv6 连接能力)。虽然我是一个 Cisco ASA 用户,但是我也配过 OpenConnect。我发现在此过程中遇到的一些问题其他人也碰到过,然后他们推锅给服务提供商的网络配置,或者直接也给 IPv6 做了 NAT。其实可以解决的。
一般 VPS 的 IPv6 是自动配置的。如果没有的话请手动配一下,并配置 2000::/3
的路由表。此内容不在本文的讨论范围之中。
注:Vultr 的 SLAAC 和一部分系统有兼容性问题。所以你需要通过 rdisc6 -m eth0
这个工具来手动看一下 RA 内容,并根据宣告的 Prefix 配置 IPv6 地址,和 Gateway 的 Link-local 地址配置到 2000::/3
的路由。
net.ipv6.conf.all.forwarding = 1 # 打开转发
net.ipv6.conf.all.accept_ra = 2 # 打开 RA 和转发并存
net.ipv6.conf.all.proxy_ndp = 1 # 打开 ND Proxy
使用转发和允许 ICMP6 的特定消息。
ip6tables -A FORWARD -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 134 -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 135 -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 136 -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 137 -m hl --hl-eq 255 -j ACCEPT
注意不要配置 NAT (Masquerade )。如果有,删掉它。
把你的 SLAAC 得到的 /64 Prefix 写入 ocserv 的 IPv6 地址前缀中。后面的默认设备地址池的 /80
可以不管。
重点:大部分人完成了上述操作后,客户端已经能够成功获取到 IPv6 地址,但是会发现没法上网。访问 IPv6 网关地址没有问题。这是因为在 SLAAC 配置的 IPv6 环境里,Uplink 的路由器必须依赖 Neighbor Discovery 来得知某个地址怎么转发到下一级(你的 VPS )。 因为 OpenConnect 的客户端连接在 vpns0
接口上,我们需要将 ND 代理到 eth0
上。
如果 ND 失败,路由器一般返回 ICMPv6 Unreachable (届不到)消息,如图所示,这是一个试图 Traceroute 到一个没有配置 ND Proxy 的 OpenConnect 客户端的情况:
因为 SLAAC 的情况下,我们不可能直接让上面的路由器把整个 /64 路由到特定地方(你都没跑路由协议呢)。为了自动化解决这个我问题,我们可以写两个小脚本,分辨对应 OpenConnect 的连接和断开脚本。最后在 ocserv.conf
里启用它们(看 connect/disconnect script 配置段)。
连接脚本:
#!/bin/bash
echo "Add user IPv6 address '$IPV6_REMOTE' ND proxy entry"
ip -6 neigh add proxy $IPV6_REMOTE dev eth0
exit 0
断开脚本:
#!/bin/bash
echo "Remove user IPv6 address '$IPV6_REMOTE' ND proxy entry"
ip -6 neigh del proxy $IPV6_REMOTE dev eth0
exit 0
这样你的 OpenConnect 客户端就应该能获取到你的 VPS SLAAC IPv6 地址段中的地址,并成功连接 IPv6 互联网。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.