(Khurshid, 2022)

本教程将会教你如何自己搭建一个DNS over HTTPS resolver(以下简称DOH)。

将会使用的系统/工具: Ubuntu22.04LTS,DNSdist。

什么是DOH?

要了解DOH以及它的优势我们需要先了解传统的DNS。DNS负责把域名转换成IP地址,传统的DNS在设计之初并没有考虑到安全或者隐私,传统的DNS请求用明文传输,比如在很多地区你在不用代理的情况下使用 8.8.8.8 DNS,然后打开Google.com。由于你的DNS请求是明文并且由UDP(Connectionless)传输。这就导致会被类似于GFW的中间人攻击,GFW就在这时使用DNS投毒。所以很多时候你以为你设置了 8.8.8.8 然后看起来确实也在工作,但其实你访问很多境外域名由于还是明文传输请求就会导致请求被劫持然后被返回一个错误的IP地址。DOH在这时候就出现了,DOH使用https加密你的明文请求,这样第三方就不知道你的DNS请求内容(当然你的上游DNS还是会知道你要请求的内容)。网上有很多公共的DOH,比如1.1.1.1和8.8.8.8都提供有DOH,但是这些DOH都已经被GFW屏蔽了。

搭建DOH

第一步:安装DNSdist

如果你已经在用Ubuntu22.04的话可以直接运行 sudo apt install dnsdist

如果你使用Ubuntu20.04或者18.04,建议从上游仓库安装DNSdist。

Ubuntu 20.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu focal-dnsdist-17 main" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 18.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-17 main" | sudo tee /etc/apt/sources.list.d/pdns.list

 然后再为DNSdist创建一个preference文件。

sudo nano /etc/apt/preferences.d/dnsdist

在文件中加入以下内容。

 Package: dnsdist*
 Pin: origin repo.powerdns.com
 Pin-Priority: 600

保存并关闭此文件。然后运行以下命令来吧PowerDNS的公钥加入APT package manager,这样就能验证从上有仓库下载的DNSdist的完整性。

curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -

然后再更新系统和安装DNSdist

sudo apt update
sudo apt install dnsdist

第二步:安装TLS证书(Let's Encrypt)

因为DOH需要https,所以不可避免的需要一个证书。我们使用Certbot来完成证书的申请,同时也为了以后的方便。

sudo apt install certbot

然后检查是否安装成功

certbot --version

如果有版本输出的话就是成功了。

第三步:使用Certbot获取证书

因为在本教程中我们假设你是用的是刚刚安装好的系统,没有Nginx/Apache之类的网页服务器安装在你的机器上,所以我们使用Certbot的standalone方式获取证书。

你需要先把一个A记录指向你的服务器IP。DOH,如其名就是需要一个域名+https来访问。推荐使用一个subdomain来指向服务器IP然后用subdomain作为DOH域名(例如: doh.example.com)。当你完成A记录指向后就可以运行以下命令申请证书了(请把邮箱和域名doh.example.com改为你的自己)。

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email you@example.com -d doh.example.com

解释命令:

certonly: 只获取证书,但是不安装。

--standalone: 使用standalone插件来获取证书。

--preferred-challenges http: 使用http-01验证你的域名,这将会使用80端口。

--agree-tos: 同意Lets's Encrypt的TOS。

--email: 用这个邮箱注册

-d : 使用你自己的域名

第四步:用DNSdist开启DOH

编辑DNSdist的配置文件

nano /etc/dnsdist/dnsdist.conf

在配置文件中加入以下内容。证书填你刚刚获取的自己的证书和密钥。

-- allow query from all IP addresses
setACL('0.0.0.0/0')

-- add a DoH resolver listening on port 443 of all interfaces
addDOHLocal("0.0.0.0:443", "/etc/letsencrypt/live/doh.example.com/fullchain.pem", "/etc/letsencrypt/live/doh.example.com/privkey.pem", { "/" }, { doTCP=true, reusePort=true, tcpFastOpenSize=0 })

-- downstream resolver
newServer("1.1.1.1:53")

保存并关闭配置文件。

给予权限并测试配置文件

DNSdist使用用户 _dnsdist 来运行,所以我们需要给这个用户权限来读取TLS证书,运行以下命令。

sudo apt install acl

sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

然后我们用下列命令检查配置文件是否正确

sudo dnsdist --check-config

如果返回OK! 那就表示配置正确,接下来我们重启DNSdist让配置生效。

sudo systemctl restart dnsdist

使用crontab在每次申请新证书时自动给予权限

当Certbot更新证书的时候,你需要重新分配权限,所以我们使用crontab来自动化这个过程

sudo crontab -e

加入以下配置

@daily certbot renew --quiet; setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

第五步:使用Firefox来测试DOH

接下来我们使用Firefox浏览器来测试DOH是否工作正常。

network.trr.mode

我们需要先把在 about:config 页面把 network.trr.mode 设置为3,在默认为2的时候,即使DOH请求失败,Firefox也会使用系统的DNS来完成这个请求,这样我们无法测试DOH是否正常,所以设置为3,这样就会一直使用DOH来解析了。

测试

在这时你就可以在settings搜索dns然后再在Connection Settings里最后两行开启DOH然后填入自己的DOH了。

完成以后在隐私页面搜索栏输入 waifu.ooo ,如果网页正常打开,那就代表DOH正常工作了。

结语

教程就在这里结束了。谢谢各位的观看。本文的思路和章节布局基本全部来自于linuxbabe的Xiao Guoan。封面来自Usman Khurshid。链接会在References给出。

 

References

Xiao Guoan. (2022, September 15). Set up DNS over HTTPS (DOH) resolver on ubuntu with DNSdist. LinuxBabe. Retrieved March 25, 2023, from https://www.linuxbabe.com/ubuntu/dns-over-https-doh-resolver-ubuntu-dnsdist

dnsdist. (n.d.). Configuring downstream servers¶. Configuring Downstream Servers - dnsdist documentation. Retrieved March 25, 2023, from https://dnsdist.org/guides/downstreams.html

dnsdist. (n.d.). Over-https (DOH)¶. DNS-over-HTTPS (DoH). Retrieved March 25, 2023, from https://dnsdist.org/guides/dns-over-https.html

Khurshid, U. (2022). What Is Dns-Over-Https And How To Enable It On Your Device (Or Browser). Itechtics. Retrieved March 25, 2023, from https://www.itechtics.com/wp-content/uploads/2020/05/DNS-over-HTTPS-featured-700x496.jpg.