Docker快速部署dns-over-https服务

之前研究过安装 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或者之类的接收器就可以使用了!

发表评论

邮箱地址不会被公开。 必填项已用*标注