多WAN口接入 解决只有一个WAN口可以外部访问 原进原出

解决 MikroTik 多 WAN 口只有一个能被外网 Ping 通的问题

现象: 你的 MikroTik 路由器接了多条宽带(例如 WAN1、WAN2),每个接口都配置了公网 IP,但只有其中一条线路能从外网 ping 通。其他 WAN 口的 IP 仿佛“消失”了一样。

结论先行: 这几乎都是路由表缺少策略路由导致的非对称路由问题,而非防火墙阻挡。下面我会解释原理,并给出两种经过验证的解决方法。


为什么会这样?——非对称路由

假设你有 WAN1 和 WAN2,都配置了正确的公网 IP 和网关,但默认路由(0.0.0.0/0)只指向了 WAN1 的网关

当外网 ping WAN2 的 IP 时,数据包的流向是这样的:

  1. ICMP 请求包从 WAN2 进入路由器。
  2. 路由器准备回复 ICMP 应答,应答包的源地址自然是 WAN2 的 IP。
  3. 路由器查询路由表,发现唯一的默认路由指向 WAN1 的网关。
  4. 于是,应答包从 WAN1 的接口发出去了
  5. 外网的发送方收到一个源 IP 为 WAN2、却从 WAN1 线路过来的包,会因安全策略将其丢弃(ISP 也可能直接过滤这类“不合规”的流量)。

本质就是:数据包“从哪里来”就必须“从哪里回去”。单纯靠传统路由表做不到这一点,必须引入策略路由(Policy Routing)。


解决方法

RouterOS 实现策略路由非常灵活,这里提供两种主流方案。个人强烈推荐方法一,配置更清爽,维护成本低。

为了演示,我们假定:

  • WAN1:IP 1.1.1.2/30,网关 1.1.1.1,接口 ether1
  • WAN2:IP 2.2.2.2/30,网关 2.2.2.1,接口 ether2

请根据你的实际参数进行替换。


方法一:基于源地址的策略路由(对于固定IP推荐)

这个方法的核心逻辑是:强制让“源地址是某个 WAN 口 IP”的流量,都从该 WAN 口的网关出去。路由器自身发出的 ping 应答,或者内网设备经源 NAT 转换后的上网流量,都能被正确引导。

第 1 步:为每个 WAN 创建独立路由表


/ip route
add dst-address=0.0.0.0/0 gateway=1.1.1.1 routing-mark=to_wan1
add dst-address=0.0.0.0/0 gateway=2.2.2.1 routing-mark=to_wan2

第 2 步:添加路由规则,按源地址指定路由表

/ip route rule
add src-address=1.1.1.2/32 table=to_wan1
add src-address=2.2.2.2/32 table=to_wan2

配置完成后,立刻测试从外网 ping 两个 WAN IP,应该都能通了。

如果内网设备需要走 WAN2 上网?

别忘了在 NAT 里将对应内网设备的流量源地址转换为 WAN2 的 IP:

/ip firewall nat
add chain=srcnat src-address=192.168.100.0/24 out-interface=ether2 action=src-nat to-addresses=2.2.2.2

这样内网数据包发出时源地址就会变为 2.2.2.2,从而命中 to_wan2 路由规则,实现正常上网。

方法二:基于连接标记的策略路由(Mangle 标记法 适合WAN口动态IP)

这种方法通过标记“从哪个 WAN 口进来的连接”,让该连接的后续所有包(包括路由器自身的回复)都走同一个 WAN 口出去。适合复杂的多线负载均衡场景。

第 1 步:标记进入 WAN2 的新连接

/ip firewall mangle
add chain=prerouting in-interface=ether2 connection-mark=no-mark \
action=mark-connection new-connection-mark=wan2_conn passthrough=yes

第 2 步:对已标记连接施加路由标记

/ip firewall mangle
add chain=prerouting connection-mark=wan2_conn \
action=mark-routing new-routing-mark=to_wan2 passthrough=no

第 3 步:处理路由器自身产生的回复包

这是很多人容易遗漏的一步!路由器自己回复 ping 时,流量经过 output 链,必须同样打上路由标记。

/ip firewall mangle
add chain=output connection-mark=wan2_conn \
action=mark-routing new-routing-mark=to_wan2

第 4 步:为标记创建对应的路由

/ip route
add dst-address=0.0.0.0/0 gateway=2.2.2.1 routing-mark=to_wan2

对 WAN1 做同样处理,或者直接保持原有的主路由表(不带 routing-mark)作为 WAN1 的出口。

发表评论