25 / 01 / 02

网络拓扑思考

最近因为颜值入手了一个 UniFi Express,实际安装以后发现无论如何都无法避免二重 NAT,并且也不能满足 UU 主机加速插件的使用。

  1. ISP 网络为千兆,ONU 仅作光电转发。UniFi Express 只支持 GbE,并且 PPPoE 没有硬件 Offload,性能损失严重,因此必须与 2.5GbE X86 路由桥接。;

  2. X86 路由上又安装了 UU 加速器插件,但仅对 X86 路由 LAN 侧设备生效;

  3. X86 路由上又桥接了一个 Linksys 的硬路由充当无线接入点。

网络拓扑图如下:

在“必须使用 X86 路由进行 PPPoE 拨号 + UniFi Express 作为网关 + Linksys 桥接 + 位于 X86 路由器上的 UU 加速插件正常工作“这四重前提下,想让 UniFi Express 自身拿到的 IP 也是 192.168.79.x,但又要保持单一网段或只由 UniFi Express 作为网关,基本没有一个“简单、标准、稳定” 的方案可以直接实现。

为什么会“两难全”

  1. ISP 流量首先进入 X86 路由再发给下游,自然就带一个对外 NAT;

  2. 一旦让 UniFi Express 作为“默认网关”,给所有设备下发 IP,并且做 NAT 或防火墙,一般做法是上级给 UniFi 一段私网(例如 192.168.79.x),UniFi Express 再给下层设备二次 NAT(例如 192.168.2.x),但这就是二重 NAT 了。想让 UniFi Express 自己也拿到 192.168.79.x,并“仍是网关”,就会造成同一个网段里出现两个 NAT,产生“谁才是默认路由”的冲突;

  3. 网络结构中并非只有一台设备,还有 Linksys 这台硬路由必须桥接 X86 路由的 LAN 侧,让某些设备也拿到 192.168.79.x;

  4. 游戏机必须用到 UU 主机加速插件,意味着必须直连 X86 路由的网段。但又想让 UniFi Express 作为网关,如果设备拿到的是 UniFi Express 的 IP 子网,那就一定绕不开“二层桥”或者“双层 NAT”+“VLAN trick”之类的头疼操作。

可能的解决方案

1. VLAN/SSID + Policy Routing

这种方案的思路是,X86 路由作为 PPPoE 设备,LAN 网段为 192.168.79.x,并保留 UU 主机加速插件;UniFi Express 的 WAN 端用 192.168.2.x,给绝大部分设备做 DHCP 和网关,再划分一个 VLAN-only SSID 并且直接桥接 X86 路由。如果要使用 UU 主机加速插件,那就接入这个 VLAN-only 的 SSID;如果只是普通使用,那就连接 UniFi Express 的“主网段”。

这样看上去似乎能解决问题了,然而

  1. 物理上还是 UniFi Express 在中间,只是逻辑上通过 VLAN 分拆了流量。设备如果只拿 UniFi Express 下发的 IP,就无法走 X86 路由使用 UU 主机加速插件(因为不在 79 网段),所以还得手动切换它去连 VLAN 79;

  2. 必须在 X86 路由、UniFi Express、Linksys 硬路由上都做 VLAN Trunk / Bridge / 防火墙放行 / DHCP Relay 等操作;

  3. 没能实现 UniFi Express 既拿 192.168.79.x 又做全网唯一网关这个需求,本质上变成“并行两套网段”;

  4. UniFi Express 并不支持 WAN 口划分 VLAN,也无法将 LAN 口桥接上一层设备(关键问题)。

2. 单网段双路由 + Advance Routing

这种做法稍微复杂,思路是:

  1. X86 路由作为 PPPoE 设备,LAN 网段为 192.168.79.x,IP 为 192.168.79.1;

  2. UniFi Express 的 WAN/LAN 也同处 192.168.79.x 网段(需自定义桥或单臂路由),此时假设 IP 为 192.168.79.2;

  3. 由 UniFi Express 作为 DHCP 服务器及网关,关闭 X86 路由 DHCP 功能;

  4. 在 UniFi Express 上缺省路由指向 192.168.79.1,并在 X86 路由上配置相关防火墙规则(例如允许“源IP=79.x → 目标=ISP”);

  5. 整个 79.x 网段有两个路由器 IP( .1 和 .2 ),客户端都把 .2 当默认路由,而 .2 再把流量转发到 .1 出口;

这些设备的实际网关是 192.168.79.2(UniFi Express),经过 UniFi Express 转发到 192.168.79.1(X86 路由)再出网。理论上只要 X86 路由的防火墙打通,UU 主机加速插件看到这些客户端的 IP 都是 192.168.79.x,就可以对其进行加速,但这种做法极其不常规:在一个网段里跑两个路由器做 NAT/防火墙/转发,极易出现 ARP 冲突、MAC 冲突或路由环路,更别说 UniFi Express 并不支持“WAN/LAN 同网段”或“单臂路由”这种功能了;转发规则需要严格斟酌,否则可能内外网混乱,一旦出现问题排查难度非常大,家庭网络上这般架构有点小题大做。

总结

如果 UniFi Express 允许非常灵活的 VLAN、bridge、policy routing 配置的话,那么确实可以折腾出某种“单网段 + UniFi 做默认网关 + X86 路由 PPPoE + Linksys bridge + UU 加速插件可用”的方案,涉及到在 X86 路由/UniFi/Linksys 上同时做多 VLAN 或 WAN-LAN bridge、关闭和修改部分 DHCP、写静态路由与防火墙规则等等工作,然而对我这种普通的家庭环境来说,这种配置过于复杂,而且极其不稳定,最后只能做出取舍维持现状:让需要加速的设备直接连到 X86 路由拿 79.x,其余不需要加速的设备走 UniFi Express 管理,双网段共存。