解决 MikroTik 多 WAN 口只有一个能被外网 Ping 通的问题
现象: 你的 MikroTik 路由器接了多条宽带(例如 WAN1、WAN2),每个接口都配置了公网 IP,但只有其中一条线路能从外网 ping 通。其他 WAN 口的 IP 仿佛“消失”了一样。
结论先行: 这几乎都是路由表缺少策略路由导致的非对称路由问题,而非防火墙阻挡。下面我会解释原理,并给出两种经过验证的解决方法。
为什么会这样?——非对称路由
假设你有 WAN1 和 WAN2,都配置了正确的公网 IP 和网关,但默认路由(0.0.0.0/0)只指向了 WAN1 的网关。
当外网 ping WAN2 的 IP 时,数据包的流向是这样的:
- ICMP 请求包从 WAN2 进入路由器。
- 路由器准备回复 ICMP 应答,应答包的源地址自然是 WAN2 的 IP。
- 路由器查询路由表,发现唯一的默认路由指向 WAN1 的网关。
- 于是,应答包从 WAN1 的接口发出去了。
- 外网的发送方收到一个源 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 的出口。