routeros(ros)源于Linux,因此ros中的firewall拥有netfilter的影子,譬如ros的firewall含有INPUT、OUTPUT、FORWARD链,还有nat、mangle表,但是又有区别,特别是以下两点值得注意:

  1. ros的firewall似乎不支持状态检测;

  2. 默认情况下,ros的firewall允许所有数据包通过。

这两点我实在无法理解。

关于第一点,在一般的状态防火墙中,假如欲允许内网用户访问外网的web应用,只需要定义一条从内到外的访问规则即可,状态防火墙会自动识别从外至内的“相关(establised/related)”包,但是ros的firewall还需要额外再定义这两条(establised/related)从外至内的规则。

关于第二点,一般的防火墙的默认规则是drop,这是符合大多数管理员的思维的:凡是未经许可的连接均应丢弃,这种思路有两个好处:一是安全性高,不至于因为管理员的疏忽导致整个网络开放给外网,一是容易扩展,因为管理员永远都无法掌握或预知所有的威胁,因此仅定义允许的数据流才是正确的防火墙策略管理思路。

需求

  1. 允许10.10.10.0/29访问192.168.100.0/24

  2. 允许10.10.10.8/29访问172.16.100.0/24

  3. 允许所有(方向)ping

  4. 允许ROS访问所有区域

脚本

# apr/17/2011 13:16:32 by RouterOS 4.16
#
/ip firewall filter
#### INPUT chain ####
## 定义返回的"已连接/相关"数据包
add action=accept chain=input comment="Allow Established connections" \
    connection-state=established disabled=no
add action=accept chain=input comment="Allow Related connections" \
    connection-state=related disabled=no
## 在所有端口上允许ping ros
add action=accept chain=input comment="Allow ICMP" disabled=no protocol=icmp
## 在所有端口上允许通过SSH访问ros
add action=accept chain=input comment=SSH disabled=no dst-port=22 protocol=\
    tcp
## 在所有端口上允许通过winbox访问ros
add action=accept chain=input comment=winbox disabled=no dst-port=8291 \
    protocol=tcp
add action=accept chain=input comment=DHCP disabled=no dst-port=67-68 \
    protocol=tcp
## 在所有端口上允许访问ros的DNS服务
add action=accept chain=input comment="DNS - TCP" disabled=no dst-port=53 \
    protocol=tcp
add action=accept chain=input comment="DNS - UDP" disabled=no dst-port=53 \
    protocol=udp
### 若INPUT的数据包未符合上述定义则全部丢弃
add action=drop chain=input comment="### DROP EVERYTHING ELSE - INPUT ###" \
    disabled=no src-address-list=""
####FORWARD
##允许返回的"已连接/相关"数据包通过
add action=accept chain=forward comment=\
    "Allow established connections - FORWARD" connection-state=established \
    disabled=no
add action=accept chain=forward comment="Allow related connections - FORWARD" \
    connection-state=related disabled=no
add action=drop chain=forward comment="Drop invalid connections - FORWARD" \
    connection-state=invalid disabled=no
##凡是属于tcp的数据包将跳转至tcp chain进行处理(用户自定义)
add action=jump chain=forward comment="" disabled=no jump-target=tcp \
    protocol=tcp
##凡是属于udp的数据包将跳转至udp chain进行处理(用户自定义)
add action=jump chain=forward comment="" disabled=no jump-target=udp \
    protocol=udp
##允许内网用户ping外网主机
add action=accept chain=forward comment="Allow ICMP" disabled=no protocol=\
    icmp
### tcp chain
## 在netfilter防火墙中,数据包会流经所有规则,由最后一条符合的规则处理该数据包。
## 为了提高效率,我们将数据包按协议划分成tcp、udp和icmp三类,每一类数据包均由各自的用户自
## 定义链处理,从而减少数据包检查的次数。这里将利用jump target和用户自定义链来实现。
add action=accept chain=tcp disabled=no src-address=10.10.10.0/29 dst-address=192.168.100.0/24
add action=accept chain=tcp disabled=no src-address=10.10.10.8/29 dst-address=172.16.100.0/24
### udp chain
add action=accept chain=udp disabled=no src-address=10.10.10.0/29 dst-address=192.168.100.0/24
add action=accept chain=udp disabled=no src-address=10.10.10.8/29 dst-address=172.16.100.0/24
### 若FORWARD的数据包未符合上述定义则全部丢弃
add action=drop chain=forward comment=\
    "### DROP EVERYTHING ELSE - FORWARD ###" disabled=no

这里没有涉及到OUTPUT链,因为根据需求,不需要额外对OUTPUT进行限制。