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

OpenWrt 多条 IPv6 的路由逻辑?

  •  
  •   microka · 2023-12-09 06:04:05 +08:00 · 2890 次点击
    这是一个创建于 385 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在用 ImmortalWrt 23.05.1 ,接入了 wan1 电信和 wan2 移动(均为 OP 拨号,wan1 网关跃点 10 ,wan2 网关跃点 20 ),v6 接口为自动生成的虚拟动态接口(DHCPv6)。使用 mwan3 添加了 wan1 、wan2 接口(IPv4),目前 IPv4 默认路由走 wan1 ,特定情况下走 wan2 。

    OpenWrt DHCP 服务器禁用 DHCPv6 ,仅启用 SLAAC ; Windows 本地网卡同时获取到 240e 和 2409 的 IPv6 地址。
    路由器和 Windows 的路由表如下:









    在 Windows 上进行路由跟踪发现,访问 240e 电信 IPv6 服务器时会以 240e IP 进行访问,访问 2409 移动 IPv6 服务器时会以 2409 IP 进行访问(这正是我想要的结果没毛病),
    但访问非 240e/2409 前缀地址,如[2001:da8:d800::40],有时以 240e IP 访问,有时以 2409 IP 访问(一般 OP 路由器不重启的情况下访问策略不会发生改变)。

    想请教一下,这里应该是 OpenWrt 帮 Windows 选择了以哪条 IPv6 去访问目标地址吧?那对于前缀与本地 IPv6 不一致的目标地址,OpenWrt 的路由策略是怎样的呢?
    如果我想指定以某条 wan_6 访问非 240e/2409 前缀的目标地址,应该如何配置呢?非 NAT6 的方案有吗?(试过手动添加 wan6 接口并手动配置 wan6 接口的网关跃点,但 OpenWrt IPv6 路由表显示的并不是我指定的网关跃点数)

    求大佬指导,谢谢~
    第 1 条附言  ·  2023-12-09 06:40:07 +08:00
    刚重启了下电脑,发现变成以 240e IP 去访问 [2001:da8:d800::40] 了,然后又排查了一番:

    发现一般情况下是以 240e IP 去访问 [2001:da8:d800::40] 的,当 OpenWrt 重启 wan1 电信连接后,就变成以 2409 移动 IP 去访问 [2001:da8:d800::40] 了,而此时新的 240e IP 还是通的(访问 240e 目标地址时依然会走新的 240e IP );然后手动禁用并重新启用本地网卡后,又变成以 240e IP 访问 [2001:da8:d800::40] 了。

    还试了把 wan1 电信连接网关跃点改成 50 ,wan2 移动连接网关跃点保持 20 不变,此时仍是以 240e IP 去访问 [2001:da8:d800::40]。

    所以,到底是怎样决定 IPv6 路由策略的?
    21 条回复    2023-12-12 12:46:33 +08:00
    qxooqx
        1
    qxooqx  
       2023-12-09 07:29:51 +08:00 via Android
    电脑同时拿到了两个 ipv6 路由,这时候走哪条路是电脑选出来的
    openwrt 上添加的 ipv6 路由默认会判断源 ip xxx/xx from xxx via xxx
    qxooqx
        2
    qxooqx  
       2023-12-09 07:31:12 +08:00 via Android
    源路由判断是可以关闭的 但是没有 nat 情况下不知道包能不能回来
    microka
        3
    microka  
    OP
       2023-12-09 07:36:51 +08:00
    @qxooqx 喔?原来是 Windows 自己判断选择的?那 Windows 为什么会优先以 240e IP 去访问 2001 地址呢?😂
    qxooqx
        4
    qxooqx  
       2023-12-09 07:49:13 +08:00 via Android
    Windows 怎么选的不清楚,猜测和跳跃点数有关
    上级 RA 发布前缀时可以携带优先级 low medium high ,openwrt wan 口拿到的优先级应该都是 medium ,不知道 ooenwrt 的 ra 是否可以对不同来源的 ipv6 前缀配置不同的优先级
    qxooqx
        5
    qxooqx  
       2023-12-09 07:54:28 +08:00 via Android
    现在 win 上看到的两个网段的网关是同一个这怎么区分用哪个源 ip 🤔
    Jays
        6
    Jays  
       2023-12-09 08:59:58 +08:00 via Android
    好多年的疑惑了,由于搞不定,只能关 ipv6 保平安了。期待 大神来给个解决方案
    titanium98118
        7
    titanium98118  
       2023-12-09 09:11:17 +08:00 via Android
    所以我用了最 dirty 的方法,nat6 。
    cq65617875
        8
    cq65617875  
       2023-12-09 10:12:37 +08:00
    nat6+1
    qxooqx
        9
    qxooqx  
       2023-12-09 10:30:33 +08:00 via Android
    lan 可以配置从哪个 wan 获取前缀 ip6class 你可以选其中一个 wan 出口,这样下发给电脑的 ipv6 就是对应 wan 的了
    microka
        10
    microka  
    OP
       2023-12-09 11:05:21 +08:00
    @qxooqx #6 但我两条 IPv6 都想用上。
    xiaoxiang69460
        11
    xiaoxiang69460  
       2023-12-09 12:07:13 +08:00 via iPhone
    多 ipv6 前缀下 是由 Windows 来选定用哪个 ip 发起连接。要指定访问不同地址使用的前缀优先级的话可以搜一下 netsh interface ipv6 show prefixpolicies
    fish3125
        12
    fish3125  
       2023-12-09 14:02:50 +08:00
    如果 2 条都要用就使用楼上说的 nat6 ,lan 前缀过滤、dhcp 里强制 ra 。然后 mwan3 就可以控制所有流量了。
    wike
        13
    wike  
       2023-12-09 17:26:16 +08:00 via iPad
    一个脑洞 能不能用其中一个/56 或者/60 作内网地址池 然后另一个不分配 但是获取运营商给的/64
    然后在路由上有选择的 nat(?)
    例如有两个路由 OSPF 把其中一些路由下一跳指向另一个路由 然后在另外一个路由器上 nat
    maybeonly
        14
    maybeonly  
       2023-12-09 21:28:01 +08:00   ❤️ 1
    @wike 可以
    我是这么做的:
    一条宽带用一个/64 做 SLAAC ,另一个宽带也拿一段/64 ,在出口上做 SNPT
    但是连入的时候,需要在网关上做 conntrack ,否则可能出现回程 ip 不对的情况
    microka
        15
    microka  
    OP
       2023-12-09 21:34:53 +08:00
    @wike #13
    @maybeonly #14
    大佬们的操作太高端了,小白难操作😂
    wike
        16
    wike  
       2023-12-09 21:40:47 +08:00 via iPad
    @maybeonly cool
    wike
        17
    wike  
       2023-12-09 21:41:16 +08:00 via iPad
    @microka 我也闹不明白 没有两条宽带可供实践
    cnbatch
        18
    cnbatch  
       2023-12-09 21:46:20 +08:00   ❤️ 1
    个人猜测,可能是跟“最长前缀匹配”有关

    首先是 V 站曾经有人发过的《检验 IPv6 的最长前缀匹配机制》 /t/779881 里面提到 RFC 3484 。
    RFC 3484 的第五章规则 3 提到,不要使用已过期的地址。
    结合附言的现象,我猜可能因为禁用后导致 240e 前缀的地址实际上过期了,于是主动把默认源地址改成 2409 的前缀去访问,当 240e 恢复之后,由于 240e 和 2409 是同类型的公网地址,所以不会主动把默认源地址切换回去。

    至于为什么重启电脑、禁用网卡再恢复(两者相都会重设网卡设置)后会优先选择 240e ,个人猜测,可能与前缀有关。
    2409 的二进制:0010010000001001
    240e 的二进制:0010010000001110
    排除掉前面相同的部份,可以得到剩下的不同部份:
    9: 1001
    e: 1110
    以 AND 操作做匹配的话,9 的前缀只能匹配 1 个 bit ,E 的前缀可以再匹配 3 个 bit 。
    然后 Windows 简单粗暴地认为前缀 E 更加适合。

    这是单纯靠猜,我也无法保证一定就是这样。如果有三线接入的话,可以再看看 2408 、2409 、240e 共存时会不会也这样。
    cnbatch
        19
    cnbatch  
       2023-12-09 21:55:27 +08:00   ❤️ 1
    其实如果各大系统能够完整实现 NPTv6 的话,那就可以 LAN 只分配内网地址( FD00::/8 ),路由器根据目的地址再按照预设好的规则做前缀转换。

    目前只能以奇技淫巧的方式去实现 14 楼的操作,比如 OpenWRT 的“反向掩码”(或者叫做“负掩码”),这里就有讨论:
    /t/915393
    ericww
        20
    ericww  
       2023-12-10 23:14:15 +08:00 via iPhone   ❤️ 1
    pagxir
        21
    pagxir  
       2023-12-12 12:46:33 +08:00 via Android
    可以看一下 RFC6724
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2614 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:14 · PVG 13:14 · LAX 21:14 · JFK 00:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.