Добрый день!
Дано
- Мой сервер внутри ДМЗ на котором в Докере крутятся различные сервисы.
- Учетка на CloudFlare, бесплатный :) тариф. Поддержка моей зоны ДНС (пусть будет mdomain.ru) + Универсальный сертификат на mdomain.ru и *.mdomain.ru. Туннель в ДМЗ. Настройка SSL/TLS encryption mode is Full (strict)
Надо
Настроить traefik чтобы заходя по какому-то доменому имени попадал на запущенный в докере сервис. И что бы все это было по HTTPS с сертификатом CF.
Настройка
Cloudflare tunnel
Туннель запущен в докере, имеет доступ к контейнеру traefik’а. Настроен редирект: traefik.mdomain.ru -> https://traefik
Traefik
docker-traefik.yml
version: "3.9"
networks:
traefik_net:
external: true
private_cf1:
external: true
secrets:
mdomain.ru.pem:
file: ./traefik/mdomain.ru.pem
mdomain.ru.key:
file: ./traefik/mdomain.ru.key
services:
traefik:
image: traefik:v2.10
ports:
- target: 80
published: 80
protocol: tcp
- target: 443
published: 443
protocol: tcp
environment:
- TZ=$TZ
- CF_API_EMAIL=*********
- CF_API_KEY=********
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/etc/traefik/traefik.yml
- ./traefik/dynamic:/etc/traefik/dynamic
- ./traefik/acme.json:/etc/traefik/acme.json
secrets:
- mdomain.ru.pem
- mdomain.ru.key
networks:
- traefik_net
- private_cf1:
deploy:
mode: global
placement:
constraints:
- node.role == manager
restart_policy:
condition: any
labels:
- "traefik.http.routers.api.entrypoins=https"
- "traefik.http.routers.api.rule=Host(`traefik.mdomain.ru`)"
- "traefik.http.routers.api.service=api@internal"
- "traefik.http.routers.api.tls=true"
# - "traefik.http.routers.api.middlewares=traefik_auth@file"
# Dummy service for Swarm port detection. The port can be any valid integer value.
- "traefik.http.services.dummy-svc.loadbalancer.server.port=9999"
- "traefik.http.services.dummy-svc.loadbalancer.server.scheme=http"
traefik.yml
log:
level: debug
accessLog: {}
api:
dashboard: true
providers:
docker:
swarmMode: true
network: traefik_net
exposedByDefault: false
file:
directory: /etc/traefik/dynamic
watch: true
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
permanent: false
https:
address: ":443"
tls:
stores:
default:
defaultCertificate:
certFile: /run/secrets/mdomain.ru.pem
keyFile: /run/secrets/mdomain.ru.key
defaultGeneratedCert:
resolver: cfresolver
domain:
main: "mdomain.ru"
sans:
- "*.mdomain.ru"
certificatesResolvers:
cfresolver:
acme:
email: *******
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
Проблема
Пытаюсь зайти на адрес https://traefik.mdomain.ru (должен попасть на дашборд Traefik’а). А в ответ: сервис не доступен.
В логах Traefik
time="2023-10-11T20:02:30+06:00" level=debug msg="Serving default certificate for request: \"traefik\""
time="2023-10-11T20:02:30+06:00" level=debug msg="http: TLS handshake error from 10.100.0.4:47280: remote error: tls: bad certificate"
time="2023-10-11T20:02:32+06:00" level=debug msg="Serving default certificate for request: \"traefik\""
time="2023-10-11T20:02:32+06:00" level=debug msg="http: TLS handshake error from 10.100.0.4:47292: remote error: tls: bad certificate"
В логах Cloudflare
2023-10-11T14:02:32Z DBG GET https://traefik.mdomain.ru/favicon.ico HTTP/1.1 cfRay=8147a42dce60b4ee-OSL connIndex=2 content-length=0 event=1 headers={"Accept":["image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"],"Accept-Encoding":["gzip, br"],"Accept-Language":["ru,en-US;q=0.9,en;q=0.8,ja;q=0.7"],"Cdn-Loop":["cloudflare"],"Cf-Connecting-Ip":["*.*.*.*"],"Cf-Ipcountry":["RU"],"Cf-Ray":["8147a42dce60b4ee-OSL"],"Cf-Visitor":["{\"scheme\":\"https\"}"],"Cf-Warp-Tag-Id":["****"],"Priority":["u=1, i"],"Referer":["https://traefik.mdomain.ru/"],"Sec-Ch-Ua":["\"Google Chrome\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\""],"Sec-Ch-Ua-Mobile":["?0"],"Sec-Ch-Ua-Platform":["\"Linux\""],"Sec-Fetch-Dest":["image"],"Sec-Fetch-Mode":["no-cors"],"Sec-Fetch-Site":["same-origin"],"User-Agent":["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"],"X-Forwarded-For":["*.*.*.*"],"X-Forwarded-Proto":["https"]} host=traefik.mdomain.ru ingressRule=1 path=/favicon.ico
2023-10-11T14:02:32Z ERR error="Unable to reach the origin service. The service may be down or it may not be responding to traffic from cloudflared: tls: failed to verify certificate: x509: certificate is valid for 99086f145502f9bf969143601bc2499b.d80c8b992178b999171d425802265962.traefik.default, not traefik" cfRay=8147a42dce60b4ee-OSL event=1 ingressRule=1 originService=https://traefik
2023-10-11T14:02:32Z ERR Request failed error="Unable to reach the origin service. The service may be down or it may not be responding to traffic from cloudflared: tls: failed to verify certificate: x509: certificate is valid for 99086f145502f9bf969143601bc2499b.d80c8b992178b999171d425802265962.traefik.default, not traefik" connIndex=2 dest=https://traefik.mdomain.ru/favicon.ico event=0 ip=*.*.*.* type=http
Как я понимаю Траефик не берет универсальный серт от СФ и сезет со своим, сгенерированным. А СФ дает ему отлуп. Как ЭТО ВСЕ НАСТОИТЬ? Что-то всю голову сломал. Куча всяких примеров/описаний почитал. Но там что-то не договаривают или подразумевают, что я все это УЖЕ должен знать. Воотщем не работает :(
Кто настраивал подобную схему, или знает куда копать - ПОМОГИТЕ ПОЖАЛУЙТА!