RouterOS

RouterOS学习笔记

2年前买了个RB493G,它是MikroTik当年出品的一款高性能企业级无线路由器,一直闲置着,落了不少灰。最近恰好要将大量数据从笔记本备份至ZFS存储,实在忍受不了LinkSYS WRT54G的无线速率,于是这两天把RB493G翻出来好好地玩了一把。

interface

RouterBOARD中的接口类型挺丰富,之前用得最多的就是千兆口和无线网卡,最近新出的RouterBOARD也带有SFP口了。当然,在RouterOS中接触最多的概念则是物理口和逻辑口。

PPPoE client

逻辑口,也就是拨号上网。注意哦,平时经常说ADSL拨号上网,实际上是两个概念,ADSL是物理层链路,拨号上网是通过PPPoE协议实现拨号、认证和计费。现在我用的是中国移动的家庭宽带,入户的直接就是一根网线,已经不再需要ADSL modern。

我将入户网线插入到RB493G的ether1中。Oracle的两根网线分别插入ether2和ether3,另外一根ether7置空,留作测试只用。

[admin@MikroTik] > interface pppoe-client print
Flags: X - disabled, R - running 
 0  R name="pppoe-out1" max-mtu=1480 max-mru=1480 mrru=disabled 
      interface=ether1 user="15904701233" password="123123" 
      profile=pppoe-client-default service-name="" ac-name="" 
      add-default-route=yes dial-on-demand=no use-peer-dns=yes 
      allow=pap,chap,mschap1,mschap2

ethernet

毋庸置疑,物理口。

[admin@MikroTik] > interface ethernet print
Flags: X - disabled, R - running, S - slave 
 #    NAME        MTU MAC-ADDRESS       ARP        MASTER-PORT     SWITCH    
 0 R  ether1     1500 00:0C:42:A9:AB:87 enabled    none            switch1   
 1 RS ether2     1500 00:05:5D:72:A5:0D enabled    none            switch2   
 2 RS ether3     1500 00:0C:42:A9:AB:89 enabled    none            switch2   
 3    ether4     1500 00:0C:42:A9:AB:8A enabled    none            switch2   
 4    ether5     1500 00:0C:42:A9:AB:8B enabled    none            switch2   
 5    ether6     1500 00:0C:42:A9:AB:8C enabled    none            switch1   
 6 R  ether7     1500 00:0C:42:A9:AB:8D enabled    none            switch1   
 7    ether8     1500 00:0C:42:A9:AB:8E enabled    none            switch1   
 8    ether9     1500 00:0C:42:A9:AB:8F enabled    none            switch1

比较特别的地方是ether2和ether3均有一个S的标识,这是由于创建了一个bonding逻辑接口,下属口就是ether2和ether3。

bonding

逻辑口,包含了ether2和ether3,这两个口通过两根网线与solaris 11的两个网口相连,构建Link Aggregation。

[admin@MikroTik] > interface bonding print         
Flags: X - disabled, R - running 
 0  R name="bonding1" mtu=1500 mac-address=00:05:5D:72:A5:0D arp=enabled 
      slaves=ether2,ether3 mode=802.3ad primary=none link-monitoring=none 
      arp-interval=100ms arp-ip-targets=192.168.172.20 mii-interval=100ms 
      down-delay=0ms up-delay=0ms lacp-rate=30secs 
      transmit-hash-policy=layer-2-and-3

RouterOS中对802.3ad的实现并不完整,尚未兼容layer-3-and-4这种策略,因此对端也只能设置成L2,L3或L2+L3。

wireless

物理口。此处用的无线网卡是R52n,可以实现2.4G和5G的802.11n。关键在于笔记本的无线网卡,很多仅支持2.4G的802.11n。

[admin@MikroTik] /interface> wireless print
Flags: X - disabled, R - running 
 0  R name="wlan1" mtu=1500 mac-address=00:0C:42:66:45:56 arp=enabled 
      interface-type=Atheros 11N mode=ap-bridge ssid="RB493G" 
      frequency=2412 band=2ghz-b/g/n channel-width=20mhz scan-list=default 
      wireless-protocol=802.11 wds-mode=disabled wds-default-bridge=none 
      wds-ignore-ssid=no bridge-mode=enabled default-authentication=yes 
      default-forwarding=yes default-ap-tx-limit=0 
      default-client-tx-limit=0 hide-ssid=no security-profile=default 
      compression=no

配置很复杂,还是通过winbox方便一些。即便是再忠诚的命令行拥护者也不能阻挡GUI的诱惑。

IP address

[admin@MikroTik] /ip> address print
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                            
 0   192.168.22.254/24  192.168.22.0    wlan1                                
 1   192.168.172.254/24 192.168.172.0   bonding1                             
 2 D 183.254.43.236/32  183.254.0.1     pppoe-out1                           
 3   192.168.44.254/24  192.168.44.0    ether7

RouterOS跟其它的网络设备配置有些区别,IP地址跟物理口的设置分别在两个不同的菜单中,最终在IP地址菜单中实现两者的捆绑。

DHCP server

此处仅针对wireless提供DHCP服务。

[admin@MikroTik] /ip> dhcp-server print
Flags: X - disabled, I - invalid 
 #   NAME        INTERFACE     RELAY     ADDRESS-POOL        LEASE-TIME ADD-ARP
 0   dhcpServer   wlan1                     dhcp                  3d        
[admin@MikroTik] /ip> pool print
 # NAME         RANGES                         
 0 dhcp         192.168.22.1-192.168.22.10

NAT

显然,需要为RouterOS中所有网段提供NAT才能正常访问互联网。

[admin@MikroTik] /ip firewall> nat print
Flags: X - disabled, I - invalid, D - dynamic 
 0   chain=srcnat action=masquerade to-addresses=0.0.0.0 out-interface=pppoe-out1

NAT配置位于firewall菜单中,其的选项也很复杂,此处的关键是out-interface需要选择pppoe-out1

Link Aggregation

Oracle的文档非常详尽,MikroTik的RouterOS也很简单,因此创建Link Aggregation倒是很(容易)[]。

然而,两者通过两根网线连接后,死活ping不通,我尝试着更换了各种组合,譬如solaris侧分别设置了Policy: L2、L3和L2/L3,LACPactivity: active、passive和off等各种组合,RouterOS中的link monitor也尝试了arp、mii-1等,均未成功。实在没办法,于是只能采用终极大法:升级固件。

升级之后,终于实现Link Aggregation。手工模拟故障,先在RouterOS上ping solaris11的IP地址,拔掉任意一条网线均不影响两者之间的互联,顶多掉一个包。问题得到解决,solaris 11.1最终设置成了:

# dladm show-aggr aggr0

固件升级

我所买的RB493G的license是Level5,因此可以升级到后续的两个大版本号,比如说现在的RouterOS是V4.16,则最高可以升级到V6。

RouterBOARD的升级非常简单,在winbox界面中,打开file,然后将最新的firmware拖进winbox中,最后在terminal中system reboot重启即可。

自从将Linksys WRT54G换成了RB493G后,一个明显的感觉就是,笔记本通过无线浏览网页的速度比以前快多了,难道是心理作用?

RouterOS中的几个调试工具

ROS的几个有用的测试工具

1、ping

  • 语法:ping
    option
  • 例子:ping 8.8.8.8 src-address=10.10.10.254
  • 说明:src-address这个选项有bug,icmp request包头的源地址仍然使用接口地址,而非10.10.10.254

2、telnet

  • 语法:telnet
    port
  • 例子:telnet 10.168.1.9 80

3、tcpdump

没有找到tcpdump,用什么来捕获数据包呢?原来ROS提供了一个packet sniffer的工具,只是用起来没有tcpdump那么方便,搞不懂源于linux的ROS为何不用tcpdump这个正统的排错工具。

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