DNS-over-HTTPS
DNS-over-HTTPS 是 DNS over HTTPS 的一种实现。它可以作为存根解析器(stub resolver)。
安装
安装 dns-over-https 软件包。
客户端启动
禁用绑定到 53 端口的任何服务
要查看是否有程序在使用 53 端口,请运行
$ ss -lp 'sport = :domain'
如果输出内容除了第一行列名外还有其他内容,则需要禁用任何使用 53 端口的服务。一旦上述命令的输出不再包含除以下行以外的任何内容,即可继续
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
更改系统 DNS 服务器
将系统的 DNS 服务器更改为配置文件中 listen = 部分的地址。如果您不确定如何操作,建议使用 127.0.0.1。
这可以通过您的 网络管理器 或通过编辑 /etc/resolv.conf 来完成。
启动
测试配置
要测试系统的 DNS 是否正常工作,请在命令行中输入 nslookup www.google.com。请注意,假设您在安装此软件之前已有 DNS 配置,那么在配置 DNS-over-HTTPS 之前此操作也是有效的。
客户端配置
客户端配置文件默认位于 /etc/dns-over-https/doh-client.conf
选择首选的上游 DNS 服务器
要选择首选的 DNS 服务器,请取消其中一个配置文件的注释。
如果您首选的服务器不在列表中,可以在 [upstream] 部分使用以下模板。
/etc/dns-over-https/doh-client.conf
[[upstream.upstream_ietf]]
url = "https://IP_or_web_address/dns-query"
weight = 20
服务器配置
doh-server 的配置文件位于 /etc/dns-over-https/doh-server.conf。upstream 部分可以设置所需的上游解析器及其使用的协议。您可以将 doh-server 作为独立服务运行,或与 nginx 或 apache 等 Web 服务器 配合使用。
若要独立使用,您需要将端口设置为 443 并指定正确的证书和密钥
/etc/dns-over-https/doh-server.conf
listen = [
"127.0.0.1:443",
]
...
cert = ""
key = ""
如果您想使用 HTTP 服务器进行缓存或将其与其他 HTTPS 服务一起使用,请将 doh-server.conf 中的 cert 和 key 字符串留空,并参考以下示例来配置所需的 HTTP 服务器。
/etc/nginx/nginx/site-available/doh
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name MY_SERVER_NAME;
ssl_certificate /path/to/your/server/certificates/fullchain.pem;
ssl_certificate_key /path/to/your/server/certificates/privkey.pem;
location /dns-query {
proxy_pass https://:8053/dns-query;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
/etc/caddy/Caddyfile
MY_SERVER_NAME {
reverse_proxy * localhost:8053
tls my@email.example
try_files {path} {path}/index.php /index.php?{query}
}
/etc/httpd/conf/vhosts/doh.conf
<VirtualHost *:443>
ServerName MY_SERVER_NAME
Protocols h2 http/1.1
ProxyPass /dns-query http://[::1]:8053/dns-query
ProxyPassReverse /dns-query http://[::1]:8053/dns-query
</VirtualHost>
配置完成后,启动/启用 doh-server.service。
故障排除
服务在有线连接中无法正常启动
正如 开发者所解释的
- ArchLinux 没有自带默认的网络管理框架,因此 systemd 在交付时未预配置在线检测。
- 如果您使用 Wi-Fi,我建议确保 systemd 的在线检测能够正常运行。我相信您的系统已经安装了某些网络管理框架(如 NetworkManager)来帮助您管理 Wi-Fi 密码。
- 或者,如果您使用有线网络,最简单的解决方案就是修改 .service 文件以禁用在线检测。为非移动设备安装 NetworkManager 可能违背了 K.I.S.S. 原则,而我们不希望那样。
上游 建议在服务文件中使用 drop-in 片段 来
/etc/systemd/system/doh-client.service.d/override.conf
[Unit] After=multi-user.target [Service] Type=idle
doh-server 无法打开 TLS 密钥
doh-server.service 包含 DynamicUser=yes,这会阻止其访问非全球可读的文件(例如密钥文件)。解决方法是创建一个带有 LoadCredential= 指令的 drop-in 文件,然后在 /etc/dns-over-https/doh-server.conf 中使用 /run/credentials/doh-server.service/ 路径。例如
/etc/systemd/system/doh-server.service.d/key.conf
[Service] LoadCredential=server.key:/etc/dns-over-https/server.key
/etc/dns-over-https/doh-server.conf
... cert = "/etc/dns-over-https/server.crt" key = "/run/credentials/doh-server.service/server.key" ...