面板可以通过节点接口管理网关上的端口转发、端口域、弹性 IP、出口和封锁规则;规则组数量不限,每组有自己的优先级、归属和校验和。10 万条规则下转发性能不变。按设计文档 docs/gateway-milestone-design.md 完成。
目的 NAT 和出口策略各是一组规则组,数量不限。每组有:名字、优先级(小的先查,第一条命中的生效)、归属(manual 手工 / panel 面板,面板只能改自己的组)、查找方式(linear 按顺序,适合少量规则;indexed 用哈希和区间表,适合几万条)、按规则 id 增删、每组一个校验和(各规则规范 JSON 的 SHA-256 前 8 字节异或)。面板对比校验和,只重同步不一致的组。规范形式和测试向量在 docs/gateway-checksum-vectors.json,面板那边已逐字节对上。
| 表 | 规则 | 作用 |
|---|---|---|
| dnat | port / range | 单端口或端口段转发(段内偏移保持),目的可以是一个地址或一个地址列表(端口域) |
| dnat | map | 弹性 IP:所有端口进来;dir both 时它的流量也从这个地址出去,dir in 只进不出 |
| dnat | accept / drop | 手工组里放行或丢弃 |
| egress | src / dst | 按源(每个容器)或按目的选出口:自己的某个地址、某个接口或隧道(WARP、WireGuard、L2TP),或不转换 |
| egress | default | 按顺序的出口列表,每 5 秒做健康检查(ping 或 TCP 连接),坏了自动换下一个,恢复后切回 |
| egress | block | 封锁出站,例如 TCP 25 |
IPv4 和 IPv6 都支持,地址列表可以混合两种地址,规则按目标地址的类型取用。规则改了或删了,已有连接照常到结束,新连接按新规则。
route.set 写入),和主机网络配置分开,网络配置的定时回滚碰不到。在 KVM 测试机上,路由器同时装着 NAT 模块。测试流量不命中任何规则,所以每个包都要查一遍所有规则组,这是查找开销最大的情况:
| 规则 | 载入 | 改一条 | TCP 单流 / 4 流 | 64 字节 1 流 / 16 流 |
|---|---|---|---|---|
| 没有规则 | — | — | 18.3 / 18.9 Gbit/s | 369 / 373 kpps |
| 10 万条,1 个组 | 5.2 秒 | 2 毫秒 | 18.7 / 18.4 Gbit/s | 398 / 353 kpps |
| 10 万条,50 个组 | 14.5 秒 | 5 毫秒 | 18.2 / 18.7 Gbit/s | 377 / 372 kpps |
查找本身(主机上测):不命中的包 1 个组 17 纳秒、50 个组 84 纳秒;命中只发生在一个连接的第一个包。测试机是嵌套虚拟化,16 流的数字本身就有 ±15% 的波动。
新的 gateway_test 覆盖:端口转发、端口段、端口域、冲突提示、弹性 IP 进出、组的优先级、校验和、出口规则、TCP 25 封锁、出口健康检查和切换、via.list、路由器自己的路由、IPv6 端口转发、域名拦截(TLS、HTTP 重置和跳转、QUIC)、有状态防火墙、换 nat 模块后规则组保留。vrrp_test 加了第二个虚拟地址。完整回归测试见下次发布记录。