之前研究过安装 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或者之类的接收器就可以使用了!
博主好,感谢分享,我按照您的的方法部署没有跑起来,能再详细说明下吗?