概述

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。

安装

官方文档:AdGuard Home - Getting Started

最新稳定版下载:latest stable release page

这里选择的是:AdGuardHome_linux_amd64.tar.gz ,安装环境是 Debian 11

解压下载的文件

1
tar -zxvf AdGuardHome_linux_amd64.tar.gz

进入安装目录

1
cd AdGuardHome/

安装

1
./AdGuardHome -s install

安装完成以后也可以查看服务的状态

1
systemctl status AdGuardHome.service

首次配置需要开放系统的 3000 端口,然后就可以通过 ip:3000 来访问网页管理页面了

配置 Adguard Home

需要自行配置的地方不多,可以参考之前的文章:OpenWrt 上配置使用 AdGuard Home

启用 https

在加密设置配置证书,启用 https 访问,同时如果打算使用 DoH , DNS-over-TLS 端口DNS-over-QUIC 端口留空即可,(443 访问端口可以自行修改,下面配置了 nginx 反向代理,我将 443 端口改为了 4433)

配置客户端

配置客户端的目的:

  • 可以对某个客户端(比如我的手机)进行详细的设置,阻止特定服务,特定设置等等
  • 方便在查询日志时清晰的看到时哪个客户端访问了哪些服务,方便过滤广告
  • 最后也可以设置只有配置了客户端的设备才可以使用解析服务

选择添加客户端,客户端名字随意,方便自己区分就行,标签也是一种区分方式,标识符随便输入,待会会用到配置文件

访问设置

在 DNS 设置页面最下方,有一个访问设置,在允许的客户端内输入之前配置的客户端标识符,这样 AdGuard Home 将仅接受来自这些客户端的请求

DNS 服务配置

因为是自己访问,同时是部署到服务器的,所以需要修改 DNS 服务配置

设置->DNS设置

edns 主要可以实现 client 在查询请求的时候,可以在 dns 协议中写入自己的请求地址,这样进行 dns 查询的时候,可以把这个地址传给权威 dns,dns 根据来源地址可以进行更加准确的调度。

DNSSEC 通过使用公钥加密来为授权区域数据进行数字签名,发挥作用让互联网社区免受伪造域名系统 (DNS) 数据的危害。DNSSEC 验证有助于向用户确保数据来自规定的来源,并且在传输过程中未遭修改。

分流(可选)

上面提到了 EDNS,因为很多网站使用了 CDN,EDNS 就可以根据你的运营商线路和地址返回最适合你的 ip,需要 DNS 支持 EDNS,腾讯和阿里是支持的,当然我主要是为了过滤广告,所以上游 DNS 服务器都是国内的,存在 DNS 污染问题,如果有其它需求可以考虑分流的方案

项目地址:GFWList2AGH

我选择的方案是:whitelist_full.txt

修改 AdGuardHome.yaml文件,找到:upstream_dns_file 配置项,填入配置文件的绝对路径 即可

然后重启服务

1
systemctl restart AdGuardHome.service

如果需要定时更新可以配合 cron 实现

我想自定义DNS解析服务器,创建了如下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 下载whitelist_full.txt文件
wget -O /root/AdGuardHome/whitelist_full.txt https://raw.githubusercontent.com/hezhijie0327/GFWList2AGH/main/gfwlist2adguardhome/whitelist_full.txt

# 替换默认DNS解析服务
sed -i 's|https://dns.opendns.com:443/dns-query|https://1.1.1.1/dns-query|g' /root/AdGuardHome/whitelist_full.txt

# 替换国内白名单DNS解析服务
sed -i 's|https://doh.pub:443/dns-query|https://223.5.5.5/dns-query|g' /root/AdGuardHome/whitelist_full.txt

# 重启服务
systemctl restart AdGuardHome

配置 Nginx

用来修改 DoH 默认的 /dns-query 查询路径

1
sudo apt install nginx

修改配置文件

1
2
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
vim /etc/nginx/nginx.conf

完整的配置文件如下,需要修改 5 处

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
}

http {

sendfile on;
tcp_nopush on;
types_hash_max_size 2048;


include /etc/nginx/mime.types;
default_type application/octet-stream;

# Redirect HTTP to HTTPS
server {
listen 80;
# 1、配置自己的域名
server_name 365day.top;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
# 2、配置自己的域名
server_name 365day.top;

# 3、配置SSL证书位置
# 配置证书文件
ssl_certificate /etc/nginx/ssl/365day.top.crt;
# 配置证书私钥文件
ssl_certificate_key /etc/nginx/ssl/365day.top.key;

# 配置反向代理
# 4、填写自己配置的查询路径,代替2973A8E01BDF
location /2973A8E01BDF {
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;
# 4、配置原来的Adguard Home服务查询路径,我在配置https时,端口改为了4433
proxy_pass https://127.0.0.1:4433/dns-query;
}

# 默认的查询的路径返回404
location /dns-query {
return 404;
}

# 5、其它路径直接连接Adguard Home服务
location / {
proxy_pass https://127.0.0.1:4433;
# 或者已经配置好了不需要前端页面,也可以重定向,重定向的话上面的404就不需要了
#rewrite ^/(.*) https://baidu.com/$1 redirect;
}
}

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

gzip on;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

IOS 配置文件

网站生成

可以使用网页一键生成配置文件

Secure DNS profile creator:https://dns.notjakob.com/tool.html

手动配置

ios 的描述文件需要 ios14 及以上版本,第 14 行和 17 行需要修改,最后保存为 xxx.mobileconfig 类型的文件

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
49
50
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>DNSSettings</key>
<dict>
<key>DNSProtocol</key>
<string>HTTPS</string>
<key>ServerAddresses</key>
<array>
<string>填入服务器公网ip地址</string>
</array>
<key>ServerURL</key>
<string>https://域名/查询路径/上面配置的客户端标识符</string>
</dict>
<key>PayloadDescription</key>
<string>Configures device to use ShiGuang DoH Encrypted DNS over HTTPS</string>
<key>PayloadDisplayName</key>
<string>ShiGuang DoH</string>
<key>PayloadIdentifier</key>
<string>com.apple.dnsSettings.managed.ac1126b6-842f-4f03-9b41-036b7bda3e91</string>
<key>PayloadType</key>
<string>com.apple.dnsSettings.managed</string>
<key>PayloadUUID</key>
<string>863e2d35-9d6f-4cb9-8f87-1368b6048935</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>ProhibitDisablement</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Configures device to use ShiGuang DoH Encrypted DNS over HTTPS</string>
<key>PayloadDisplayName</key>
<string>ShiGuang DoH</string>
<key>PayloadIdentifier</key>
<string>com.paulmillr.apple-dns</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>874a882a-293c-4adc-bd7e-921f91499861</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

配置文件完整说明

安装

安装就没什么好说的了,Safari 浏览器下载配置文件,设置里面安装即可