自建 DoH 服务器记录

本来没有必要折腾这个的。

起因

$ curl https://dns.nextdns.io
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to dns.nextdns.io:443

概述

本文介绍的方案使用 Nginx + m13253/DNS-over-HTTPS, 流程大致如下:Nginx 用于 SSL Termination,即处理 HTTPS 流量,并将解密后的 HTTP 流量转发给后面的 DNS-Over-HTTPS,之后再由 DNS-Over-HTTPS 处理具体的 DNS 请求。

配置

Nginx

server {
  # 其它部分已省略

  # 为了避免扫描,建议将此处的 /dns-query 改为其它路径
  location /dns-query {
    proxy_pass http://127.0.0.1:8053;
    proxy_set_header Host $host;
  }
}

最好将以上配置加入现有的虚拟主机中,这样能减少被墙的风险。

DNS-over-HTTPS

这里使用 Docker 部署:

docker-compose.yml

version: '3'
services:
  doh-server:
    image: satishweb/doh-server
    restart: always
    network_mode: "host"
    environment:
      DEBUG: "0"
      # Host 另有程序监听 53 端口,处理 DNS 请求
      UPSTREAM_DNS_SERVER: "udp:127.0.0.1:53"
      DOH_HTTP_PREFIX: "/"
      DOH_SERVER_LISTEN: "127.0.0.1:8053"
      DOH_SERVER_TIMEOUT: "10"
      DOH_SERVER_TRIES: "3"

其它方案

Using NGINX as a DoT or DoH Gateway - NGINX:利用 NGINX JavaScript module 在 Nginx 内部处理 DNS 请求。

参考