在 Linux 使用 DOH (DNS over HTTPS)

每次上网时你的 DNS 请求都在互联网上裸奔?没错,传统的 DNS 查询就像是在人来人往的大街上大声喊出你要去哪里一样。而且,谁知道途中会不会遇到一些"热心"的旁观者,悄悄地把你指向了错误的方向呢?这就是臭名昭著的 DNS 污染啦!

但别担心,我们有一个既酷又安全的解决方案:DNS over HTTPS(DOH)。想象一下,你的 DNS 请求穿上了一件隐形衣,悄悄地通过 HTTPS 的安全隧道溜到目的地。

Cloudflared为此提供了一个解决方案,本文将教你如何通过Cloudflarred实现在Linux上全局使用DOH.

1. 安装 Cloudflared

这里只介绍Debian系的安装方法,其它方法请前往文章末尾”参考文档”链接查看

  1. 添加 Cloudflare 的包签名密钥
mkdir -p --mode=0755 /usr/share/keyrings

curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
  1. 将 Cloudflare 的 apt 存储库添加到您的 apt 存储库
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
  1. 安装
sudo apt-get update && sudo apt-get install cloudflared
  1. 验证安装
cloudflared --version

如果有输出,说明安装成功

2. 测试

  1. 执行
cloudflared proxy-dns

默认情况下是在 localhost:53 开放端口可以通过 --address--port 指定上游 DOH 服务器默认使用Cloudflare的 1.1.1.1 和 1.0.0.1
可以使用 --upstream 指定,例如

cloudflared proxy-dns --upstream https://9.9.9.9/dns-query
  1. 测试

保持cloudflared仍在运行,可以后台再开一个SSH或终端
执行

dig @127.0.0.1 google.com

如果正确解析到ip地址,则算成功
可以关闭cloudflared了

3. 部署

  1. 设置服务

为了使其在开机自动启动和更方便的管理,所以需要将cloudflared设置为服务
使用喜欢的编辑器打开 /etc/systemd/system/cloudflared-proxy-dns.service
写入以下内容

[Unit]Description=DNS over HTTPS (DoH) proxy client
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target

[Service]AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
DynamicUser=yes
ExecStart=/usr/local/bin/cloudflared proxy-dns

[Install]
WantedBy=multi-user.target

其中 ExecStart= 后面的部分为启动命令,可以改为测试时的命令,更改端口、地址、上游DOH等

:light_bulb:端口需要是 53,也就是默认端口

保存后执行此命令来启用并启动服务

sudo systemctl enable --now cloudflared-proxy-dns
  1. 设置DNS

用喜欢的文件编辑器打开 /etc/resolv.conf 删去其他 nameserver
写入 nameserver 127.0.0.1
保存并退出
现在使用的就是DOH了

:light_bulb:部分服务可能会将 /etc/resolv.conf 改回去,注意关闭这类服务或者修改配置,防止被更改

4. 修改配置

如果需要修改配置,如上游DOH,端口等

  1. 修改启动命令

用喜欢的编辑器打开之前的 /etc/systemd/system/cloudflared-proxy-dns.service 按需要修改即可,务必保存
2. 重新加载配置文件

systemctl daemon-reload
  1. 重启服务
systemctl restart cloudflared-proxy-dns

参考文档:

  1. 官方文档

2. 官方安装文档

https://pkg.cloudflare.com/index.html

作者: 小焰
链接: 在 Linux 使用 DOH(DNS over HTTPS) | Sakura Homura 的垃圾桶
声明: 本文采用 CC BY-NC-SA 4.0 许可协议,转载请标明出处。

本转载已经过作者授权。

24 个赞

owo(作者探头)

3 个赞

顶, 最近阿里DNS限制之后确实可行

本人尝试爱快开了dns缓存,结果好多iot设备直接无法联网了

这个方案是否可以缓存? 延迟是多少?

配置调优软件分享

#DNS添加

能不能缓存和延迟得看 Cloudflare 那边,本质上 DOH 是为了隐藏 DNS。

顶大佬

好厉害!

这就是银笔杆的含金量吗,respect

大佬:cow::beer:

这个自建完成后,自己的所有设备都可以走这个dns吗

感谢

按教材走是给你部署的这台上DOH
不过把地址指定成0.0.0.0
你设备指定dns服务器ip地址到你部署这台的ip地址应该也可以

1 个赞

ok , 等会我试一下

nameserver 127.0.0.1 是改这个吗

那是在你部署的那台Linux上可以这样,其它设备要填部署这台的内网ip
因为如果走公网的话就没有意义了

1 个赞

嗯好的,感谢

感觉不错

其实是 @endercat 写的,我只是负责转载 ¯⁠\⁠(⁠°⁠_⁠o⁠)⁠/⁠¯

建议分流后非国内域名走CF的dns