场景

    1. 家里有主路由192.168.31.1,旁路由192.168.31.2,Xbox主机192.168.31.13;
    2. Xbox的网关和DNS均指向旁路由;
    3. 主路由设置DMZ主机为旁路由(问题不大,主路由上头还有个光猫,光猫防火墙开端口转发给主路由),旁路由根据需求进行端口转发内网服务。

    问题

    在什么都没有配置的情况下,网络是这样的:

    • 上行(Xbox → 服务器):
      • Xbox(192.168.31.13) → 旁路由(192.168.31.2) → 主路由(192.168.31.1) → 服务器
    • 下行(服务器 → Xbox):
      • 服务器 → 主路由(192.168.31.1) → Xbox(192.168.31.13)

    Xbox经过旁路由后才到主路由,但由于没有经过SNAT修改,主路由维护的NAT表中,它还是认为「Xbox<->公网」这个会话,数据是由Xbox直接发起的,跟旁路由没有关系,回包时就理所应当的直接发送给Xbox,旁路由就完全看不到这个包。

    这个路径对于通常网络请求,比如下载,网页浏览是没有影响的,因为他们对路径没有那么强的要求。但对于远程串流这种需要P2P的服务,它强依赖路径的对等。

    配置

    在「网络」→「防火墙」→「NAT规则」下新增一条:

    • 地址族限制:自动
    • 协议:任何
    • 出站区域:lan
    • 源地址:Xbox所在的内网IP
    • 目标地址:任意
    • 操作:SNAT - 重写为特定的源IP或端口
    • 重写IP地址:旁路由IP

    这个配置下,原本Xbox的上行经过旁路由时,旁路由不会记录而是直接类似于转发的形式送给主路由,现在旁路由会正常记录这个NAT映射关系,并且将源IP修改为192.168.31.2。主路由看到的源IP也会变成192.168.31.2,此时当有回包时,主路由就会认为这个包应该送给旁路由而不是Xbox,保证路径对等。