分享一下自己在使用AdGuardHome搭建的DOH服务
今天看到大量的人讨论DNS污染,以及海外一些DOH服务被阻塞的帖子,因此分享一下我在使用AdGuardHome搭建的DOH服务的配置。
下面分享使用nginx和AdGuardHome搭建的DOH服务。 实现的效果:多个服务共享443端口,不必担心端口占用。提供DOH服务进行DNS解析,同时可以提供DOT、DOQ服务进行DNS解析,以及AdGuardHome的广告过滤功能。
个人用了两个月,非常稳定。
一些个人观点
DOH、DOT、DOQ均属于加密DNS,可以在一定程度上防止DNS污染。
个人推荐使用DOH。
理由:DOT、DOQ默认使用853端口,具备一定的特征,如果使用其他端口则需要客户端支持指定端口。DOH默认使用443端口,与普通的HTTPS流量混在一起,比较难识别。
以上为个人观点,如有不同观点,欢迎各位大佬在评论区进行讨论。
nginx、AdGuardHome安装和卸载(基于命令行Debian 12,其他系统参考官方文档)
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
nginx卸载
apt remove -y nginx
apt purge -y nginx
apt autoremove -y
# 删除相关文件(如果需要)
rm -rf /etc/nginx
rm -rf /var/log/nginx
...
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
AdGuardHome卸载
# 手动安装
./{自定义目录}/AdGuardHome/AdGuardHome -s uninstall
# 删除相关文件(如果需要)
rm -rf /{自定义目录}/AdGuardHome
nginx、AdGuardHome欠缺使用systemctl管理服务的启动、停止、重启等操作,基础不够,自行搜索解决。
nginx配置
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;
}
}
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