OpenWrt 多条 IPv6 的路由逻辑?

151 天前
 microka
在用 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 路由表显示的并不是我指定的网关跃点数)

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

首先是 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
151 天前
其实如果各大系统能够完整实现 NPTv6 的话,那就可以 LAN 只分配内网地址( FD00::/8 ),路由器根据目的地址再按照预设好的规则做前缀转换。

目前只能以奇技淫巧的方式去实现 14 楼的操作,比如 OpenWRT 的“反向掩码”(或者叫做“负掩码”),这里就有讨论:
/t/915393
ericww
150 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/998873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX