跳转至内容

DNS over HTTPS 服务器

来自 ArchWiki

本文章或章节需要扩充。

原因:虽然本文最初侧重于 python-doh-proxy(因缺乏维护已被移除),但对于使用 bind 作为 DNS 服务器并使用 stunnel 实现 DoT 的 DoH 代理,无论选择哪种软件,通用设置都是相同的。现已添加相关存根,希望其他软件包维护者能为他们偏好的软件做出贡献。此外,本文的流程略显混乱,我将在初始提交之后进行清理,以更详细地描述各种配置。(在 Talk:DNS over HTTPS servers 中讨论)

DNS 自诞生以来,在 UDP/53 及其后来的 TCP/53 上一直是以明文传输的,这使其容易受到嗅探攻击。有关可用于解决此漏洞的可用协议的更多信息,请参阅 域名解析#隐私与安全。本文涵盖了 DNS 服务器的三种可用协议中的两种,以及提供 DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 所需的代理配置。AUR 中有多个 DoH 工具可用,包括 corednsAUR, dns-over-httpsdoh-proxyAUR。具体选择哪种方案取决于您网络的实际需求。

corednsAUR 既提供缓存的非权威 DNS 服务器,也提供 DoH 服务(需引用来源)。

dns-over-https, doh-proxyAUR 均提供 HTTP 监听器,用于在您现有的 HTTPS 服务器之后进行代理,并提供存根解析器将 UDP/53 上的常规查询转发到安全的 DNS 服务器。此外,doh-proxyAUR 还提供一个独立运行的 HTTPS/2 服务器。

DoH 服务器/代理软件配置

coreDNS

本文或本章节建议合并至 CoreDNS#Configuration

注:CoreDNS 有专门的独立文章。(在 Talk:DNS over HTTPS servers 中讨论)

安装 corednsAUR 软件包。

您可以将 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

本文章或章节需要扩充。

原因:请使用模板的第一个参数提供简短的解释。(在 Talk:DNS over HTTPS servers 中讨论)

独立 DNS 服务器配置

BIND

本文或本章节建议合并至 BIND#Configuration

注:BIND 有专门的独立文章。(在 Talk:DNS over HTTPS servers 中讨论)

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

本文或本章节已过时。

原因:BIND 支持使用 DNS over TLS 进行转发。(在 Talk:DNS over HTTPS servers#stunnel 中讨论)

如果您想转发到外部 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

本文或本章节建议合并至 Unbound#Configuration

注:Unbound 有专门的独立文章。(在 Talk:DNS over HTTPS servers 中讨论)

您可以通过在配置文件中添加 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#DNS over TLS

注:部分信息已在 stunnel 主页中提供。DNS over TLS 超出了该页面的讨论范围。(在 Talk:DNS over HTTPS servers 中讨论)

配置 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>

DNS over HTTPS 服务器 Docker 镜像

请参阅 https://hub.docker.com/r/satishweb/doh-server

© . 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.