OpenWrt 多条 IPv6 的路由逻辑?

2023-12-09 06:04:05 +08:00
 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 路由表显示的并不是我指定的网关跃点数)

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

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

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

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

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

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

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

© 2021 V2EX