V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
通过以下 Referral 链接购买 DigitalOcean 主机,你将可以帮助 V2EX 持续发展
DigitalOcean - SSD Cloud Servers
imbushuo
V2EX  ›  VPS

在 SLAAC IPv6 的 VPS(如 Vultr)上给 OpenConnect 配置能用的 IPv6

  •  
  •   imbushuo · 2018-08-05 01:33:11 +08:00 · 747 次点击
    这是一个创建于 2307 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天有个人找我,说要给 Vultr 机器上的 VPS 配一下 OpenConnect IPv6 (因为他想通过这种办法变通给客户端获得 IPv6 连接能力)。虽然我是一个 Cisco ASA 用户,但是我也配过 OpenConnect。我发现在此过程中遇到的一些问题其他人也碰到过,然后他们推锅给服务提供商的网络配置,或者直接也给 IPv6 做了 NAT。其实可以解决的。

    给 VPS 自己配 IPv6

    一般 VPS 的 IPv6 是自动配置的。如果没有的话请手动配一下,并配置 2000::/3 的路由表。此内容不在本文的讨论范围之中。

    注:Vultr 的 SLAAC 和一部分系统有兼容性问题。所以你需要通过 rdisc6 -m eth0 这个工具来手动看一下 RA 内容,并根据宣告的 Prefix 配置 IPv6 地址,和 Gateway 的 Link-local 地址配置到 2000::/3 的路由。

    配置 sysctl.conf

    net.ipv6.conf.all.forwarding = 1 # 打开转发
    net.ipv6.conf.all.accept_ra = 2 # 打开 RA 和转发并存
    net.ipv6.conf.all.proxy_ndp = 1 # 打开 ND Proxy
    

    配置 ip6tables

    使用转发和允许 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 )。如果有,删掉它。

    配置 OpenConnect 的 ocserv.conf

    把你的 SLAAC 得到的 /64 Prefix 写入 ocserv 的 IPv6 地址前缀中。后面的默认设备地址池的 /80 可以不管。

    配置 ND Proxy

    重点:大部分人完成了上述操作后,客户端已经能够成功获取到 IPv6 地址,但是会发现没法上网。访问 IPv6 网关地址没有问题。这是因为在 SLAAC 配置的 IPv6 环境里,Uplink 的路由器必须依赖 Neighbor Discovery 来得知某个地址怎么转发到下一级(你的 VPS )。 因为 OpenConnect 的客户端连接在 vpns0 接口上,我们需要将 ND 代理到 eth0 上。

    如果 ND 失败,路由器一般返回 ICMPv6 Unreachable (届不到)消息,如图所示,这是一个试图 Traceroute 到一个没有配置 ND Proxy 的 OpenConnect 客户端的情况:

    Unreachable-Example.png

    因为 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 条回复    2018-08-05 03:31:01 +08:00
    HandSonic
        1
    HandSonic  
       2018-08-05 03:31:01 +08:00 via iPhone
    666
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5961 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:49 · PVG 10:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.