华硕路由器及域名解析折腾小记

陪她去流浪 桃子 2021年06月28日 阅读次数:5914

今年二月份的时候在朋友的多次安利下终于下单买了个华硕的 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”。这是什么?难道是能直接登上路由器的系统?如下图所示:

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

居然 etchomeoptvarroot 这类常用目录都被挂在了 /tmp 下,我猜是因为这样可以做到重启后恢复这些临时数据。

再通过 dfmount 看到了根目录下有一个名为 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

然后在我的手动上尝试通过 raspberrypialpine 连接在两个树莓派上的服务,居然都成功了(重启 dnsmasq 之前是不成功的)!说明都生效了,爽!

配置的持久化

因为 /etc/ 是被挂载到 /tmp 下的,那么 /etc/dnsmasq.conf 配置文件在重启后肯定就没了。

我在网上搜索了相关问题,发现没有好办法。早期的时候,路由器在启动的时候会自动加载一些 /jffs 目录内的用户脚本,后来这些功能被干掉了,不知为何。

鉴于路由器重启是非常低频的操作,我暂时没有折腾了。我只是写了个脚本自动同步这个配置到路由器。

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:路由器 · 华硕路由器 · DNS