DevsDawn
DevsDawn

Nginx搭建DNS over HTTPS(DoH)代理

近期遇到业务需求,需要在多台内网机器上部署应用,内网机器上连接互联网有严格限制,只能连接特定几个IP段以及指定的几个业务域名。

这些应用使用了DNS over HTTPS(DoH)进行业务域名的解析,需要配置一个DoH的地址,但内网机器显然是无法访问互联网上提供的DoH服务的。在该内部网络中设置了DMZ区,访问外部网络没有限制,于是决定在DMZ主机上使用Nginx部署一个DoH代理服务给内网机器使用。

由于服务器环境在国外,此处选择Cloudflare提供的1.1.1.1公共解析服务。为了保证响应结果不被篡改,提高安全性,此处向上游发起的DNS请求也使用DoH进行发送,并且对响应设置10分钟的缓存时间(详见下方proxy_cache_path、proxy_cache_valid配置),重写了log增加上游响应时间记录。

Nginx的具体配置如下,本地SSL证书配置部分由于不属于本文讨论重点故没有添加进来,可参考网上的文档进行配置:

proxy_cache_path /var/cache/nginx/doh_cache levels=1:2 keys_zone=doh_cache:10m;

log_format upstream_time '$remote_addr - $remote_user [$time_local] '
 '"$request" $status $body_bytes_sent '
 '"$http_referer" "$http_user_agent"'
 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';

server
{
    listen 80;
    listen 443 ssl http2;

    location / {
      return 444;
    }

    # location /cdn-cgi/trace {
    #   proxy_ssl_name 'one.one.one.one';
    #   proxy_ssl_server_name on;
    #   proxy_ssl_session_reuse off;

    #   proxy_pass https://1.1.1.1;
    #   proxy_set_header Host 'one.one.one.one';
    # }

    proxy_cache_methods GET POST;

    location /dns-query {
      proxy_cache doh_cache;
      proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body;
      proxy_cache_valid 200 10m;
      add_header X-Cache-Status $upstream_cache_status;

      proxy_ssl_name 'one.one.one.one';
      proxy_ssl_server_name on;
      proxy_ssl_session_reuse off;

      proxy_pass https://1.1.1.1;
      proxy_set_header Host 'one.one.one.one';
    }

    // ...
}
若无特别说明,本文采用 CC BY-SA 4.0 协议进行许可。如需转载,请附上本文链接和本声明。
本文链接:https://devsdawn.com/2021/11/nginx-set-up-dns-over-https-doh-proxy/
DigitalOcean云服务,美国上市公司,注册即送200USD体验金
Vultr云服务,全球25+地域,注册即送100USD体验金

发表回复

textsms
account_circle
email

DevsDawn

Nginx搭建DNS over HTTPS(DoH)代理
近期遇到业务需求,需要在多台内网机器上部署应用,内网机器上连接互联网有严格限制,只能连接特定几个IP段以及指定的几个业务域名。 这些应用使用了DNS over HTTPS(DoH)进行业务域名的…
扫描二维码继续阅读
2021-11-28