用Docker自建DNS服务器
我参考了这篇博客
初始设置
下面是docker-compose.yml
的内容:
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
version: '3'
services:
adguard-home:
restart: always
image: adguard/adguardhome
volumes:
- ./workdir:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf
# Required if you want DoH/DoT/DoQ - see section of this post about SSL
- ./certs:/certs
ports:
# Plain DNS
- '53:53/tcp'
- '53:53/udp'
# DOT
- '853:853/tcp'
# DOQ
- '853:853/udp'
# Admin UI
- '80:80'
- '443:443'
# Initial setup (can be removed after first install)
- '127.0.0.1:3000:3000'
networks:
- adguard_net
networks:
adguard_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
建好相应的目录结构后用docker compose up -d
命令启动容器,首先通过3000端口完成initial setup.
可以用ssh -L 8000:localhost:3000 -C -N -l root ip_addr
命令将本地的8000端口转发到服务器的3000端口,然后打开浏览器访问localhost:8000
完成设置。
设置完成后就可以注释掉- '127.0.0.1:3000:3000'
,然后重启容器。
设置上游dns
剩下的设置可以访问web界面完成,也可以编辑conf/AdGuardHome.yaml
完成。我感觉用gui更简单,比如设置证书的时候,填完证书路径就会提示该证书是否有效等等。
证书后面说,咱们先在HTTP页面完成上游dns服务器的设置,然后测试下能不能用。
推荐用cloudflare的服务器,因为cloudflare在这篇博客里声称与第三方审计公司合作,以证明他们不会存储长期日志 ,这里是相关的审计报告。
测试
打开终端,用nslookup google.com ip_addr
命令测试一下你的dns服务器有没有在工作,把ip_addr
换成你的服务器地址。
如果返回;; connection timed out; no servers could be reached
,别忘了打开你的53端口,TCP
和UDP
都打开。
效果如何
之前:
之后:
添加证书
证书可以self-signed,参考的博客里用了Let’s Encrypt/ACME client.
相关配置我都放这个仓库里了,不过你需要一个域名,并且使用cloudflare的服务。首先.env
里改一下环境变量,一个cloudflare的api token,一个邮件地址。然后再改一下docker-compose.yml
里的域名,最后执行crt.sh
脚本就可以生成证书了。
记得把证书文件放到相应位置,重启容器后在web界面设置证书路径和服务器名称等等相关信息。
设置后刷新一下应该就是HTTPS的web界面了。
加密dns
53端口用于普通的dns,即plain dns,这是没加密的。
请求的网址和返回的ip都是明文,见下图:
不过能用上自建的dns服务器已经是一大进步了,加密dns改日再折腾吧。