RustROS · 2026-10-30 · 网关

网关:规则组、出口策略、域名拦截

面板可以通过节点接口管理网关上的端口转发、端口域、弹性 IP、出口和封锁规则;规则组数量不限,每组有自己的优先级、归属和校验和。10 万条规则下转发性能不变。按设计文档 docs/gateway-milestone-design.md 完成。

内核改动没有模块热安装即可,不用重启
接口改动没有模块接口不变;节点 API 新增网关操作
新模块domains域名拦截
10 万条规则转发不变5 秒载入,改一条 2 毫秒

模型规则组

目的 NAT 和出口策略各是一组规则组,数量不限。每组有:名字、优先级(小的先查,第一条命中的生效)、归属(manual 手工 / panel 面板,面板只能改自己的组)、查找方式(linear 按顺序,适合少量规则;indexed 用哈希和区间表,适合几万条)、按规则 id 增删、每组一个校验和(各规则规范 JSON 的 SHA-256 前 8 字节异或)。面板对比校验和,只重同步不一致的组。规范形式和测试向量在 docs/gateway-checksum-vectors.json,面板那边已逐字节对上。

规则能做什么

表规则作用
dnatport / range单端口或端口段转发(段内偏移保持),目的可以是一个地址或一个地址列表(端口域)
dnatmap弹性 IP:所有端口进来;dir both 时它的流量也从这个地址出去,dir in 只进不出
dnataccept / drop手工组里放行或丢弃
egresssrc / dst按源(每个容器)或按目的选出口:自己的某个地址、某个接口或隧道(WARP、WireGuard、L2TP),或不转换
egressdefault按顺序的出口列表,每 5 秒做健康检查(ping 或 TCP 连接),坏了自动换下一个,恢复后切回
egressblock封锁出站,例如 TCP 25

IPv4 和 IPv6 都支持,地址列表可以混合两种地址,规则按目标地址的类型取用。规则改了或删了,已有连接照常到结束,新连接按新规则。

其他一起做的

性能10 万条规则

在 KVM 测试机上,路由器同时装着 NAT 模块。测试流量不命中任何规则,所以每个包都要查一遍所有规则组,这是查找开销最大的情况:

规则载入改一条TCP 单流 / 4 流64 字节 1 流 / 16 流
没有规则——18.3 / 18.9 Gbit/s369 / 373 kpps
10 万条,1 个组5.2 秒2 毫秒18.7 / 18.4 Gbit/s398 / 353 kpps
10 万条,50 个组14.5 秒5 毫秒18.2 / 18.7 Gbit/s377 / 372 kpps

查找本身(主机上测):不命中的包 1 个组 17 纳秒、50 个组 84 纳秒;命中只发生在一个连接的第一个包。测试机是嵌套虚拟化,16 流的数字本身就有 ±15% 的波动。

修正做的过程中发现的

测试结果

新的 gateway_test 覆盖:端口转发、端口段、端口域、冲突提示、弹性 IP 进出、组的优先级、校验和、出口规则、TCP 25 封锁、出口健康检查和切换、via.list、路由器自己的路由、IPv6 端口转发、域名拦截(TLS、HTTP 重置和跳转、QUIC)、有状态防火墙、换 nat 模块后规则组保留。vrrp_test 加了第二个虚拟地址。完整回归测试见下次发布记录。

限制目前的边界