RouterOS 防火墙配置避坑指南:那些年我们踩过的坑

发布于2026-06-18 15:09 阅读10次 本文结合多个真实踩坑案例,系统梳理RouterOS防火墙配置中最容易出错的环节,涵盖规则匹配顺序、NAT方向判断、连接状态跟踪、硬件卸载影响以及日志排查技巧等实战要点,帮助网络工程师在实际部署中快速识别并规避常见陷阱,提升配置效率和网络安全性。
# RouterOS 防火墙配置避坑指南:那些年我们踩过的坑
在企业网络和小型办公室场景中,RouterOS(俗称 ROS)凭借其功能丰富、性价比高的优势,赢得了大量网络工程师的青睐。然而,ROS 的防火墙配置逻辑与传统交换机路由器有较大差异,稍不注意就会陷入"明明规则写了但不生效"的窘境。本文结合真实案例,梳理 ROS 防火墙配置中最容易踩的几个坑,帮助大家绕开这些陷阱。
## 一、规则顺序决定生死
ROS 防火墙遵循"匹配即停止"(first match wins)原则,与 iptables 的默认行为类似,但很多新手习惯性地把 ACCEPT 规则放在最后,这往往导致规则永远匹配不到预期流量。
一个典型错误配置如下:
```
/ip firewall filter add chain=input action=drop src-address=10.0.0.0/8
/ip firewall filter add chain=input action=accept
```
上面第一条 drop 了所有 10.0.0.0/8 网段,第二条紧接着 accept 所有流量。结果是所有来自 10.x 网段的包在第一条就被丢弃了,第二条规则永远不会被执行。正确的做法是先写 ACCEPT 规则放行合法流量,再在最后写一条 drop-all 作为兜底:
```
/ip firewall filter add chain=input action=accept src-address=192.168.1.0/24
/ip firewall filter add chain=input action=drop
```
## 二、Src-nat 和 Dst-nat 方向搞反
很多人在做端口映射(端口转发)时,分不清 src-nat 和 dst-nat 的使用场景。简单来说:**dst-nat 用于入站流量(修改目标地址/端口),src-nat 用于出站流量(修改源地址/端口)。**
一个真实踩坑案例:有人想把内网一台 NAS 的 80 端口映射到公网,配置了这样的 src-nat 规则:
```
/ip firewall nat add chain=dstnat dst-port=80 action=src-nat to-addresses=192.168.1.100
```
这条规则用了 src-nat 而不是 dst-nat,完全搞反了方向。结果是公网访问时,本地路由器把响应包的源地址改成了内网 NAS 的地址,导致客户端收到伪造的响应包,连接无法建立。正确写法:
```
/ip firewall nat add chain=dstnat dst-port=80 action=dst-nat to-addresses=192.168.1.100
```
## 三、Connection Tracking 忘记放行
ROS 防火墙默认对所有流量记录连接状态(connection tracking),如果你在 filter 里把 INPUT 链的默认动作设为 drop,必须记得放行已建立连接(ESTABLISHED)和相关连接(RELATED)的流量。
漏放行的后果很严重:内网用户访问外网时,发出去的包能出去,但回程包在 input 链就被丢弃了,用户感觉就是"能 ping 通网关但无法上网"。标准的安全规则应该是这样:
```
/ip firewall filter add chain=input action=accept connection-state=established,related
/ip firewall filter add chain=input action=accept connection-state=new src-address=192.168.1.0/24
/ip firewall filter add chain=input action=drop
```
## 四、Hardware Offload 导致规则不生效
在 CRS 系列交换机和 RB 系列路由器上,如果某个端口开启了 Hardware Offload(硬件卸载),那么经过该端口的流量可能绕过 CPU 处理,直接由交换芯片转发,导致 firewall filter 规则对这段流量无效。
举例来说,你配置了一条 filter 规则禁止某两个 VLAN 之间的互访,但两个 VLAN 处在同一个交换芯片的端口上,流量根本没经过 CPU,规则自然不生效。解决办法是将涉及防火墙控制的端口从 hardware-offload 中排除,强制走软件转发:
```
/interface ethernet set [ find name=ether3 ] switch=unuse
```
## 五、日志没开还以为规则没生效
ROS 防火墙默认不记录匹配日志,很多工程师写了规则之后发现流量没被拦住,就认为规则没生效,其实只是没有打开日志。最直接的排查方式是为那条规则加上 log 日志:
```
/ip firewall filter add chain=forward src-address=10.10.10.0/24 action=drop log=yes log-prefix="blocked_10.10.10"
```
然后在 `/log print where topics~"firewall"` 里查看是否有对应记录。如果日志里有记录但流量仍然通过,说明在它之前还有一条匹配的 ACCEPT 规则;如果日志里根本没有记录,那说明流量根本没到这条规则——很可能是顺序问题或者 hardware offload 的问题。
## 六、总结
ROS 防火墙功能强大,但配置逻辑与常规网络设备有明显差异。核心避坑要点总结如下:
- 防火墙规则严格按顺序匹配,把精确的放前面,宽泛的放后面。
- 端口映射用 dst-nat,出站地址转换用 src-nat,不要混淆。
- drop 策略下必须放行 ESTABLISHED 和 RELATED 连接。
- 涉及防火墙控制的端口注意检查 hardware offload 状态。
- 善用 log-prefix 配合日志系统快速定位问题。
掌握这些要点,配合日常的模拟器练习(推荐用CHR镜像在 ESXi 或 Proxmox 里搭实验环境),基本能覆盖 90% 以上的 RouterOS 防火墙配置需求。希望这篇实战避坑指南对你有帮助。