菜单

Administrator
发布于 2025-05-10 / 12 阅读
0
0

使用Nginx+AdGuard家庭搭建的DOH服务

分享一下自己在使用AdGuardHome搭建的DOH服务

今天看到大量的人讨论DNS污染,以及海外一些DOH服务被阻塞的帖子,因此分享一下我在使用AdGuardHome搭建的DOH服务的配置。

下面分享使用nginx和AdGuardHome搭建的DOH服务。 实现的效果:多个服务共享443端口,不必担心端口占用。提供DOH服务进行DNS解析,同时可以提供DOT、DOQ服务进行DNS解析,以及AdGuardHome的广告过滤功能。

个人用了两个月,非常稳定。

一些个人观点

DOH、DOT、DOQ均属于加密DNS,可以在一定程度上防止DNS污染。

https://opaoai.com/

个人推荐使用DOH。

理由:DOT、DOQ默认使用853端口,具备一定的特征,如果使用其他端口则需要客户端支持指定端口。DOH默认使用443端口,与普通的HTTPS流量混在一起,比较难识别。

以上为个人观点,如有不同观点,欢迎各位大佬在评论区进行讨论。

nginx、AdGuardHome安装和卸载(基于命令行Debian 12,其他系统参考官方文档)

  1. nginx安装

# 安装相关依赖工具
apt install -y curl gnupg2 ca-certificates lsb-release
# 添加Nginx官方签名密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
# 设置官方仓库源(后续可以使用apt命令升级nginx)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian $(lsb_release -cs) nginx" | tee /etc/apt/sources.list.d/nginx.list
# 更新依赖并安装nginx
apt update
apt install -y nginx
  1. nginx卸载

apt remove -y nginx
apt purge -y nginx
apt autoremove -y

# 删除相关文件(如果需要)
rm -rf /etc/nginx
rm -rf /var/log/nginx
...
  1. AdGuardHome安装

https://github.com/AdguardTeam/AdGuardHome
# 使用官方安装脚本(安装目录在/opt/AdGuardHome)
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

# 手动安装(以在/{自定义目录}/AdGuardHome为安装目录为例)
cd /{自定义目录}
# 到官方仓库选择自己喜欢的版本
wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.107.57/AdGuardHome_linux_amd64.tar.gz
# 解压压缩包
tar xvf AdGuardHome_linux_amd64.tar.gz
cd /{自定义目录}/AdGuardHome
./AdGuardHome -s install
  1. AdGuardHome卸载

# 手动安装
./{自定义目录}/AdGuardHome/AdGuardHome -s uninstall
# 删除相关文件(如果需要)
rm -rf /{自定义目录}/AdGuardHome

nginx、AdGuardHome欠缺使用systemctl管理服务的启动、停止、重启等操作,基础不够,自行搜索解决。

nginx配置

  1. nginx Stream模块的SNI分流配置文件路径:/etc/nginx/modules-enabled/stream.conf

请确保/etc/nginx/nginx.conf中的配置引用了/etc/nginx/modules-enabled/目录下的配置,

include /etc/nginx/modules-enabled/*.conf;

确认安装的nginx加载了stream模块,默认Debian仓库的nginx不包含stream模块,建议使用教程中的安装方法安装模块较为完整的nginx。

nginx -V

在输出的信息中,表示找到--with-stream参数。如果存在该参数,则启用了stream模块。

流模块的SNI分流是通过证书的域名进行分流,所以需要提前准备好证书,如果开启HTTP/2多路复用则不建议使用泛域名证书!!!

stream {
    map $ssl_preread_server_name $sni_backend {
        {域名}       doh;
        www.tesla.com           proxy_reality2direct;
        apps.apple.com          proxy_reality2route;
        default web;
    }

    upstream web {
        server unix:/dev/shm/web.sock;
    }
    
    upstream doh {
        server unix:/dev/shm/doh.sock;
    }

    upstream proxy_reality2direct {
        server unix:/dev/shm/proxy_reality2direct.sock;
    }

    upstream reality2direct {
        server 127.0.0.1:3729;
    }

    upstream proxy_reality2route {
        server unix:/dev/shm/proxy_reality2route.sock;
    }

    upstream reality2route {
        server 127.0.0.1:3726;
    }

    server {
        listen 443 reuseport;
        listen [::]:443 reuseport;
        proxy_pass  $sni_backend;
        # 启用代理协议
        proxy_protocol on;
        # 启用SSL预读模块
        ssl_preread on;
        # 拒绝不匹配的SNI
        # ssl_reject_handshake on;
        tcp_nodelay on;
    }
    server {
        listen unix:/dev/shm/proxy_reality2direct.sock proxy_protocol;
                
        set_real_ip_from unix:;
        # 代理到Reality后端
        proxy_pass reality2direct;
    }

    server {
        listen unix:/dev/shm/proxy_reality2route.sock proxy_protocol;
                
        set_real_ip_from unix:;
        # 代理到Reality后端
        proxy_pass reality2route;
    }
}
  1. DOH反代配置文件路径:/etc/nginx/sites-enabled/ad_guard_home.conf

server {
    listen unix:/dev/shm/doh.sock ssl proxy_protocol;
    http2 on;
    
    server_name {域名};

    # 如果需要启用SSL证书,可以启用以下配置
    ssl_certificate /etc/nginx/ssl/域名证书.cer;
    ssl_certificate_key /etc/nginx/ssl/证书密钥.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    # 静态文件目录,伪装成一个普通的网站
    root /usr/share/nginx/html;
    set_real_ip_from unix:;
    real_ip_header proxy_protocol;
    charset 'utf-8';

    location /dashboard {
        # AdGuardHome的配置页面
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 修正AdGuardHome的重定向路径
        proxy_redirect / /dashboard/;

        # 避免AdGuardHome的重复路径前缀
        rewrite ^/dashboard(/.*)?$ $1 break;
    }

    location {path}/{自定义path} {
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 端口
        # 这里的Path必须为dns-query
        proxy_pass https://127.0.0.1:1787/dns-query; 
    }

    location {path}/common {
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 端口
        # 这里的Path必须为dns-query
        proxy_pass https://127.0.0.1:1787/dns-query; 
    } 

    location / {
        index  index.html;
    }

    location ~ /\.ht {
        deny  all;
    }
}
# 测试配置是否正常
nginx -t
# 重新加载nginx配置
nginx -s reload


评论