华硕路由器及域名解析折腾小记
今年二月份的时候在朋友的多次安利下终于下单买了个华硕的 AC68U 路由器(挺古董了),替换了早在 2016 年花几十块钱购买的 TP-LINK 路由器。 TP-LINK 的 UI 做得还是算漂亮、现代的,不过,由于网口带宽只有 100M,内网数据传输、看看电影什么的,有时竟然有点卡,所以还是决定更换设备。
这些年来我有一个问题在我看来一直没有被很好地解决:我的家庭内网中有很多的设备,不少设备还跑着不同的服务,应该如何设置这些设备的域名解析?
- 直接使用 IP 地址是挺讨厌的;
- 把 IP 地址和设备名添加到
/etc/hosts
感觉回到了远古还没有 DNS 的时代; - 如果自己拥有一个购买的域名的话,可以直接配置即可全网生效。比如域名为 example.com,树莓派的 IP 地址为
192.168.1.6
。 那么只需要在域名管理处添加一条 A 记录即可:rpi.example.com -> 192.168.1.6
。 不过我觉得这样挺麻烦的,一来是不方便维护,二来是名字比较长、三来是涉及到配置同步。 - 另有一个我挺疑惑的点是,为什么大多数路由器都支持像是:MAC与IP地址绑定、端口映射等功能,却没有一种路由器支持手动设置域名解析? 即便我们内网的设备连上路由器后通过 DHCP 拿到了 IP 地址、网关 和 DNS 地址,后两者都是路由器本身。 我尝试直接 ping 我的设备名基本都不通(除了 Mac 外,因为它支持 mDNS),这就让我很崩溃。
发现 SSH 服务
今天在折腾 AC68U 的时候,居然发现在“高级设置”、“系统管理”、“系统设置”、“服务” 这里看到一项 “启用 SSH”。这是什么?难道是能直接登上路由器的系统?如下图所示:
我本来还是不太确定的,因为华硕的配置页面(比如:http://192.168.1.1/Advanced_System_Content.asp)是以 “.asp” 结尾的,话说这不是 Windows 上的服务吗?
我一直以为华硕路由器是个嵌入式类的 Windows 系统。直到我 ssh -p 65534 192.168.1.1
,它居然提示我输入密码!!!
在使用网页上路由器的管理员用户名和密码登录上去以后,我震惊了!确认这是个 Linux。
~ → ssh -p 65534 asus@192.168.1.1
asus@192.168.1.1's password:
asus@RT-AC68U-7360:/tmp/home/root# uname -a
Linux RT-AC68U-7360 2.6.36.4brcmarm #1 SMP PREEMPT Fri Nov 15 11:54:23 CST 2019 armv7l ASUSWRT
系统概览
对这个输出有几个关注点:
- 登录上去的 home 目录居然在 /tmp 目录下?
- 这是一个 2.6.36 版本的 Linux 内核;
- 这是一块 armv7l 的 构架;
- 操作系统是 ASUSWRT(开源的,在这里的操作系统中选择“其它”可以下载源代码);
内存信息:
asus@RT-AC68U-7360:/tmp/home/root# free
total used free shared buffers cached
Mem: 255700 68280 187420 0 412 10844
-/+ buffers/cache: 57024 198676
Swap: 0 0 0
根目录:
asus@RT-AC68U-7360:/tmp/home/root# ls -lh /
drwxr-xr-x 2 asus root 721 Nov 15 2019 bin
drwxr-xr-x 2 asus root 3 Nov 15 2019 cifs1
drwxr-xr-x 2 asus root 3 Nov 15 2019 cifs2
drwxr-xr-x 6 asus root 1.5K Jun 15 02:21 dev
lrwxrwxrwx 1 asus root 7 Nov 15 2019 etc -> tmp/etc
lrwxrwxrwx 1 asus root 8 Nov 15 2019 home -> tmp/home
drwxr-xr-x 5 asus root 0 Jun 28 00:21 jffs
drwxr-xr-x 3 asus root 281 Nov 15 2019 lib
lrwxrwxrwx 1 asus root 9 Nov 15 2019 media -> tmp/media
drwxr-xr-x 2 asus root 3 Nov 15 2019 mmc
lrwxrwxrwx 1 asus root 7 Nov 15 2019 mnt -> tmp/mnt
lrwxrwxrwx 1 asus root 7 Nov 15 2019 opt -> tmp/opt
dr-xr-xr-x 118 asus root 0 Jan 1 1970 proc
drwxr-xr-x 6 asus root 755 Nov 15 2019 rom
lrwxrwxrwx 1 asus root 13 Nov 15 2019 root -> tmp/home/root
drwxr-xr-x 2 asus root 2.7K Nov 15 2019 sbin
drwxr-xr-x 11 asus root 0 Jan 1 1970 sys
drwxr-xr-x 2 asus root 3 Nov 15 2019 sysroot
drwxrwxrwx 14 asus root 1.3K Jun 28 00:27 tmp
drwxr-xr-x 10 asus root 169 Nov 15 2019 usr
lrwxrwxrwx 1 asus root 7 Nov 15 2019 var -> tmp/var
drwxr-xr-x 14 asus root 7.1K Nov 15 2019 www
居然 etc
,home
,opt
,var
,root
这类常用目录都被挂在了 /tmp
下,我猜是因为这样可以做到重启后恢复这些临时数据。
再通过 df
及 mount
看到了根目录下有一个名为 jffs
的持久存储:
asus@RT-AC68U-7360:/tmp/home/root# df -h
Filesystem Size Used Available Use% Mounted on
rootfs 38.6M 38.6M 0 100% /
/dev/root 38.6M 38.6M 0 100% /
devtmpfs 124.8M 0 124.8M 0% /dev
tmpfs 124.9M 3.3M 121.6M 3% /tmp
/dev/mtdblock4 62.8M 2.8M 59.9M 5% /jffs
asus@RT-AC68U-7360:/tmp/home/root# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=127744k,nr_inodes=31936,mode=755)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock4 on /jffs type jffs2 (rw,noatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
域名解析
Busybox 的 netstat
不支持 -p
参数使得我不能知道是谁监控了 53 号端口,但是通过 grep 我找到了路由器的 DNS 服务是 dnsmasq 提供的。
asus@RT-AC68U-7360:/tmp/home/root# netstat -ntl | grep :53
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN
asus@RT-AC68U-7360:/tmp/home/root# ps | grep -i dns
219 nobody 1220 S dnsmasq --log-async
220 asus 1088 S dnsmasq --log-async
17076 asus 1396 R grep -i dns
以下是 dnsmasq 的配置文件:
asus@RT-AC68U-7360:/# cat /etc/dnsmasq.conf
pid-file=/var/run/dnsmasq.pid
user=nobody
bind-dynamic
interface=br0
interface=pptp*
no-dhcp-interface=pptp*
no-resolv
servers-file=/tmp/resolv.dnsmasq
no-poll
no-negcache
cache-size=1500
min-port=4096
dhcp-range=lan,192.168.1.2,192.168.1.254,255.255.255.0,86400s
dhcp-option=lan,3,192.168.1.1
dhcp-option=lan,252,"\n"
dhcp-authoritative
dhcp-host=78:4F:43:96:C2:A0,set:78:4F:43:96:C2:A0,192.168.1.100
dhcp-host=66:80:56:A1:32:DA,set:66:80:56:A1:32:DA,192.168.1.101
dhcp-host=B8:27:EB:D7:7A:AC,set:B8:27:EB:D7:7A:AC,192.168.1.103
dhcp-host=DC:A6:32:69:E6:AD,set:DC:A6:32:69:E6:AD,192.168.1.6
dhcp-script=/sbin/dhcpc_lease
script-arp
由于配置文件中没有 no-hosts
语句,所以其是会解析 /etc/hosts
文件的。
所以我直接到 /etc/hosts
文件中测试加入了以下几行(后面几行):
asus@RT-AC68U-7360:/# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.1 RT-AC68U-7360. RT-AC68U-7360
192.168.1.1 router.asus.com
192.168.1.1 www.asusnetwork.net
192.168.1.1 www.asusrouter.com
192.168.1.6 raspberrypi
192.168.1.103 alpine
然后发信号让 dnsmasq 重新加载配置:
asus@RT-AC68U-7360:/# ps | grep [d]ns
219 nobody 1220 S dnsmasq --log-async
220 asus 1088 S dnsmasq --log-async
asus@RT-AC68U-7360:/# kill -SIGHUP 219 220
然后在我的手动上尝试通过 raspberrypi
和 alpine
连接在两个树莓派上的服务,居然都成功了(重启 dnsmasq 之前是不成功的)!说明都生效了,爽!
配置的持久化
因为 /etc/
是被挂载到 /tmp
下的,那么 /etc/dnsmasq.conf
配置文件在重启后肯定就没了。
我在网上搜索了相关问题,发现没有好办法。早期的时候,路由器在启动的时候会自动加载一些 /jffs
目录内的用户脚本,后来这些功能被干掉了,不知为何。
鉴于路由器重启是非常低频的操作,我暂时没有折腾了。我只是写了个脚本自动同步这个配置到路由器。