前言

前段时间,发现合肥联通的 DNS 解析被污染,在访问简书的时候,网页打不开,于是使用合肥联通的 DNS 测试解析 www.jianshu.com 域名,发现被解析成 127.0.0.1 了,换成阿里公共 DNS 或腾讯公共 DNS 去解析,则返回了正常的 IP 地址。

image-20221011163037132

于是,干脆使用 Adguard Home 自建了个 DoH,解决 DNS 污染问题也拦截拦截广告,从此后面告别这些运营商的 DNS 了。

概述

DoT 全称是 DNS over TLS,它使用 TLS 协议来传输 DNS 协议。TLS 协议是目前互联网最常用的安全加密协议之一,我们访问 HTTPS 的安全基础就是基于 TLS 协议的。相比于之前使用无连接无加密的 UDP 模式, TLS 本身已经实现了保密性与完整性。

DoH 全称是 DNS over HTTPS,它使用 HTTPS 来传输 DNS 协议。DoH 的安全原理与 DoT 一样,他们之间的区别只在于:DoH 有了 HTTPS 格式封装,更加通用。

DoT 在专用端口上通过 TLS 连接 DNS 服务器,而 DoH 是基于使用 HTTPS 应用层协议,将查询发送到 HTTPS 端口上的特定 HTTP 端点,这里造成的外界感知就是端口号的不同,DoT 的端口号是 853,DoH 端口号 443

由于 443 端口个人需使用其它 Web 服务,如博客,于是端口被占用了,为满足使用默认端口解析服务,遂使用 Nginx 对其进行简单处理,下面是自己的解决方法。

Nginx反代

此处不讨论 Adguard Home 的安装,且默认用户有简单的 Nginx 配置能力和 Adguard Home 的使用能力。

在配置前,先确认 Adguard Home 提供解析的地址,可前往 Adguard Home 的“设置指导”处查看,如下图:

image-20221011141313745

上图可见在 8443 端口运行了 DoH 服务(在使用加密选项后,AdGuard Home 的网页管理界面将通过 HTTPS 连接访问,同时 DNS 服务器将监听通过 DNS-over-HTTPS 与 DNS-over-TLS 发送的请求)。

那么此时我们打开 Adguard Home 面板的链接则默认通过 8443 端口对其访问,顺便在该端口的 /dns-query 处提供 DoH 服务,标准的 DoH 服务是 443 端口的,接下来,让我们使用 Nginx 对其进行反代以解决端口问题,顺便也解决一下 Adguard Home 面板的隐藏,使其更加隐蔽的提供服务。

配置的相关说明皆在下方的配置文件中说明,Nginx 配置如下:

server {
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    server_name dns.example.com;  # 修改为你的域名

    # http重定向跳转到https
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    
    #SSL配置
    ssl_certificate /*****/fullchain.pem;    # SSL 证书文件
    ssl_certificate_key /*****/privkey.pem;    # SSL 证书私钥
    
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384::!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    #resolver 223.5.5.5 119.29.29.29 8.8.8.8 1.1.1.1 valid=60s;
    #resolver_timeout 2s;
    #add_header Strict-Transport-Security "max-age=31536000" always;  # HSTS 配置,按需启用

    error_page 497  https://$host$request_uri;
    
    #该路由为 Adguard Home 面板页面,默认情况下页面直接使用主路由访问,故需隐藏一下
    #修改下方的location访问字段以及proxy_redirect、proxy_cookie_path后的字段
    #即可使用自定义的 uri 字段访问 Adguard Home 面板页面
    #后续访问面板即:https://dns.example.com/adguard/
    location /adguard/ {
        proxy_pass https://127.0.0.1:8443/; # 自定义修改
        proxy_redirect / /adguard/;    # 同步修改uri
        proxy_cookie_path / /adguard/;    # 同步修改uri
        proxy_set_header Host $host;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        #下方的这些按需配置,可默认应用或注释、删除
        client_max_body_size 1m; 
        client_body_buffer_size 256k;
        client_body_timeout 60s;
        send_timeout 60s;
        proxy_connect_timeout 60s; 
        proxy_read_timeout 60s; 
        proxy_send_timeout 60s;
        proxy_buffer_size 32k; 
        proxy_buffers 4 16k; 
        proxy_busy_buffers_size 32k;
        proxy_temp_file_write_size 32k; 
        proxy_ignore_client_abort on; 
    }
    
    #该路由代理 DoH 服务,设置一下proxy_pass项
    location /dns-query {
        proxy_pass https://127.0.0.1:8443/dns-query;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    #上述已使用自定义路由修改 Adguard Home 面板默认路由,此时默认路由页面
    #为空,可能呈现404或Nginx默认页面,可对默认路由页进行修改一下,使其重定
    #向跳转到相关页面,如自己的博客(如下配置),或跳转到其它自定义页面,也可
    #以放个文件引用,使得访问非空,无该需求可将下方该location项注释或删除
    location / {
        return 301 https://www.isisy.com;
    }

    # robots.txt,禁止蜘蛛访问
    location = /robots.txt {
        default_type text/html;
        add_header Content-Type "text/plain; charset=UTF-8";
        return 200 "User-Agent: *\nDisallow: /";
    }

    # . files,禁止扫描探测隐藏文件
    location ~ /\.(?!well-known) {
        deny all;
    }
    
    #日志记录,有需求则配置存储路径,默认将日志打到黑洞,或关闭
    #access_log /dev/null;
    #error_log /dev/null;
}

配置完上述后,重载 Nginx 配置,确认 443 端口可正常提供解析服务以及在域名的 /adguard/ 上可正常访问 Adguard Home 面板后,可前往安全组将 Adguard Home 原先的 DoH 端口(上述的配置为 8443 端口)关闭。

至于 DoT,在 Android 等设备上,可能会使用到私人 DNS 以使用 DoT ,上述配置不会影响 DoT 的使用。若需使用 DoT 服务,Adguard Home 中配置 DoT 服务在 853 端口监听运行以及安全组放通 853 端口即可。

End

本文标题:Nginx反代Adguard Home的最佳解决方案

本文链接:https://www.isisy.com/1387.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2022 年 11 月 16 日
如果觉得我的文章对你有用,请随意赞赏