docker 如何配置tls上dns的traefik?

hs1ihplo  于 2023-01-08  发布在  Docker
关注(0)|答案(2)|浏览(171)

我在配置traefik + pihole时遇到了问题。我想在tls上配置dns。也许有人能给我指出正确的方向?
在调试过程中,我发现了kdig工具,我已经试过了:

kdig -d @myiphere +tls-ca +tls-host=mydnshere  example.com                                                                                  07:36:12
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(myiphere), port(853), protocol(TCP)
;; DEBUG: TLS, imported 127 system certificates
;; WARNING: TLS, handshake failed (A TLS fatal alert has been received.)

好吧,也许证书是错的?看起来不像:

openssl s_client -connect mydnshere:853                                                                                                                                                    
CONNECTED(00000003)
/***bunch of text here***/
SSL handshake has read 5070 bytes and written 382 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
/***bunch of text here***/

有人能给我指出正确的方向或告诉我错过了什么吗?
我不得不提到dig domain.com @myipheredig +tcp domain.com @myiphere工作得很好。
以下是我的配置:
运输:

version: "3.8"                                                                                                                                                                                                     
                                                                                                                                                                                                                   
services:                                                                                                                                                                                                          
  reverse-proxy:                                                                                                                                                                                                   
    image: traefik                                                                                                                                                                                                 
    restart: unless-stopped                                                                                                                                                                                        
    command:                                                                                                                                                                                                       
      - "--api=true"                                                                                                                                                                                               
      - "--providers.docker=true"                                                                                                                                                                                  
      - "--providers.docker.exposedbydefault=false"                                                                                                                                                                
      - "--entrypoints.web.address=:80"                                                                                                                                                                            
      - "--entrypoints.dns.address=:53"                                                                                                                                                                            
      - "--entrypoints.dot.address=:853"                                                                                                                                                                           
      - "--entrypoints.dns-udp.address=:53/udp"                                                                                                                                                                    
      - "--entrypoints.websecure.address=:443"                                                                                                                                                                     
      - "--entrypoints.vpn-udp.address=:51820/udp"                                                                                                                                                                 
      - "--entrypoints.syncthing-tcp.address=:20000"                                                                                                                                                               
      - "--entrypoints.syncthing-udp.address=:20000/udp"                                                                                                                                                           
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"                                                                                                                                              
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"                                                                                                                                              
      - "--certificatesresolvers.le.acme.email=wkill95@gmail.com"                                                                                                                                                  
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"                                                                                                                                           
      - "--certificatesresolvers.le.acme.httpchallenge=true"                                                                                                                                                       
      - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"                                                                                                                                             
      - "--pilot.token=${TRAEFIK_PILOT_TOKEN:-}"                                                                                                                                                                   
      - "--serversTransport.insecureSkipVerify=true"                                                                                                                                                               
      - "--log.level=${TRAEFIK_LOG_LEVEL:-ERROR}"                                                                                                                                                                  
    ports:                                                                                                                                                                                                         
      # TODO: found out how to show remote ip in pihole                                                                                                                                                            
      #- "53:53"                                                                                                                                                                                                   
      #- "53:53/udp"                                                                                                                                                                                               
      - "853:853"                                                                                                                                                                                                  
      # The HTTP port                                                                                                                                                                                              
      - "80:80"                                                                                                                                                                                                    
      - "443:443"                                                                                                                                                                                                  
      # VPN                                                                                                                                                                                                        
      - "51820:51820/udp"                                                                                                                                                                                          
      # The Web UI (enabled by --api.insecure=true)                                                                                                                                                                
      #- "8080:8080"       
      # Syncthing
      - "22000:22000"
      - "22000:22000/udp"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_certs:/letsencrypt
    networks:
      - reverse-proxy
    dns:
      - 1.1.1.1
      - 1.0.0.1
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api-data.rule=Host(`${TRAEFIK_API_DOMAIN?No traefik api domain set}`) && ( Path(`/api/version`) || PathPrefix(`/api/http/`) || PathPrefix(`/api/tcp/`))"
      - "traefik.http.routers.api-data.entrypoints=websecure"
      - "traefik.http.routers.api-data.service=api@internal"
      - "traefik.http.routers.api-data.tls=true"
      - "traefik.http.routers.api-data.tls.certresolver=${TRAEFIK_API_CERTRESOLVER?No traefik api certificate resolver}"
      - "traefik.http.routers.api.rule=Host(`${TRAEFIK_API_DOMAIN?No traefik api domain set}`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.service=api@internal"
      - "traefik.http.routers.api.tls=true"
      - "traefik.http.routers.api.tls.certresolver=${TRAEFIK_API_CERTRESOLVER?No traefik api certificate resolver}"
      - "traefik.http.routers.api.middlewares=authelia@docker"

      - "flame.type=application"
      - "flame.name=Traefik"
      - "flame.url=https://${TRAEFIK_API_DOMAIN}"
      - "flame.icon=router-network"

volumes:
  traefik_certs:

networks:
  reverse-proxy:
    name: reverse-proxy

针孔:

version: '3.8'                                                                                                                                                                                                     
                                                                                                                                                                                                                   
services:                                                                                                                                                                                                          
  pihole:                                                                                                                                                                                                          
    image: pihole/pihole                                                                                                                                                                                           
    restart: unless-stopped                                                                                                                                                                                        
    env_file: pihole.environment                                                                                                                                                                                   
    cap_add:                                                                                                                                                                                                       
      - CAP_NET_ADMIN                                                                                                                                                                                              
    networks:                                                                                                                                                                                                      
      - reverse-proxy                                                                                                                                                                                              
    dns:                                                                                                                                                                                                           
      - 127.0.0.1                                                                                                                                                                                                  
      - 1.1.1.1                                                                                                                                                                                                    
    ports:                                                                                                                                                                                                         
      - 53:53/tcp                                                                                                                                                                                                  
      - 53:53/udp                                                                                                                                                                                                  
    volumes:                                                                                                                                                                                                       
      - 'pihole_configs:/etc/pihole/'                                                                                                                                                                              
    labels:                                                                                                                                                                                                        
      - "traefik.enable=true"                                                                                                                                                                                      
      - "traefik.docker.network=reverse-proxy"                                                                                                                                                                     
                                                                                                                                                                                                                   
      - "traefik.http.routers.pihole-api.rule=Host(`${PIHOLE_DOMAIN:?No pihole domain set}`) && Path(`/admin/api.php`)"                                                                                            
      - "traefik.http.routers.pihole-api.tls=true"                                                                                                                                                                 
      - "traefik.http.routers.pihole-api.tls.certresolver=${PIHOLE_CERTRESOLVER?No pihole certificate resolver}"
      - "traefik.http.routers.pihole-api.entrypoints=websecure"
      - "traefik.http.routers.pihole-api.service=pihole"
      - "traefik.http.services.pihole-api.loadBalancer.server.port=80"

      - "traefik.http.routers.pihole.rule=Host(`${PIHOLE_DOMAIN:?No pihole domain set}`)"
      - "traefik.http.routers.pihole.tls=true"
      - "traefik.http.routers.pihole.tls.certresolver=${PIHOLE_CERTRESOLVER?No pihole certificate resolver}"
      - "traefik.http.routers.pihole.entrypoints=websecure"
      - "traefik.http.routers.pihole.service=pihole" 
      - "traefik.http.routers.pihole.middlewares=authelia@docker"
      - "traefik.http.services.pihole.loadBalancer.server.port=80"
      - "flame.type=application"
      - "flame.name=DNS"
      - "flame.url=https://${PIHOLE_DOMAIN}/admin"
      - "flame.icon=pi-hole"

      - "traefik.tcp.routers.dnsovertls.rule=HostSNI(`mydnshere`)"
      - "traefik.tcp.routers.dnsovertls.entrypoints=dot"
      - "traefik.tcp.routers.dnsovertls.tls.certresolver=le"
      - "traefik.tcp.routers.dnsovertls.service=pihole"

      # Normal DNS coming in on 53 TCP, no TLS
      - "traefik.tcp.routers.dns.rule=HostSNI(`*`)"
      - "traefik.tcp.routers.dns.entrypoints=dns"
      - "traefik.tcp.routers.dns.service=pihole"

      # recieves traffic from both the TLS and non-TLS traefik routers
      - "traefik.tcp.services.pihole.loadbalancer.server.port=53"

      # Normal DNS coming in on 53 UDP
      - "traefik.udp.routers.udpdns.entrypoints=dns-udp"
      - "traefik.udp.routers.udpdns.service=pihole"
      - "traefik.udp.services.pihole.loadbalancer.server.port=53"
volumes:
  pihole_configs:

networks:
  reverse-proxy:
    external: true
yk9xbfzb

yk9xbfzb1#

我也遇到了同样的问题。问题是Traefik默认情况下阻止了dot ALPN扩展。
kdig请求后docker compose logs显示:

tls: client requested unsupported application protocols ([dot])

你也可以用openssl来测试这个:

$ openssl s_client -alpn dot -connect mydnshere:853   
...
No ALPN negotiated

您可以使用Docker为traefik配置ALPN分机,如下所示。
添加到compose.yaml(相应地重命名服务/路由器名称):

services:
  traefik:
    image: "traefik:v2.9"

    command: 
      # Provider Config
      - "--providers.file.filename=/etc/traefik/config.toml"

    volumes:
      - ./config.toml:/etc/traefik/config.toml

  blocky:
    image: spx01/blocky

    labels:
      - "traefik.tcp.routers.blocky-dns.rule=HostSNI(`my.fqn.com`) && ALPN(`dot`)"
      - "traefik.tcp.routers.blocky-dns.tls.options=dot@file"

添加配置至

[tls.options]
  [tls.options.dot]
    alpnProtocols = ["dot"]

以下是ALPN dot的一些背景信息:https://gitlab.isc.org/isc-projects/bind9/-/issues/2794

798qvoo8

798qvoo82#

我试图理解您在这里尝试做什么。您想使用Traefik作为Pihole DNS解析尝试的代理吗?我不认为这工作得很好,因为您正在使用Traefik作为您的服务的 * 反向 * 代理。
Traefik处理来自外部的连接并发送回相应的应答。据我所知,如果Pihole自己决定进行查找,它不会通过Traefik。你必须为安全查找配置一个单独的服务,比如stubby或cloudflared。我推荐cloudflared(它通过DoH进行加密查找),因为有一个官方的guide in their documentation
除此之外,docker compose文件中的DNS字段是用于docker容器环境的,但这不是你为Pihole查找配置DNS地址的地方,你必须在Pihole应用程序设置中配置。

相关问题