V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nkcfc
V2EX  ›  宽带症候群

Ubnt USG 如何给旁路由派发 ipv6 前缀呢?

  •  
  •   nkcfc · 2022-05-06 21:42:33 +08:00 · 1833 次点击
    这是一个创建于 712 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的需求是这样的。USG 拨号作主路由,可以获得 /60 的 ipv6 前缀,因此可以继续下发给子网。如果用一个 Openwrt 作主路由,另外一个 Openwrt 是可以获取到 /62 /63 这样的 ipv6 前缀的,用到了 DHCPv6 。不幸的是,Ubnt USG 的 ipv6 貌似不支持 DHCPv6 server 。大家有什么办法吗? 此外,USG 下发地址用的是 radvd ,可以手动强行修改它的配置,使得它只给指定设备下发 v6 地址。

    第 1 条附言  ·  2022-05-06 22:42:56 +08:00
    更正,USG 支持 DHCPv6 ,前提是 LAN 接口手动输入地址,使用 fd00::/64 等内网地址,可以实现 nat6 。但不能解决我的问题。
    8 条回复    2022-05-08 10:44:19 +08:00
    Buges
        1
    Buges  
       2022-05-06 23:02:31 +08:00 via Android
    除非你用的是 dhcpv6 only ,不然怎么可能只给指定设备分配 v6 地址。slaac 是“广播”,且是无状态的。
    如果你要自动划分子网,dhcp pd 可以做到。当然这指的是不同网络,“旁路由”这种 trick 跟 ipv6 根本没法共存。
    huangya
        2
    huangya  
       2022-05-06 23:48:23 +08:00 via iPhone
    是 ipv6 在某些情况下不好用吗?所以想给指定设备下发?
    nkcfc
        3
    nkcfc  
    OP
       2022-05-07 07:25:48 +08:00 via Android
    @huangya 论坛中其他人说过 radvd 可以单播,我没试过,不过这不是我要解决的主要问题。
    我的真实目的是 v6 下上科学网。用 usg 会把自己广播成 v6 网关,根据现在查到的东西 radvd 应该直接关闭,想办法把 dhcpv6 server 跑起来,只下发前缀,让二级路由派发 v6 网关。
    nkcfc
        4
    nkcfc  
    OP
       2022-05-07 21:56:11 +08:00   ❤️ 1
    @Buges radvd 确定可以单播,见手册 https://linux.die.net/man/5/radvd.conf 。Usg 下直接修改 radvd.conf 亲测可用,只要加上 clients { fe80::8122:28ff:ff97:adf1; }; 就变成了只给单个地址分配地址和网关。这里写的是旁路由 Openwrt 的地址,查看网络状态确定 Openwrt 获得了正确的 v6 地址和网关,然后在 LAN 的 DHCP 那里打开路由通告服务的服务器模式。再然后,其他客户端顺利获得了 v6 地址,网关为 Openwrt 。
    geekvcn
        5
    geekvcn  
       2022-05-08 00:33:53 +08:00
    @nkcfc 标记一下
    Buges
        6
    Buges  
       2022-05-08 00:44:20 +08:00
    好吧,才知道 ra 居然可以单播,可能我之前踩坑的时候 rfc 没细看。
    但即使这样也没法搞旁路由的,ipv4 可以设置 dhcp 选项来指定特定网关,而 ipv6 的 ra 接收者会自动将 ra 的源地址设为网关,无法修改,除非完全手动管理地址。如果你用旁路由跑 ra 的话,又无法适配动态前缀。
    我建议用 bridge firewall 的方式配置双栈透明代理,代理服务器通过二层劫持的方式操作流量,而不是畸形的旁路由。Linux 下 ebtables BROUTE 或 nftables 中 对以太网地址进行 dnat 都可以实现。
    nkcfc
        7
    nkcfc  
    OP
       2022-05-08 10:39:10 +08:00
    以下 OP 代表旁路由 openwrt 。

    "但即使这样也没法搞旁路由的,ipv4 可以设置 dhcp 选项来指定特定网关,而 ipv6 的 ra 接收者会自动将 ra 的源地址设为网关,无法修改,除非完全手动管理地址。如果你用旁路由跑 ra 的话,又无法适配动态前缀。"

    不是这样的,OP 分发 ra 不需要 PD ,也就是说得不到子网路由也可以的,我整个的过程都没手动输入任何前缀,它分发的 RA 前缀是从自己获得的 v6 地址里截取的。



    总结一下就是这样,USG 的 radvd 分发 v6 地址和网关给 OP ,此时 OP 可以正常访问 v6 网络了。注意这里,OP 是单独设定的一个 DHCPv6 的接口(物理接口和 LAN 一样)。 然后去 LAN 的 DHCP 下开启路由通告服务。此时,局域网其他主机可以也可以获得 v6 地址和网关了(注意 v6 网关是 OP 的不是 USG 的)。不过局域网其他主机仍无法访问外网 v6 ,下一步在 OP 上开启 ipv6 转发,命令如下:
    ip6tables -t nat -A POSTROUTING -j MASQUERADE 。

    ipv6 数据流向是局域网主机 -> OP -> USG_LAN -> USG_WAN->外网。由于使用了 NAT ,所以测试自己 v6 时地址是 OP 的。 正因为如此,这真的叫 ipv6 旁路由了,如果获得了子网路由,那就是规范的 ipv6 路由了。

    下一个问题就是,反过来呢? 外网能直接访问局域网内主机的 v6 地址吗? 可以访问 OP ,但是外网访问其他主机不通,如果什么都不改,直接 USG 运行 radvd 分发所有地址是没问题。在 USG 上执行 ip6tables -t nat -A POSTROUTING -j MASQUERADE
    后可以。但是仍不完美,内网主机上查看连入的地址是 USG 的。需要继续探索 USG 的内部逻辑。

    其余的工作是把 USG 的手动修改持久化,这个是可以做到,因为一般 v6 的模式就固定的,一般也不需要在 ubnt 的网络控制台 ui 里修改了。还要注意的是 USG 上的 radvd 最好删除分配 DNS 的那个条目。
    nkcfc
        8
    nkcfc  
    OP
       2022-05-08 10:44:19 +08:00
    忘了说最早的动机了,为了搞科研。在旁路由上运行小 cat ,………………内外分流,然后 test-ipv6.com 会看到外面的 v6 ,访问国内的 v6 还是正常的。 暂时终结,欢迎有同学去复现我的方案,写一个完整的教程,我不是学计算机的,写的比较乱,还请理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5658 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:31 · PVG 11:31 · LAX 20:31 · JFK 23:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.