有时网站被墙,可能只是域名被劫持了,IP 还是通的。ISP 会拦截 53 端口数据,看到某些域名就 angry,直接返回一个假 IP。
例如对某域名进行两次 OpenDNS 查询:
$ dig +short example.com @208.67.222.222
$ dig +short example.com @208.67.222.222 -p 5353
第一次默认使用 53 端口,第二次使用非标准的 5353 端口。如果两次查询结果不一样,那么可能域名就被劫持了。这是因为 5353 端口暂时还没被屏蔽。
利用 Dnsmasq,除了可以使用非标准端口外,还能系统级屏蔽广告,岂不美哉?
另外还可以使用 DoH 或 DoT 加密方案,分别基于 HTTPS 和 TLS。
然而这两个方案缺乏系统级支持(据说 iOS 14、macOS 11、Windows 11 会支持?),而且 DoT 的 853 端口似乎已经被屏蔽了。不过 DoH 很有希望啊,毕竟总不能屏蔽标准 HTTPS 端口。
第三方 DoH 实现可以用 dnscrypt-proxy。
Dnsmasq
配置
安装 Dnsmasq,编辑配置文件 /etc/dnsmasq.conf(macOS 则为 /usr/local/etc/dnsmasq.conf),主要设置监听地址,以及上游 DNS & 端口:
listen-address=127.0.0.1
# ustc
server=202.141.162.123#5353
server=202.141.178.13#5353
# opendns
server=208.67.222.222#5353
server=208.67.220.220#5353
这里使用了中科大的 DNS 用于境内网站查询,OpenDNS 用于境外网站查询。其他选项可以酌情配置。
更新:科大 DNS 似乎不再提供校外服务。
2023 年 11 月,个人测试发现,清华 DNS 再次停止校外服务。
清华镜像到底是些什么人在维护,是不是脑子卷*了?给他们 contribute 的时候是一句谢谢也没有,没几个人的 issue,但凡有那么一丁点跑题就给 hide 掉,理由是 off-topic,我 off 你**。
这帮卷*是有点权力就一定要用出来才行,似乎不这样就体现不出和我们这些平头老百姓的区别,那能出孙铊就不奇怪了。
然后把系统 DNS 设置为 127.0.0.1
即可。
需要注意的是,类 Unix 系统的 DNS 一般在 /etc/resolv.conf 中,但这个文件不应该直接修改,因为它是由某些网络服务维护的,直接配置可能不生效或丢失。
例如 macOS 应该在系统设置里修改。Debian 可以参考 resolv.conf - Debian Wiki。
去广告
网上有不少现成的 Dnsmasq 去广告配置文件,例如 https://anti-ad.net/anti-ad-for-dnsmasq.conf
,将文件放到 /etc/dnsmasq.d/(macOS 则为 /usr/local/etc/dnsmasq.d/)下重启服务即可。
这些配置文件会经常更新,可以用 cron 定时自动更新。
由于只是屏蔽域名,网页上仍然可能出现牛皮癣,而且有些广告并没有单独使用域名,因此 AdBlock 这类插件还是有必要的。
DoH
要使用 dnscrypt-proxy,则应把 Dnsmasq 配置中的服务器转到 dnscrypt-proxy。个人没有这个需求,就不赘述了。