在千兆级别的无线路由器里,小米路由器3G的硬件配置是强于小米路由器4的。路由3G的RAM是256MB(而路由4是128MB),而且多一个USB3.0。 也许是因为不支持USB,路由4根本就不提供开发版了。所以路由3G是性价比和可玩性最高的。

为什么使用开发版ROM

小米路由器的Web管理界面很简洁,基本只有核心功能(但对绝大多数用户都是够用的)。对于爱折腾的用户,则略显不足。比如我要加一个开机脚本,或者想在路由器上用tcpdump抓包,默认的ROM是不能实现的。

而开发版ROM可以ssh登录路由器,就像进入一个小的Linux系统,可控程度不可同日而语。

当然,OpenWRT也是灵活强大的,在3G上也可以刷。不选择它的原因一方面是官方的开发版已经足够强大了,两者是类似的(官方ROM本身也是改自OpenWRT);另一方面是官方ROM支持手机管理,多了一个选择。比如有一次我的动态域名更新失败,通过手机界面,远程找到了路由器的IP。

下载开发版ROM

从小米官网(http://www1.miwifi.com/miwifi_download.html)下载开发版ROM。

小米路由器开发版及配置-小米路由器开发版及配置参数-风君雪科技博客

开发版的版本似乎比稳定版要低,最后更新于2018年10月。

刷机

很多人都是通过U盘刷机,其实这并不是必须的。网页的管理界面上就可以刷机。点右上角的“系统升级”,选择下载的ROM,然后点“手动升级”即可。

小米路由器开发版及配置-小米路由器开发版及配置参数-风君雪科技博客

获取初始root密码

下载开启ssh的工具(https://d.miwifi.com/rom/ssh)。这个页面同时也是获取root密码的界面。但前提条件是登录小米账号,并(通过手机客户端“小米WiFi”)绑定/管理对应的路由器。

开启ssh则需要USB的支持了。根据官方的说明,主要流程是:将miwifi_ssh.bin拷到U盘根目录,关路由器插U盘,按reset键上电,黄灯闪烁后松reset。

开启ssh完成,路由器重启后,就可以用这个密码登录路由器了。

小米路由器开发版及配置-小米路由器开发版及配置参数-风君雪科技博客

登录后可以用passwd命令修改root的密码。

用密钥登录

用ssh-copy-id建立密钥的信任关系会失败,可能是因为dropbear和openssh密钥存储的位置不同。所以需要手动加一下。

PC端运行

scp ~/.ssh/id_rsa.pub root@10.7.3.1:/etc/dropbear/authorized_keys

路由器上运行下面的命令重启ssh服务。

/etc/init.d/dropbear restart

再重新登录就可以了。

文件系统

登录路由器后,先看看文件系统,以便合理使用。

小米路由器开发版及配置-小米路由器开发版及配置参数-风君雪科技博客

可以看到:

  • /extdisks/sda1 对应于USB存储。因为我有NAS,再加上使用USB有可能影响2.4G WiFi,所以我并不打算使用路由器上的USB存储。
  • /tmp是内存虚拟的文件系统,所以里面的内容关机/重启后会丢失;另外,/var是/tmp的符号链接,所以也不会永久保存。
  • /etc, /data, /userdisk 是同一块Flash,里面的内容会永久保存。结合目录内容来看,/etc, /userdisk其实是/data的子目录。

如保我们想保存永久性的log,就不能像普通Linux系统保存在/var/log里了,而/userdisk看起来是小米路由器App在用,我也不想动它,那么,保存在/data/usr/log可能是一个合理的选择。

启动脚本

/etc/rc.local是可以用的,所以可以在这里作为启动脚本的入口。脚本本身可以保存在/etc目录或/data/usr/bin目录。

下面是我的/etc/rc.local。调用/data/usr/bin里的脚本是我加的。

# restore phy config
speed=$(uci -q get xiaoqiang.common.WAN_SPEED)
[ -n “$speed” ] && /usr/sbin/phyhelper swan “$speed”
/data/usr/bin/log-ip.sh
/data/usr/bin/ddns.sh
exit 0

log-ip.sh 用于记录每次启动拔号得到的IP地址,内容如下:

#!/bin/sh
logdir=/data/usr/log
test -d $logdir || mkdir -p $logdir || exit 1
addr=$(ip addr show pppoe-wan | grep -w inet | awk ‘{print $2;}’)
echo “$(date ‘+%Y/%m/%d %a %H:%M:%S’) – $addr” | tee -a $logdir/wanip.log

dnsmasq及本地名称解析

dnsmasq是小型网络的全家桶。它既是路由器的DHCP服务器,也可以用于本地域名解析,甚至还支持tftp。通过版本信息可以看到它具体支持/不支持哪些特性。

小米路由器开发版及配置-小米路由器开发版及配置参数-风君雪科技博客

它不支持DNS安全扩展,暗示了它支持普通的DNS解析。我想用名称来访问局域网内的主机时,就需要用到本地域名服务器。

在有的路由器上,DHCP设定的名称会自动用于DNS解析。比如,

  • 把pc1的IP设定为10.9.8.11
  • pc2的IP自动分配为10.9.8.102

在同一个网络内,通过名字pc1即可以访问10.9.8.11这台主机,通名字pc2即可以访问10.9.8.102这台主机。

这个过程是可以(部分)自动化的。但小米路由器里没有这么做。所以要找一个解决办法。

dnsmasq的配置文件是/tmp/etc/dnsmasq.conf,位于/tmp目录说明它是一个动态生成的文件,而配置文件内部也说明了这一点。

# auto-generated config file from /etc/config/dhcp
conf-dir=/tmp/etc/dnsmasq.d/
dhcp-authoritative
addn-hosts=/tmp/hosts

所以,源头的配置文件是/etc/config/dhcp。我们可以通过修改这个文件,加入静态地址配置(网页配置界面上也会同步更新)。因为我需要把几十条华硕路由器里的DHCP静态配置重新设定到小米路由器中,于是用脚本做格式转换,然后写入这个文件。

从这个配置文件里还可以看到,/tmp/hosts内的主机名会用于域名解析。所以,解决办法就是把需要解析的主机名及其IP地址加入这个目录。类似于下面:

10.7.3.1 router
10.7.3.2 nas
10.7.3.3 nuc
10.7.3.4 kodi
10.7.3.6 3dprint
10.7.3.7 printer
10.7.3.8 radio

由于/tmp目录下的内容不是永久保存的,所以需要将这个主机列表放在/data/usr/etc目录,在启动脚本里将其拷贝到/tmp/hosts目录。

经过这翻折腾后,小米路由器3G就比较完美了。基本上超过我以前使用的千元级别的华硕路由器了。