跳转至内容

DNS-over-HTTPS

来自 ArchWiki

DNS-over-HTTPSDNS 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 来完成。

启动

启动启用 doh-client.service

测试配置

要测试系统的 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
注意 请选择您信任的 DNS 解析器。参见 域名解析#第三方 DNS 服务

服务器配置

doh-server 的配置文件位于 /etc/dns-over-https/doh-server.confupstream 部分可以设置所需的上游解析器及其使用的协议。您可以将 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 中的 certkey 字符串留空,并参考以下示例来配置所需的 HTTP 服务器。

nginx:

/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;
  }
}

Caddy:

/etc/caddy/Caddyfile
MY_SERVER_NAME {
        reverse_proxy * localhost:8053
        tls my@email.example
        try_files {path} {path}/index.php /index.php?{query}
}

Apache HTTP Server:

/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"
...

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.