宝塔面板NGINX反向代理adguard home实现DOH
本文最后更新于 296 天前,其中的信息可能已经有所发展或是发生改变。

之前再服务器上面使用了adguardhome跑了个自己的dns服务器。带有去广告的功能,顺便作为我自己的一个域名的子域名的权威域名服务器(虽然说蛮慢,导致访问我那个子域名非常慢,访问卡在解析网址在,只是玩一下,学习一下域名解析的过程,好像是网速的原因导致其慢。),但是总感觉一直使用默认的53端口不太好(一直无事发生),总感觉有一些域名的查询请求有那么一点点问题,总感觉不对劲,但是又说不出来的感觉。正好前一些日子看到adguardhome中具有dns over https的功能,于是,能将查询加密,何乐而不为?万一有坏人尝试搞事情怎么办?但是本机的443端口已经被宝塔面板的NGINX给占用了。又没有多的公网ip,所以说,还是使出反向代理这一招吧。

(真的感谢反向代理这个发明,反向代理不仅帮助我作了很多死,而且还对之前绕开我高中学校的学习平板网络管控提供了莫大的帮助,让我成功得以利用平板管控不封锁内网请求的bug,在管控中访问百度,必应等。。。。好像跑题了。。。)

adguardhome截图
adguardhome截图

什么是adguard home?

adguard home是adguard系列的又一个产品。其通过过滤dns请求,并且改写在其过滤器中的dns请求,让部分(很多)广告无法加载出来,其实他就是一个dns服务器。虽然有一些广告他去不掉,但是他的拦截范围可以扩大到如智能电视等一系列以前不可能去掉广告的地方

怎么反向代理?

首先得会一些基本的操作,

1:先在宝塔面板创建好一个网站,网站域名得绑定好。能够访问(必须)

2:申请一个ssl证书,这个证书可以用宝塔面板的证书申请工具申请一个letsencrypt的证书,申请完之后,你将会看到以下的内容(假如你有其他的证书,当我没说过,照着操作即可)

3:前往adguardhome界面(默认登录端口为3000)

4:前往 设置》加密设置,打开之后https端口选择一个没有被占用的且你觉得ok的端口,输入进去,我选择的是444端口。输入好服务器名称,并按照下图将宝塔面板里头申请到的ssl证书输入进去。

出现如下的提示其实可以不用理会,因为我们从宝塔面板申请的letsencrypt没有包含ip地址,这个没什么影响。。无视之即可。

配置完成之后,点击保存。adguardhome这边就配置完成了,接下来就要到宝塔面板那边去配置反向代理了

5:宝塔面板配置反向代理代理adguardhome

注意:我们将要更改网站的配置文件,建议更改之前先备份一遍,不仅因为怕出现问题好恢复,而且按照我这个方法修改了配置文件之后,自动续签ssl证书功能会失效(手动在宝塔面板续签letsencrypt证书也会失效,当然你有别的证书,别的申请方法,可以当我没说,但是最好还是备份一下),将配置文件保存好,到时候要续签证书的时候将旧的配置文件导入回去,免得因为配置反向代理导致续签验证失败。

接下来,前往 宝塔面板》网站》选择你要配置的站点》右侧设置》左侧配置文件,如下图

将配置文件复制下来保存一下以防万一,然后将该配置文件替换为如下的配置

注意,将配置文件中的 example.com改为你设置的域名

server

{

listen 80;

listen 443 ssl http2;

server_name example.com;

index index.php index.html index.htm default.php default.htm default.html;

root /www/wwwroot/example.com;

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则

#error_page 404/404.html;

#HTTP_TO_HTTPS_START

if ($server_port !~ 443){

rewrite ^(/.*)$ https://$host$1 permanent;

}

#HTTP_TO_HTTPS_END

ssl_certificate /www/server/panel/vhost/cert/example.com/fullchain.pem;

ssl_certificate_key /www/server/panel/vhost/cert/example.com/privkey.pem;

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

ssl_prefer_server_ciphers on;

ssl_early_data on;

ssl_ecdh_curve X25519:P-256:P-384;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

error_page 500 https://$host$request_uri;

location / {

proxy_redirect off;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

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_pass http://127.0.0.1:3000; # 此处为程序运行时指定的端口,即adgh中的访问端口

}

location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {

proxy_pass http://127.0.0.1:3000; # 此处为程序运行时指定的端口,即adgh中的访问端口

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

location /dns-query {

proxy_http_version 1.1;

proxy_set_header Host $http_host;

proxy_buffering off;

proxy_redirect off;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass https://example.com:444/dns-query; # 地址为adhg中监听的DOH服务地址

}

}

当然,你会发现假如使用了上述配置文件,该网站的站点日志就不工作了,所以,可以使用如下的配置文件(其实就加了两行而已),来开启日志功能。(假如dns请求较多可能导致这日志有那么一点点大。。。。看个人的情况吧。)

server

{

listen 80;

listen 443 ssl http2;

server_name example.com;

index index.php index.html index.htm default.php default.htm default.html;

root /www/wwwroot/example.com;

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则

#error_page 404/404.html;

#HTTP_TO_HTTPS_START

if ($server_port !~ 443){

rewrite ^(/.*)$ https://$host$1 permanent;

}

#HTTP_TO_HTTPS_END

ssl_certificate /www/server/panel/vhost/cert/example.com/fullchain.pem;

ssl_certificate_key /www/server/panel/vhost/cert/example.com/privkey.pem;

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

ssl_prefer_server_ciphers on;

ssl_early_data on;

ssl_ecdh_curve X25519:P-256:P-384;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

error_page 500 https://$host$request_uri;

location / {

proxy_redirect off;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

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_pass http://127.0.0.1:3000; # 此处为程序运行时指定的端口,即adgh中的访问端口

}

location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {

proxy_pass http://127.0.0.1:3000; # 此处为程序运行时指定的端口,即adgh中的访问端口

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

location /dns-query {

proxy_http_version 1.1;

proxy_set_header Host $http_host;

proxy_buffering off;

proxy_redirect off;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass https://example.com:444/dns-query; # 地址为adhg中监听的DOH服务地址

}
    access_log  /www/wwwlogs/example.com.log;
    error_log  /www/wwwlogs/example.com.error.log;
}

大功告成!

保存,测试一下你的网址看看是否能放问到adguardhome的控制面板

接下来,你可以测试一下,比如说在浏览器地址栏输入以下的请求

https://你的域名/dns-query?dns=AAABAAABAAAAAAAABHRlc3QAAAEAAQ

看看是不是有如下的反应,如果有,ok搞定。

话说回来,dns查询记录不要记载太多,不然会很卡。。。

附上效果图一张

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,记得载明出处,(期待)。 内容有问题?请点此跟我反馈
上一篇
下一篇