在Router OS上虚拟一个可以上网的Openwrt

RouterOS Aug 24, 2015

Miktorik Routerboard 的一些型号(RB400, RB700 series, RB900 series, RB2011 boards, RB1000, RB1100, RB1100AH and RB800)支持Metarouter功能,相当激动人心,在一个600Mhz mipse CPU,128M RAM的路由器上可以再跑一个全功能的openwrt linux!而且虚拟的openwrt系统可以完成对母路由器上物理ethernet端口的映射连接,对外来看相当于把一个物理路由器劈成了两个甚至多个路由器,而这一切在功耗只有几瓦,长度二十厘米左右的一个路由器小板上已经成为了现实,强大的ROS!在RB2011UiAS-2HnD上开始兴奋地折腾之旅啦:

在Ubuntu上构建Barrier Breaker编译环境

$ sudo apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc zip
  • 下载BB编译环境源码及Metarouter补丁(基于广范流传的1.2 patch的修正版本,解决了rxbuf导致的不断crash问题)
$ wget --no-check-certificate https://gist.github.com/leleobhz/61cd38b851d254a0cee6/raw/c5b7317a0082f96ec76b015545cf7376c07dd4f4/openwrt_metarouter_1407-fix-rxbuf.patch
$ git clone git://git.openwrt.org/14.07/openwrt.git barrier_breaker
$ cd barrier_breaker
$ patch -p1 -i ../openwrt_metarouter_1407-fix-rxbuf.patch
  • 预备编译
$ make defconfig
$ make prereq
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

编译和获取Metarouter image

$ make menuconfig

选择Mikrotik MetaROUTER MIPS作为Target System,接着在下面选择需要编译进去的软件包(比如需要用Python, Shadowsocks, ChinaDNS之类...),完成Save后就可以开始编译了:

$ make -j4

喝杯咖啡,吃片🍰,聊个小天,如果一切正常完成,那么在编译目录里bin/mr-mips文件夹里就能看到需要的虚拟镜像文件了:openwrt-mr-mips-rootfs.tar.gz。将其拷贝出来,通过Router OS的web管理界面上传到路由器上:

启动虚拟的Openwrt

给32~64M内存吧,点Start开始导入,等待完成。

SSH到Router OS,确认Metarouter运行状态:

[admin@MikroTik] /metarouter> /metarouter print
Flags: X - disabled 
 #   NAME    MEMORY-SIZE     DISK-SIZE     USED-DISK STATE        
 0   mr1           64MiB     unlimited      29913kiB running

连接到Openwrt终端:

[admin@MikroTik] /metarouter> /metarouter console 0

回车后看到下面兴奋熟悉的画面:

Oh yeah!

在Openwrt里做PPPoE拨号

  • Metarouter的Interface选项卡里映射两个物理端口到Openwrt(比如ether1做wan口,ether5做lan口),一个连接光猫的口,一个连接通过Openwrt上网的设备口(确保此网口不与Router OS里的其他设置冲突,否则可能导致整个ROS不稳定频繁重启之类,比如多数端口是属于系统默认网桥的,而默认网桥是有DHCP服务的,这时候要不选择将端口移出ROS网桥,要不把Openwrt里的针对此端口的DHCP服务关闭。):
  • 在Openwrt里配置两个网口

vi /etc/config/network

配置lan对内子网地址;

设置pppoe账号密码以及拨号端口(比对ifconfig输出的信息,根据ROS分配的MAC地址来确认对应端口)。

config interface 'lan'
        option ifname 'eth1'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.6.1'
        option netmask '255.255.255.0'
        option ip6assign '60'

config interface 'wan'
        option ifname 'eth0'
        option proto 'pppoe'
        option username 'xxxxxxxx'
        option password 'xxxxxx'
  • 配置dnsmasq来获得恰当的DHCP参数

vi /etc/dnsmasq.conf

比如,指定DHCP地址分配范围和租用时长:

dhcp-range=lan,192.168.2.101,192.168.2.114,255.255.255.0,24h

如果一切正常,将电脑或第二级路由连接到RB2011UiAS-2HnD的ether5物理接口上,那么就可以正常通过pppoe的链接上网了。

待解决的问题

  • 稳定性有很严重的问题,大概1.5h左右的时间,Openwrt会导致整个RB2011UiAS-2HnD重启,似乎是RouterBoard的watchdog触发的:

Message router was rebooted without proper shutdown by watchdog timer

重启后回到可用状态,然后1.5h后接着重启...似乎如果不把物理端口映射绑定到Openwrt坚持得久一些,至少3h多没问题,但那就没多大意思了不是...

貌似相关稳定性的问题在Miktorik官方论坛也有不少讨论了,貌似目前依旧没有什么有效的解决方法,有人提到这必定是Router OS的bug,无论如何虚拟的client系统怎么能把宿主ROS系统给搞reboot了呢,无法忍受!好吧,600Mhz的MIPSBE,128M的内存,在一个嵌入系统上虚拟另一个嵌入式系统,玩玩就好...