今天有个人找我,说要给 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 互联网。
1
HandSonic 2018-08-05 03:31:01 +08:00 via iPhone
666
|