Я настроил Traefik с Docker и сервисом, стоящим за ним. Базовая установка работает. Я могу перейти к порту 80, используя доменное имя, которое я перенаправляю на https, а затем вижу «недействительный сертификат» - так как часть шифрования не работает.
[маршрутизатор] <-:80/:443-> [linux/docker [Traefik:80/:443][Service:8080]]
Вот запись в логе (редактировал домен.)
Журналы:
acme: Error -> One or more domains had a problem:\n[xyz.example.net] acme: error: 400 :: urn:ietf:params:acme:error:connection :: Fetching http://xyz.example.net/.well-known/acme-challenge/eIAFZqaGMHMWaBjINjzk4m8PuWiYfuCHCTnSU9M: Error getting validation data, url: \n"
Сообщение об ошибке верное, я не могу перейти по этому URL-адресу. Я заметил, что могу перейти по этому URL-адресу, используя внутренний IP-адрес http://10.0.0.21/.well-known/acme-challenge/key
, и Traefik отвечает в журнале:
traefik | time = "2019-05-28T21:20:52Z" level=error msg = "Error getting challenge for token retrying in 542.914495ms"
Я подозреваю, что проблема заключается в настройке перенаправления доменного имени. Мой сервис находится на xyz.example.net (как и Traefik). Я подозреваю, что проблема в том, что Traefik перенаправляет весь трафик, поступающий на xyz.example.net:80/:443
, на сервис, а не обрабатывает сам ./well-known/acme-challenge
. Нужно ли давать имя самому шлюзу? (Например, zzz.example.net
— это Traefik, а xyz.example.net
— сервис?)
Как я могу это исправить?
Мой файл TOML:
debug = false
logLevel = "ERROR" #DEBUG, INFO, WARN, ERROR, FATAL, PANIC
InsecureSkipVerify = true
defaultEntryPoints = ["https", "http"]
[entryPoints]
[entryPoints.http]
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[retry]
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "example.net"
watch = true
exposedbydefault = false
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
onDemand = false
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
Я заметил, что хотя внутренний IP 192.xxx работал, внешний IP не работал. Конечно, я бы сказал, что это похоже на проблему с брандмауэром - НО - брандмауэр прекрасно пропускает трафик для служб, которые я тестировал, поэтому я был сбит с толку.
Решение? порт 80 не переадресовывался на брандмауэре, 443 было. Поэтому, когда я пробовал тестировать с помощью curl/browser, я вводил https://xyz.example.com — и это работало.