使用Nginx与Adguard Home共存,搭建doh服务器

Nginx监听443端口,并转发到Adguard Home端口

公益DNS总是会遇到各种各样的问题,终止服务或者天天被打。想要建一个自己的私用。但是有问题:

  • 小鸡只有一台,但是443端口已经给nginx了,也没必要为了443端口和一个负载不高的个人服务再买一台vps,怎么办

搜索了半天,踩了一两个坑

Adguard Home搭建

简单的事情,官方一键脚本

1
curl -sSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh

80端口也是nginx在监听,网页就保持在3000端口,然后用nginx反代。基本操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
server {
    server_name    〈域名〉;

    listen         80;
    listen         [::]:80;

    location / {
      return         301 https://$server_name$request_uri;
    }
}

server {
    server_name 〈域名〉;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_certificate            证书位置
    ssl_certificate_key        密钥位置

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_prefer_server_ciphers off;
    # In case of an old server with an OpenSSL version of 1.0.2 or below,
    # leave only prime256v1 or comment out the following line.
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;


    # the nginx default is 1m, not enough for large media uploads
    client_max_body_size 16m;
    ignore_invalid_headers off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://127.0.0.1:3000;
    }

}

之后防火墙把3000端口关掉,反正用不着

先把doh跑起来

决定好doh用的域名,申请证书

1
certbot certonly --standalone --agree-tos -d  〈doh域名〉

域名随意,也可以是刚才网页面版的域名。如果已经有证书了直接用也可以,但cloudflare的源证书不行 (废话

之后nginx的套娃行为,没有有效证书有点麻烦,所以哪怕准备托管到cloudflare也要申请一个证书

设置Adguard Home

操作没什么好说的

随意指定一个非标端口作为Adguard Home的DoH监听端口

反正不需要公网访问,也可以防火墙上关掉它

理论上来说Nginx模块完整的话QUIC和TLS也能设置?但是懒得弄,暴露vps的地址,又容易被干扰

  • Adguard Home设置里的证书需要填写刚才申请的证书。

添加nginx配置

  • 这里的doh域名证书可以填写刚才申请的证书。
  • 需要托管到cloudflare的话也可以填写cloudflare提供的源证书。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
    listen 80;
    listen 443 ssl http2;
    server_name 〈doh域名〉;
    
    ssl_certificate          doh域名证书位置
    ssl_certificate_key      doh域名密钥位置

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_prefer_server_ciphers off;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
 
    location /dns { # PATH可以自定义
        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://〈doh域名〉/dns-query; 
    }
    
}

*理论上来说这样就可以跑在443端口了,但还是连不通。 最后发现似乎是vps本身的dns解析没有更新,或者套了cloudflare,或者刚才关闭了防火墙端口,总之无法直接连接本机的非标端口doh。

解决方法非常简单,解析不到,加进host不就可以了吗(

直接解析到127.0.0.1,结束

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计