@
Jirajine > 你用一堆 netns 组了个虚拟集群,数据包发过来发过去,这开销一点不比用户态低啊。
没错,参见设计目标第二条:并不是追求极致性能。
p.s. 即使是这样的耦合,即使效率可能比不上用户态,调试和修改起来也会比单个用户态程序容易太多了。以及用户态同样要面对和其他模块(比如 vpn )交流的问题。
> 比如任何情况下任意客户端的任意 dns 请求和后续实际请求能够路由到相同的外部接口。
对于 dnsroute 列表内的域名来说,强保证同一个出口。
对于其他的,经过权衡利弊,故障切换比较重要,不保证同一个出口。否则对于 TTL 比较长的普通域名,靠前的隧道 up/down 会很难受。
> 路由器只要做好两件事:把不同客户端的出战连接路由到不同外部接口;追踪入站连接,回程路由到来源的接口。
这正是三个核心 GW+重要模块 DNSROUTE 的功能。如果需要依赖 DNS 做路由分流,那么这里混进一点 DNS 不可避免。
而且这里设计 DNSROUTE 只是“重要”,也就是说,必要的时候可以从核心模块上拆下来(当然功能也就没了)。
> 其他的你想用什么隧道、起什么服务、vpn 入站、通过 ip/mac/vlan 等方式识别客户端等等都是全部解耦、互不影响的。
这个确实全部解耦了。识别客户端在 INGW 中的 ingw.d 模块(还特别出现了 NET-XC ,就是为了把 VPN 入站的也拉过来),服务是单独的可拆卸模块(除了几个 DNS 是耦合度较高的),VPN 入站也是单独的模块(现在实现了 openvpn 和 wg 两个完全独立的模块),VPN 出站每个 VPN 抽象为一个隧道和其他 VPN 互不影响(串接除外)。
> 其他更复杂需求客户端自己做更合适。
算了,各种策略还是从路由器上下发吧,这是设计哲学的问题。ingw.d 很大程度上也是为了干这个。