MikroTik

如何在RB450中做vlan trunk

RB450是MikroTik公司出品的基于RouterOS的三层路由器,提供了丰富的功能:动态路由协议(OSPF、BGP)、802.1q、QoS(单IP限速)、netflow exporter、NTP、OpenVPN、PPPoE、radius等。今天我主要用它来创建36个vlan,每个vlan都分配一个网关IP,接着通过一个以太口与一台二层交换机的vlan trunk相连,实现了这36个vlan的互访。

以下是相关配置:

/interface vlan
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan5 use-service-tag=no vlan-id=5
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan2 use-service-tag=no vlan-id=2
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan41 use-service-tag=no vlan-id=41
...
/ip address
add address=172.16.60.254/24 broadcast=172.16.60.255 comment="" disabled=no \
    interface=vlan41 network=172.16.60.0
add address=192.168.100.254/24 broadcast=192.168.100.255 comment="" disabled=\
    no interface=vlan100 network=192.168.100.0
add address=172.16.59.254/24 broadcast=172.16.59.255 comment="" disabled=no \
    interface=vlan2 network=172.16.59.0
add address=172.16.58.254/24 broadcast=172.16.58.255 comment="" disabled=no \
    interface=vlan5 network=172.16.58.0
…

这就实现了vlan trunk的功能,非常简单,但是RouterOS毕竟是linux,所以它与实际的交换机还是有一些区别的,譬如不能在一个vlan trunk中支持untag的vlan,亦即native vlan,不知道换了交换芯片atheros8316的RB450G功能会不会更强大一些,详见:http://wiki.mikrotik.com/wiki/Switch_Chip_Features

RouterOS中的防火墙功能

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进行限制。