Post

用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端口,TCPUDP都打开。

效果如何

之前:

之后:

截图来自https://dnschecck.tools

添加证书

证书可以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改日再折腾吧。

This post is licensed under CC BY 4.0 by the author.