DNS over HTTPS 服务器
DNS 自诞生以来,在 UDP/53 及其后来的 TCP/53 上一直是以明文传输的,这使其容易受到嗅探攻击。有关可用于解决此漏洞的可用协议的更多信息,请参阅 域名解析#隐私与安全。本文涵盖了 DNS 服务器的三种可用协议中的两种,以及提供 DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 所需的代理配置。AUR 中有多个 DoH 工具可用,包括 corednsAUR, dns-over-https 和 doh-proxyAUR。具体选择哪种方案取决于您网络的实际需求。
corednsAUR 既提供缓存的非权威 DNS 服务器,也提供 DoH 服务(需引用来源)。
dns-over-https, doh-proxyAUR 均提供 HTTP 监听器,用于在您现有的 HTTPS 服务器之后进行代理,并提供存根解析器将 UDP/53 上的常规查询转发到安全的 DNS 服务器。此外,doh-proxyAUR 还提供一个独立运行的 HTTPS/2 服务器。
DoH 服务器/代理软件配置
coreDNS
您可以将 coreDNS 用作 DoH/DoT/gRPC DNS 服务器 和/或 DoT 代理。默认配置文件应位于 /etc/coredns/Corefile。
简单配置文件的示例示例如下:
/etc/coredns/Corefile
protocol://domain:port {
forward domain forward_to
tls_servername domain_of_dot_server
tls cert_path key_path
}
第一行是监听器,您可以使用以下协议:dns:// 用于普通 DNS 协议,http:// 用于 DNS over HTTPS,tls:// 用于 DNS over TLS 以及 grpc:// 用于 gRPC(参见 [1])。如果您将协议留空(例如 example.com:53),将默认选择 dns://。domain 用于匹配查询的域名,您可以使用特定的域名(例如 dns: //example.com: 53)或使用 .(例如 dns: //.: 53)来匹配所有域名。通过 :port 您可以设置监听端口,留空则默认选择 53 端口。
forward 字符串用于指定 DNS 查询的转发位置。在 domain 中使用 . 以匹配所有域名。在 forward_to 中设置接收查询的上游 DNS 服务器,您可以为 DoT 服务器指定 tls:// 协议。如果您使用上游 DoT 服务器,则需要设置 tls_servername 以进行 TLS 协商。
如果您使用 DoH、DoT 或 gRPC 协议,tls 字符串是强制要求的。请按给定顺序在此处填写证书和私钥路径。
一个简单的 DoT 代理配置示例,监听 53 端口并使用 Cloudflare DoT 服务器:
/etc/coredns/Corefile
. {
forward . tls://1.1.1.1 {
tls_servername cloudflare-dns.com
}
}
此外,您可以使用多个实例和转发插件。
/etc/coredns/Corefile
https://.:443 {
forward . 127.0.0.1 {
forward example1.com 8.8.8.8
tls cert.pem key.pem
}
tls://example2.com:853 {
tls cert.pem key.pem
forward . tls://9.9.9.9 {
tls_servername dns.quad9.net
}
}
启动/启用 coredns.service 单元。
doh-proxy
独立 DNS 服务器配置
BIND
BIND 9.18 原生支持提供 DNS over HTTPS 和 DNS over TLS 服务。详见 BIND#Configuration。
作为解析器,配合 TLS 代理
典型场景:如果您使用 ISC bind 作为当前的 DNS 提供商,并且需要同时为旧版客户端提供转发服务以及为现代客户端提供 DoH,您可能希望配置 named 将所有非本地查询转发到您的存根解析器,并注释掉任何转发到存根解析器的转发行(如果您希望回退到根服务器,请省略 forward 选项)。
/etc/named.conf
options {
...
//forwarders { 8.8.8.8; 8.8.4.4; };
forwarders { 127.0.0.1 port 54; };
forward only;
...
};
...
如果您想转发到外部 TLS 代理(通过 stunnel),操作相同,但仅使用 TCP/54(见下文 stunnel 配置)。
/etc/named.conf
options {
...
//forwarders { 8.8.8.8; 8.8.4.4; };
forwarders { 127.0.0.1 port 54; };
forward only;
...
};
...
server 127.0.0.1 {
tcp-only yes;
};
...
可选:如果您使用 ISC bind 作为当前的 DNS 提供商,并且需要同时提供旧版客户端转发和现代客户端 DoH,您可能希望配置 named 监听一个备用端口(例如 TCP|UDP/54),而不是默认的 53,以便您的存根解析器可以监听标准端口。注释掉所有现有的 'listen' 行并添加以下内容(如不需要则省略 v6 行)。
/etc/named.conf
...
//listen-on { any; };
listen-on port 54 { any; };
listen-on-v6 port 54 { any; };
...
Unbound
您可以通过在配置文件中添加 853 端口监听并指定证书和密钥路径,轻松设置 DoT 服务器。
/etc/unbound/unbound.conf
server: ... interface: 127.0.0.1@853 tls-service-pem: /etc/unbound/public.pem tls-service-key: /etc/unbound/private.pem ...
DoH 服务器的设置与 DoT 相同,但需要的端口是 443。
/etc/unbound/unbound.conf
server: ... interface: 127.0.0.1@443 tls-service-pem: /etc/unbound/public.pem tls-service-key: /etc/unbound/private.pem ...
Web 服务器配置
Apache httpd 代理配置
在您的主 httpd.conf 或适当的监听 443 端口的 vhost 中配置代理。
/etc/httpd/conf/vhosts/yourhost.conf
...
ProxyPass /dns-query http://[127.0.0.1]:8080/dns-query
ProxyPassReverse /dns-query http://[127.0.0.1]:8080/dns-query
...
nginx 代理配置
DoT 代理
使用 Nginx stream 模块,您可以设置到上游 DNS 的代理。请注意,您可以使用本地 DNS 也可以使用第三方 DNS。
/etc/nginx/nginx.conf
...
stream {
upstream dns {
zone dns 64k;
server 8.8.8.8:53;
}
server {
listen 853 ssl;
ssl_certificate /etc/nginx/ssl/certs/public.pem;
ssl_certificate_key /etc/nginx/ssl/private/private.pem;
proxy_pass dns;
}
}
...
DoH 代理
对于 DoH 的实现,您需要使用额外的 NJS 脚本。您需要从该 GitHub 页面获取脚本,将其放入 /etc/nginx/njs.d/,并确保安装了 nginx-mod-njs 软件包。
首先,您需要设置 stream 服务,它将从 nginx 的 HTTP/2 服务接收 DNS 请求,通过 js_filter 处理以寻找 DNS 数据包,并将其传递给上游 DNS 服务器。
/etc/nginx/nginx.conf
...
stream {
upstream dns {
zone dns 64k;
server 1.1.1.1:53;
server {
listen 127.0.0.1:8053;
js_filter doh_filter_request;
proxy_ssl on;
proxy_pass dns;
}
}
...
然后,设置 HTTP/2 服务在 URI /dns-query 处监听 DNS 请求并将其转发到 stream 服务。注意需要将证书更改为有效的证书。
/etc/nginx/nginx.conf
...
upstream dohloop {
zone dohloop 64k;
server 127.0.0.1:8053;
}
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/certs/public.pem;
ssl_certificate_key /etc/nginx/ssl/private/private.pem;
location /dns-query {
proxy_http_version 1.0;
proxy_pass http://dohloop;
}
}
...
您可以同时使用 DoT 和 DoH 服务,并支持缓存和多个上游 DNS。更多示例请参阅这些配置文件。
通过 stunnel 配置 DNS over TLS
配置 stunnel 监听 TCP/853 以接收 TLS 连接,并将其转发到您的本地 DNS 提供商。
/etc/stunnel/conf.d/DoT.conf
[dns] accept = 853 connect = 127.0.0.1:53 cert = /etc/ssl/private/fullchain.pem key = /etc/ssl/private/privkey.pem
配置 stunnel 监听 TCP/54 并转发到上游安全提供商。
/etc/stunnel/conf.d/DoT-Remote.conf
[dnsovertls] client = yes accept = 54 connect = 10.10.10.1:853 verifyChain = yes CAPath = /etc/ssl/certs checkHost = <your_host_name>