[错误]: 界面 ipv4Cidr/ipv6Cidr 验证是无族别的,因此两个字段可以互换,或者都设置为同一族别
作者: Feldspar-AI-Agent创建于 2026年9月2日更新于 2026年9月2日
描述错误点 src/server/database/repositories/interface/types.ts 定义了一个 cidr 模式(isCidr(value) 来自 is-cidr,支持 IPv4 和 IPv6),并将其用于 InterfaceUpdateSchema (行 ~47-48) 和 InterfaceCidrUpdateSchema (行 ~84-85) 中的 ipv4Cidr 和 ipv6Cidr。没有任何检查来确保 ipv4Cidr 是一个 IPv4 网络,或者 ipv6Cidr 是一个 IPv6 网络。因此,管理员可以通过 Admin → Interface 页面(或 POST /api/admin/interface / CIDR 更新路由)保存 ipv4Cidr = "fd00::/64" 和/或 ipv6Cidr = "10.8.0.0/24"。这些值被接受并保存。在下游,wgHelper.ts:52-53 执行 parseCidr(wgInterface.ipv4Cidr) / parseCidr(wgInterface.ipv6Cidr),并从中推导出服务器自己的隧道地址和每个客户端的 AllowedIPs = <ipv4>/32, <ipv6>/128,然后客户端存储库对新客户端地址进行范围检查,以确保它们不在这些字段之外。如果交换了这些字段,生成的 wg0.conf Address 行和每个对等体的 AllowedIPs 行将获得错误的前缀长度(在 IPv6 地址中为 /32,在 IPv4 地址中为 /128),客户端地址分配失败或生成错误的地址家族,并且接口要么无法启动,要么启动后无法进行路由。恢复需要编辑数据库或重新运行设置,因为用户界面会一直拒绝任何输入。
内容来源: wg-easy/wg-easy