cover-img
avatar

托码特人

创作者的知识库

一个关注技术与人文的科技博客

DNS玩法知多少

对于网络加速,有很多种办法。最简单直接的莫过于通过钞能力实现,然而如果不额外花费(比如:提升宽带/加私服/换硬件等)想要达到提升效果,优化 DNS算是一种很有效的手段…

对于我来说,任何时候更换路由器,第一件事就是进入路由器管理后台手动更换运营商提供的 DNS 服务,原因很简单:

  1. 上网较慢:通常运营商提供的 DNS 都是某个地区特定线路的节点,效果嘛只能说可以用;
  2. 安全性差:如果说网慢一点(在忍耐范围内)也还能接受,但时不时被劫持、投放广告就过份了,当然还不仅限于此;

一般来说,我们可以在路由器后台或者自己电脑上手动指定适合自己的 DNS 服务,目前国内比较知名的有 阿里腾讯114这么几个,读者可以根据自己的情况自行选择。具体姿势如下:

# 以阿里DNS解析为例,获取离我最近的京东官网IP节点
nslookup www.jd.com 223.5.5.5

# 拿到上个命令的最终结果,PING下连通性能(选最合适你的那个)
ping 27.36.125.193 -c 2

本文将分享另一种更为极客范的姿势,即:通过SmartDNS搭建本地 DNS 服务,特别适用于希望获得全球特定加速的人群。

PS:如果浏览器面前的你,对开发工具配置不是太熟练,以下内容可能会有难度。正常上网冲浪,并不需要这么折腾!

SmartDNS

SmartDNS,一个开源、高性能的本地 DNS 服务器工具,支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。

更多详情,读者可以移步到他们的官网:https://pymumu.github.io/smartdns

基于 macOS 的本地化

smartdns工具本身是用 C 语言写的,目前该工具并不能直接跑在macOS下。有两种方式可以完成 mac 本地化

特别提示:由于rust版的目前仍在开发阶段,我试了通过brew install smartdns安装,不过有一些问题。刚好我本地有Docker环境,所以就换成容器方案了。

工具依赖说明

  1. Docker:下载和运行容器,具体移步:https://hub.docker.com/r/pymumu/smartdns
  2. Git:用于dnsmasq-china-list源码下载;
  3. Make:用于构建基于本地 DNS 服务的 list,如果 mac 有安装过 XCode,则认为make命令默认有效;

基于规则分流

由于某些众所周知的原因,国内公共 DNS 服务对海外网站解析是有限的。如果想要实现内外有别,推荐基于dnsmasq-china-list构建自己的清单。否则,仅 Docker 化就可以了

如果你已经准备好了上述工程源码,那现在可以开始构建了

make SERVER=domestic smartdns

这句命令的意思是,把国内节点解析交给smartdns
成功后,会生成几个以smartdns.conf结尾的配置文件,然后再把它复制到系统目录:/et/smartdns/domestic

注意使用sudo操作,如果对应目录不存在,则手动创建。最后赋予文件可读权限…

配置参考

以下是smartdns.conf的配置参考,该文件位于:/etc/smartdns。如果没有,需要手动创建它

# Listen on local port 53, both ipv4 and ipv6
bind [::]:53


# 日志信息
log-num 5
log-size 2M
log-level warn
log-console yes

# 禁用全局测速
speed-check-mode none

# 启用双栈优选
dualstack-ip-selection yes

# 域名预先获取功能,开启会提高系统资源占用率
prefetch-domain yes
cache-size 4096

# 配置 bootstrap-dns,如不配置则调用系统的,建议配置
server-https https://cloudflare-dns.com/dns-query -bootstrap-dns -exclude-default-group

# ----- Default Group(解析海外) -----
server 1.0.0.1
server 8.8.4.4
server 9.9.9.9
server-tls 1.1.1.1
server-tls 8.8.8.8

# ----- Domestic Group(解析国内) -----
## 腾讯 DNSPod IP DoT
server-tls 1.12.12.12:853 -group domestic -exclude-default-group
server-tls 120.53.53.53:853 -group domestic -exclude-default-group
## 阿里 IP DoT
server-tls 223.5.5.5:853 -group domestic -exclude-default-group
server-tls 223.6.6.6:853 -group domestic -exclude-default-group
## 114 DNS、使用 TCP 查询
server-tcp 114.114.114.114 -group domestic -exclude-default-group
server-tcp 114.114.115.115 -group domestic -exclude-default-group
## DNSPod 兜底
server 119.29.29.29 -group domestic -exclude-default-group


# ----- Office Group(解析办公区内网) -----
# Configure the Office(Home) upstream server
server 192.168.1.1 -group office -exclude-default-group

# Domain names ending with work are forwarded to the office group for resolution
nameserver /work/office


# ----- 其他个性化配置 -----
# Set static IP for domain name
address /x.tangkunyin.com/127.0.0.1


# Block Domains (Ad Blocking)
address /ads.baidu.com/#


# 加载由 dnsmasq-china-list 生成的 domain-rules 配置文件,使得国内的解析走 domestic 组
conf-file /etc/smartdns/domestic/*.conf -group domestic

以上就是全球均衡的一个配置参考,各项参数的用途参考官方:https://pymumu.github.io/smartdns/configuration

运行和测试

配置文件和容器环境准备妥当后,执行以下命令:

docker run -d --name smartdns --restart=always -p 53:53/udp -v /etc/smartdns:/etc/smartdns pymumu/smartdns:latest

然后,你可能会运行失败!因为53 端口被系统服务占用了,你可以通过lsof -i:53sudo lsof -i:53看下是哪个进程占用了,然后杀掉、重启容器

容器运行后,可以看到它的状态如上,可以清晰的看到事实上它并没有占用过多的系统资源。接着把本机的 DNS 改成:127.0.0.1

nslookup 一把

小结

DNS 之于网络的重要性不言而喻!构建一个合适的 DNS 服务,对每个网民都非常重要,希望本文能对读者带来一些启发和有用的参考。

更多有料有趣的知识,可以看这篇文章:我有特别的 DNS 配置和使用技巧

在此,感谢所有作者的奉献,以上!

赞赏

声明: 本文内容由托码斯创作整理,由于知识水平和时效性问题,行文可能存在差错,欢迎留言交流。读者若需转载,请保留出处,谢谢!