在千兆级别的无线路由器里,小米路由器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 0log-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.logdnsmasq及本地名称解析
dnsmasq是小型网络的全家桶。它既是路由器的DHCP服务器,也可以用于本地域名解析,甚至还支持tftp。通过版本信息可以看到它具体支持/不支持哪些特性。
它不支持DNS安全扩展,暗示了它支持普通的DNS解析。我想用名称来访问局域网内的主机时,就需要用到本地域名服务器。
在有的路由器上,DHCP设定的名称会自动用于DNS解析。比如,
把pc1的IP设定为10.9.8.11pc2的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就比较完美了。基本上超过我以前使用的千元级别的华硕路由器了。