前言
原先的方案如下
- docker 运行 adguardhome, 在同一个docker-compose中同时运行dnscrypt
- dnscrypt容器固定其IP地址
- adguardhome中的dns服务器设置为dnscrypt
- 外部使用caddy反代adguardhome, 顺带申请ssl
- adguardhome配置使用caddy申请下来的ssl证书到加密设置中
- 使用doh访问DNS服务
缺陷: dnscrypt由于本质还是通过tcp协议访问源头dns服务器, 偶尔(并非偶尔)会出现超时的情况, 对于稍微多频的请求, 就力不从心了.
最好的方案肯定还是运行clash, 让dns请求走通道出去进行查询
修改方案
将dnscrypt替换为easymosdns
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
|
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
ports:
- xxx:80
- xxx:443
- xxx:3000
networks:
linx_network:
volumes:
- ./workdir:/opt/adguardhome/work
- ./confdir:/opt/adguardhome/conf
- 证书目录:/opt/adguardhome/ssl
mosdns:
image: irinesistiana/mosdns:v4.5.3
container_name: mosdns
environment:
- TZ=Asia/Shanghai
ports:
- 5533:53
volumes:
- ./mosdns:/etc/mosdns
restart: always
networks:
linx_network:
ipv4_address: 172.30.0.8
networks:
linx_network:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/24
|
证书目录为这样的
1
|
/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/<域名>
|
caddy容器的映射是
1
2
|
volumes:
- ./data:/data
|
调整为实际的路径即可
对于adguardhome的端口, 只使用DOH的情况下, 只需要映射3000 80 443端口即可.
3000端口为安装初始化时使用, 80则是未配置加密证书时临时先登录用的端口, 配置好ssl之后, 只需要一个443端口即可
caddy的docker-compose.yaml文件如下:
1
2
3
4
5
6
7
8
9
|
services:
caddy:
image: caddy
restart: unless-stopped
ports:
- '443:443'
volumes:
- ./data:/data
- ./Caddyfile:/etc/caddy/Caddyfile
|
Caddyfile文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
域名:443 {
reverse_proxy https://127.0.0.1:xxx {
header_up Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Port {server_port}
header_up X-Forwarded-Proto "http"
trusted_proxies 172.30.0.0/20
transport http {
tls_insecure_skip_verify
}
}
}
|
adguardhome设置如下:
- 上游dns设置为
172.30.0.8
- 加密设置中启用加密
- 服务器名称填写域名
- 证书为
/opt/adguardhome/ssl/域名.crt
- 私钥为
/opt/adguardhome/ssl/域名.key