新的 WIFI6 路由器 和 SmartDNS

背景

最近一直不满意我的NAS传输速度只有500Mb+(50MB/s),小米的AX3600 真是太弱了。

正好最近老姐家说WiFi信号不行,仔细一看还是我之前嫖的斐讯K2, 于是我就把这个AX3600寄回去给老姐家用了,我打算换个WIFI6路由器。

RT-AX86U

这个路由器功能非常多 本文无法体现,!请不要根据本文的简要描述决定是否购买(这个不是评测)!

选材其实蛮有意思的,我现有的NAS总计5个网口 (I350 + 主板集成的),I350是支持汇聚的。

直接搜了一下有没有支持链路聚合的WiFi6路由器,然后就看到了这个AX86U,而且还带2.5G RJ45口,而且还不是特别贵。 而且原有的功能几乎没有缺失的 比如游戏加速器(主机端必须这么玩,其实不管哪个端都更好 不用在每个平台下安装app),指示灯熄灭。

果断入了一个 第二天送货上门。

然后就开始了折腾之旅

没想到这么蛋疼 耗时6天(第6天在验证最终链路)

初始化配置

其实一切都很顺利 命名一样的SSID,一样的密码,原有设备无痛连接到新的路由器上。

但连接到NAS的设备都断开了,因为连接到NAS都是通过域名来实现的。

原先AX3600 可以自定义Hosts,但这个不行,找了找教程 发现都说要刷梅林固件,然后用SSH连进去再用root权限修改。但不是想走这条路,现有官方的固件已经强大到不用刷固件了,除了不能改hosts。

于是就只能在NAS开一个DNS服务了。这里是windows server,各种DNS都没有windows版,毕竟win server自己就有..

Windows Server DNS Service

版本 windows server 2019 datacenter (1809)
友情提示: 请先看完全篇文章 再来决定要不要安装这个服务。

部署DNS服务

其实部署都是大同小异,服务管理器 -> 添加角色和功能 -> DNS服务器

然后勾选 DNS服务器工具 就可以在接下来的步骤配置了

如果你觉得这有困难 可以参考: Windows server 2016搭建DNS服务

配置DNS服务

这一步很关键 解析,上游服务器,缓存都需要配置,很复杂 很坑爹。

我建议先看看教程 再来亲手实践 参考: Windows server DNS服务器配置与管理

我只讲我遇到的一个域名解析的坑,因为这个DNS配置的时候是个树形结构,支持多级,
我还以为需要先配个顶级域名才能一级一级的向下建,

比如 router.asus.com, 我是先建立的 com,在com下建立 asus,然后在asus下建立router解析。

看起来很容易管理对吧,但是这种方式是 完全 错误 的。

这会导致 这个 DNS 完全接管 com 域名,导致里面只有这一条解析记录,其他的全部都找不到。

这个坑花了我一天时间解决,淦。

如果仅需要这一条解析记录 只需要在正向解析里直接解析这一条记录就可以了。。。。

移除DNS服务

排除了上面的错 还有一个关键问题 不得不让我 不使用这个DNS服务。

那就是 性能

在次日晚上我回来时,发现打开网页巨慢,网站上连图片都加载不出来,百思不得其解,但过了一会就又好了,刷新网页也变得正常了,于是初步怀疑还是DNS的问题,找到了一个工具 dnsping。然后对dns解析进行测试,发现第一次解析竟然长达16s….. 后续解析都维持在1-2ms左右,这….

还有这种性能问题?? 要知道我之前用树莓派4b搭dnsmasq 响应都是超快的。搭完 配好上游服务器 就能畅玩了。

于是想来想去还是决定找个dns服务器吧。 找了一番发现 windows下没有,那就还是用dnsmasq吧。

先到删除角色和功能向导里 把这个 DNS Service 给卸载了。

然后在windows server上安装WSL,尽管看起来跑的都是正常,但是最终的结果还是失败了,
只能在WSL内部解析 无法映射到53端口

其实也可能是防火墙没打开 但是也不建议各位再去尝试了 因为 win server上只有wsl v1,并且网络机制不太一样。

于是就找到了smartdns,官方提供了windows 安装教程,但请不要再去尝试了 windows server上是会报错的。

也是需要借助于WSL

所以剩下两种方法(类似一种 需要借助虚拟机)

  • docker
  • 虚拟机

docker 的一个好处就是安装一个服务非常容易 不需要太多管理。所以这里就采用Docker的方式。

windows上的Docker也是需要借助虚拟机的 用来提供一个linux环境。

Hyper-V

提到虚拟机 就需要先打开hyper-v了,参考官方的:在 Windows Server 上安装 Hyper-V 角色

Docker

这里还是可以用docker desktop的
运行docker intasll程序就可以了。

由于smartdns占用内存实在太小了 内存不宽裕的 可以调小docker engine内存

我这里是 8G RAM ,分配给docker engine是 4cores + 1G RAM

SmartDNS

https://github.com/pymumu/smartdns
版本: ghostry/smartdns:v2020.09.08

基于 win server docker(on hyper-v) 安装

按 win + x,打开power shell

安装

docker pull ghostry/smartdns
docker run -d -p 53:53/udp --restart=always --name gsmartdns -v ~/.gsmartdns:/smartdns ghostry/smartdns

重启

docker restart gsmartdns

删除 (彻底删除容器和数据)

docker container stop gsmartdns ; docker container rm gsmartdns

配置

打开docker desktop

然后点 CLI(图标) 进入到 smartdns 容器里

编辑配置文件

cd smartdns
vi smartdns.conf

常用配置(不全)

注意 这里不能直接覆盖这个配置文件 这里只是讲讲配置的意思
一般情况下 只需要配置 上有服务器 和 自定义解析即可(如果有)

# 缓存数量
cache-size 4096
# 域名预先获取
prefetch-domain yes
# 测速模式
speed-check-mode tcp:80,tcp:443,ping
# 日志级别
log-level warn
# 上游服务器 配10个左右为最佳
server 8.8.8.8 -blacklist-ip -check-edns
server 114.114.114.114
server 119.29.29.29
server 1.2.4.8
server-tls 1.1.1.1
server-tls 8.8.4.4
server-tls 9.9.9.9
# 这个是类似于DoH 可以防止劫持 如果你所在的地区仍然有sb运营商劫持你 就只配置这个就好了
server-https https://cloudflare-dns.com/dns-query
# 自定义解析
address /router.asus.com/192.168.50.1

配置到路由器

在此之前一定要先在 windows 高级防火墙,把53端口的入站协议打开。

打开 AX86U的 web GUI

外部网络(WAN) -> DNS 服务器1 配置为NAS的ip

如果NAS的ip有多个 一般只有1个是dns占用的
使用 nslookup blog.waynecommand.com your_ip 来测试是否能解析。

外部网络(WAN) -> DNS 服务器2 配置为 1.1.1.1 或是你喜欢的上游DNS

这么做有两个好处:

  1. AX86U 仍然有DNS Service 这是”第二层缓存”,这个缓存会进一步加速解析, 并且包含已定义的 router.asus.com 的映射,你访问路由器不会受到影响。
  2. 当NAS(或是你的DNS server)宕机了之后,路由器会failback到 dns2,路由器下的设备仍然可以正常访问网络服务。仅自定义的解析会受到影响。但是 DNS Service 一般都会带上缓存 只要你恢复服务的时间 大于 缓存失效时间,是可以cover住这个宕机期间的服务访问的。

测试

其实好不好用第二天就知道了 (也就是第六天)

回来之后抓紧测了一下 一切正常 因为有些性能损耗(hyper-v, docker), 所以不会有那么那么丝滑的体验,但总体上还是不错的。

但是既然都找到工具了 就顺便测试一下性能指标了

dnsping

Github: DNS Ping

dnsping.exe blog.waynecommand.com 192.168.50.1
09:51:34 I dnsping v1.1.4: will query until interrupted, sleeping 1s in between, the server 192.168.50.1:53 for A (1) record for blog.waynecommand.com.
09:51:34 I  11.6 ms   1: [blog.waynecommand.com.      288     IN      A       172.67.141.18]
09:51:35 I   1.0 ms   2: [blog.waynecommand.com.      287     IN      A       172.67.141.18]
09:51:36 I   1.0 ms   3: [blog.waynecommand.com.      286     IN      A       172.67.141.18]
09:51:37 I   1.0 ms   4: [blog.waynecommand.com.      285     IN      A       172.67.141.18]
09:51:38 I   1.0 ms   5: [blog.waynecommand.com.      284     IN      A       172.67.141.18]
09:51:39 I   1.0 ms   6: [blog.waynecommand.com.      283     IN      A       172.67.141.18]
09:51:40 I   1.0 ms   7: [blog.waynecommand.com.      282     IN      A       172.67.141.18]
09:51:41 I   2.0 ms   8: [blog.waynecommand.com.      281     IN      A       172.67.141.18]
09:51:42 I   1.0 ms   9: [blog.waynecommand.com.      280     IN      A       172.67.141.18]
09:51:43 I   7.0 ms  10: [blog.waynecommand.com.      279     IN      A       172.67.141.18]

0 errors (0.00%), 10 success.
response time (in ms) : count 10 avg 2.76142 +/- 3.445 min 1.0004 max 11.625200000000001 sum 27.6142
# range, mid point, percentile, count
>= 1.0004 <= 1.1 , 1.0502 , 70.00, 7
> 2 <= 2.5 , 2.25 , 80.00, 1
> 6 <= 7 , 6.5 , 90.00, 1
> 10 <= 11.6252 , 10.8126 , 100.00, 1
# target 50% 1.0668
# target 90% 7
# target 99% 11.4627

可以看到 首次 会慢一点点 接下来就是hit cache. 就会很快很快。

这一段是直连到NAS的

dnsping.exe blog.waynecommand.com 192.168.50.193
09:51:23 I dnsping v1.1.4: will query until interrupted, sleeping 1s in between, the server 192.168.50.193:53 for A (1) record for blog.waynecommand.com.
09:51:24 I 217.6 ms   1: [blog.waynecommand.com.      299     IN      A       172.67.141.18]
09:51:24 I  13.6 ms   2: [blog.waynecommand.com.      298     IN      A       172.67.141.18]
09:51:25 I   8.1 ms   3: [blog.waynecommand.com.      297     IN      A       172.67.141.18]
09:51:26 I   9.0 ms   4: [blog.waynecommand.com.      296     IN      A       172.67.141.18]
09:51:27 I   9.0 ms   5: [blog.waynecommand.com.      295     IN      A       172.67.141.18]
09:51:28 I   6.0 ms   6: [blog.waynecommand.com.      294     IN      A       172.67.141.18]
09:51:29 I  14.7 ms   7: [blog.waynecommand.com.      293     IN      A       172.67.141.18]
09:51:30 I   9.0 ms   8: [blog.waynecommand.com.      292     IN      A       172.67.141.18]

0 errors (0.00%), 8 success.
response time (in ms) : count 8 avg 35.867188 +/- 68.73 min 6.0018 max 217.5713 sum 286.9375
# range, mid point, percentile, count
>= 6.0018 <= 7 , 6.5009 , 12.50, 1
> 8 <= 9 , 8.5 , 37.50, 2
> 9 <= 10 , 9.5 , 62.50, 2
> 12 <= 14 , 13 , 75.00, 1
> 14 <= 16 , 15 , 87.50, 1
> 200 <= 217.571 , 208.786 , 100.00, 1
# target 50% 9.5
# target 90% 203.514
# target 99% 216.166

直连会稍微慢一点 性能完全比不上树莓派上跑dnsmasq,但是有 路由器的”二级缓存 “性能就会好很多。

大功告成

这套方案 走了很多弯路 耗时6天

还有其中没讲的 udp转发,链路聚合,WSL2,以及其他。(坑死我了 这些都是弯路)

大感谢

然后再来着重感谢一下 开源项目 (排名不分先后)

  • dnsping(fortio)
  • smartdns(pymumu)
  • gssmartdns(ghostry)
  • docker desktop(主程序未知是否开源 但内部的机制不是重复造轮子的)

预告

终于可以躺下来爽一会儿了。

另外预告下一个blog: “NAS升级:2.5G网络和链路聚合