旧时代的dns配置
之前折腾过好久的dns ,试过很多种dns方案,我列举一下方案和解决的问题
- 本地
dnsmasq
服务- 允许使用自定义
dns
- 本地缓存
dns
结果 - 并发查询
dns
(貌似没什么用),仅仅取最先返回的结果 - 特定域名绑定特定
dns
服务器,server=/www.xxx.com/114.114.114.114
- 允许使用自定义
dnsmasq
+dnsmasq-china-list
- 该方案在上一方案的基础上利用dnsmasq-china-list实现
dns
分流
- 该方案在上一方案的基础上利用dnsmasq-china-list实现
smartdns
+dnsmasq-chinalist
- 使用smartdns替代dnsmasq,支持
doh
、doh
、非标准端口查询等技术 smartdns
支持并发查询,同时支持对结果测速并优选(实际体验,不太好用)
- 使用smartdns替代dnsmasq,支持
方案设计
最近意识到一线运营商(移动、电信、联通等),对国内常见服务基本不会(不敢)投毒。所以我实际上要解决的是国外服务的dns
污染现象。那么正好可以把dnsmasq-china-list
当作黑名单,里面的域名的dns
查询,转发到运营商dns
,从而获得较好的cdn
体验和运营商优化。大概如下图:
方案详细
- 使用
NetworkManager
作为网络管理器,并启用dnsmasq
插件 dnsmasq
用于国内外分流和dns缓存systemd-resolved
负责解析国内域名,使用NetworkManger
转发的默认dchp配置,即运营商路由smartdns
负责解析国外域名,主要采用加密的dns方案,防止运营商dns抢答和dns污染,有需要的话,可以让部分dns
查询走socks5
代理
优势
- 可以得到较好的cdn体验(如果你的运营商不作妖)
- 国外域名走加密的dns查询,不会被抢答和篡改
缺点
- 无法解决运营商dns污染(cdn的正常运行是有代价的)
- 就算国外的域名,也无法避免污染(除非指定使用国外的dns服务器,
google
和cloudflare
都在国内有服务器),如果要彻底解决该问题,建议透明代理
或者全局代理
,本方案重点是解决常用国外域名的dns污染的,兼顾运营商的网络加速和出口优化。
准备
使用环境
我的笔记本使用的是最新版本的Archlinux
,网络管理器是NetworkManager
。
如果你不知道NetworkManager
是什么,只要你使用的是KDE
或者Gnome
那么你的默认网络管理器就是``NetworkManager`。
前提条件
下列体系配套使用依赖于NetworkManager的下列行为,官方文档NerworkManager.conf
- NetworkManager 可以使用
dnsmasq
插件作为本地dns
缓存 NetworkManager
默认将dns
配置转发到systemd-resolved
配置
配置systemd-resolve
确保服务启动
|
|
自定义Fallback
服务器
如果 systemd-resolved 无法从 接收DNS服务器地址, 网络管理器 并且没有 配置DNS服务器, 手动 则 systemd-resolved 会回退到后备DNS地址,以确保DNS解析始终有效。
|
|
配置NetworkManager
编辑配置文件,启用dnsmasq
插件
|
|
配置dnsmasq
启动参数
如果使用dnsmasq
插件来进行dns
缓存,NetworkManager
会在启动时启动一个子进程来运行dnsmasq
,配置时注意disable
其他运行在127.0.0.1:53
的dns
服务。
编辑下列文件设定新的配置目录(可以不配置,我这么做是为了复用之前的dnsmasq配置文件),这样配置后,会使用dnsmasq
默认配置目录中的文件。
|
|
配置dnsmasq
安装并配置dnsmasq-china-list
如果启用了archlinuxcn源
:
|
|
使用 hooks
自动替换 dns
服务器
注意,如果要使用该 hooks
,必须在安装 dnsmasq-china-list
前完成下列配置;如果已经完成安装,可重新安装一次以确保dns
服务器被替换完成。
|
|
未启用archlinuxcn源
,使用yay
或其他aur helper进行安装:
|
|
上述hooks
,对aur
同样有效
非archlinux,前往 dnsmasq-china-list 自行安装:
注意make时编辑一下SERVER
变量,不要使用默认的114服务,应当指向我们运行在本地的systemd-resolved
配置smartdns
smartdns主要用于外网dns解析,这种情况下我们基本没有国内cdn
可用,不需要考虑,因此直接使用 cloudflare
和 google
的 doh
和 dot
服务。在翻墙时,可以开启远程 dns
解析来获取 cdn
服务。
|
|
一些优化(玄学)建议 for smartdns
|
|
最后
建议使用 wireshark
测试一下配置是否成功