关于DNS的一些事儿

Posted by wyj on October 20, 2022

分享一些我这几个月碰到的、关于DNS的事,希望能帮到有类似需求的人。

DNS over HTTPS

这个在Chrome里和Firefox里都是可以设置的,但是我尝试的大部分DoH server都无法正常使用;最后发现https://1.0.0.1/dns-query是能用的,很不错。可以使用1.0.0.1/help来检测目前是否已经开启DoH。

此外,ECH(Encrypted Client Hello)也是需要先打开DoH的,因此也能通过检测ECH来验证DoH是否工作正常。

Cloudflare WARP

WARP作为一个免费代理还是很不错的,可以正常使用。但是我想要通过它开启全局DoH,就彻底不行了——整个系统都无法上网了,Chrome显示DNS_PROBE_FINISHED_BAD_CONFIG。最可怕的是,Ubuntu的sudo在运行时会尝试访问snapcraft.io,因而用sudo执行任何命令都要等十几秒!

直接访问ip(或者等价地,让SSR等解析DNS)就能正常打开网页,看起来是DoH并没能成功配置;跑resolvectl query查询结果一切正常(或许这个命令是自带走DoH的),开启了DoH之后的Chrome和Firefox也能够正常上网。这些都不关键,关键是WARP就直接罢工了,丧失了任何功能,甚至连关掉它自己开的DoH都做不到!没办法,只能自己动手,试图恢复原有的设置了。修复方法(大致上需要做的是这些事,但我中途走过不少弯路,因此不敢保证这几条命令就直接管用了):

sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
sudo service systemd-resolved restart

TUN Mode

就是Clash的TUN Mode,这对我而言非常有用,而且并非孤例:我在许多地方都听过这一个说法,“TUN Mode能解决一切网络问题”。在知道TUN Mode以前,无论用什么CLI程序或者GUI程序,我都要研究半天如何让它走代理!而且很多时候,比如装Electron,走代理非常困难;而lutris、steam等应用压根就无法从代理联网,让人几乎无法使用,连蔚蓝的mod都不能自动安装依赖和自动更新(相当于apt变成了dpkg)。自从有了TUN Mode,这一切问题都迎刃而解。

然而TUN Mode也不是在Clash里面点开就能用的;实际上你会发现还是无法正常访问互联网。看Clash的log就发现,原来这个模式下不会让代理解析DNS,还是用墙国的被污染的DNS server在解析(就算你是在从境外访问这些server也没用),都是先查询出来错误的ip,然后再试图走代理连接这些错误的ip。碰到这种问题,相信大多数人的第一反应会是与我一样的:改个/etc/hosts不就完了嘛!但是hosts毕竟是有生存期的,我那些古老的hosts已经烂光了,都删掉了;我也不想再找新的了,毕竟以后还是要失效。但注意到此处情况毕竟是特殊的,是在走代理访问DNS server;于是直接把DNS服务器设成8.8.8.8,就能一劳永逸地让TUN Mode正常使用了。

等下,一劳永逸?Ubuntu 图形界面里的DNS服务器设置是对于每个连接分别设置的,换一个WiFi就又用不了了!如果每个WiFi都要重新设置,那还是太烦了。我从这里找到了设置全局DNS的解决方案。

这个方案挺麻烦的,自己找基本上是搞不定的。先是要在/etc/systemd/resolved.conf里面增加一行DNS=8.8.8.8 8.8.4.4(或者什么别的DNS服务器);然后要创建一个新文件/etc/NetworkManager/conf.d/dns.conf,往里面写入如下内容:

[main]
# do not use the dhcp-provided dns servers, but rather use the global
# ones specified in /etc/systemd/resolved.conf
dns=none
systemd-resolved=false

然后注销就好了。那个网站里说重启几个服务就好了,但是我亲测没有用。一定要保证resolvectl status里面只有Global字段有DNS Server。现在就真的一劳永逸了。