之前研究过安装 dns-over-https服务,但是安装还是非常复杂,无论是环境配置(nginx等),还是配置文件的安装,安装一台小鸡怎么也要半小时。现在有docker技术后,可以五分钟部署一台DoH服务器。
docker配置:
DoH服务器镜像 选用 goofball222/dns-over-https 文档还过得去。但是反代是大多数人不熟悉的traefik,因此反代组件还是使用 jwilder/nginx-proxy。
原来的自动证书签发工具 letsencrypt-nginx-proxy-companion 已经弃用,改用acme自动签发工具,官方镜像为 nginxproxy/acme-companion,参数差不多,就是多了一个/acme 目录。
为了能够实现反代,DoH和nginx之间需要建立一个内部网络。
docker network create interconnect
建立了名为 interconnect的内部网络,用于连接容器。
docker-compose设置:
DoH:
version: "3.5"
services:
dns-over-https:
image: goofball222/dns-over-https
container_name: dns-over-https
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/docker/doh:/opt/dns-over-https/conf
environment:
- TZ=UTC
- VIRTUAL_HOST=your.domain.tld #你准备申请SSL证书的域名,需要已经解析到小鸡
- VIRTUAL_PORT=8053
- LETSENCRYPT_HOST=your.domain.tld
- [email protected]
networks:
- interconnect
networks:
interconnect:
external: true
Nginx-proxy 和 acme签发助手:
version: "3.5"
services:
nginx-proxy-letsencrypt:
image: nginxproxy/acme-companion
container_name: nginx_ssl
environment:
- [email protected]
- NGINX_PROXY_CONTAINER=nginx_proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /home/docker/acme:/etc/acme.sh #需要多准备一个acme目录,其他同nginx-proxy
- /home/docker/nginx/certs:/etc/nginx/certs
- /home/docker/nginx/vhost.d:/etc/nginx/vhost.d
- /home/docker/nginx/html:/usr/share/nginx/html
networks:
- interconnect
depends_on:
- nginx-proxy
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx_proxy
ports:
- mode: host
protocol: tcp
published: 80
target: 80
- mode: host
protocol: tcp
published: 443
target: 443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/docker/nginx/certs:/etc/nginx/certs
- /home/docker/nginx/vhost.d:/etc/nginx/vhost.d
- /home/docker/nginx/html:/usr/share/nginx/html
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
networks:
- interconnect
networks:
interconnect:
external: true
最好先建立nginx-proxy和acme容器,再建立DoH容器,这样DoH一起来,acme就会给它自动发证书,大约30秒证书就发好,可以直接访问 https://your.domain.tld 了
DoH配置文件示例:
listen = [
":8053", #全部接口,因为docker中的127.0.0.1和0.0.0.0不是小鸡上的
#"[::1]:8053", #不需要IPV6的话关闭IPV6
]
local_addr = ""
cert = "" #TLS已经交给nginx了,故不需要,留空
key = ""
path = "/secretstring" #查询path字符串最好改成自己的,防止未经授权的请求
upstream = [
"udp:8.8.8.8:53",
"udp:1.0.0.1:53",
"udp:1.1.1.1:53",
"udp:8.8.4.4:53",
]
timeout = 10
tries = 3
verbose = false
log_guessed_client_ip = false
直接启动后,测试https成功后,访问 /secretstring,出现相应提示就是成功了。注意这里默认字符串是 /dns-query,为了防止未经授权的访问(主动探测),应该改成自己知道的字符串。
然后部署在smartdns或者之类的接收器就可以使用了!
博主好,感谢分享,我按照您的的方法部署没有跑起来,能再详细说明下吗?