Невозможно перенаправить с http на https за балансировщиком нагрузки AWS

Я запускаю traefik на экземпляре AWS с серверной частью ранчо. Я завершаю SSL на балансировщике нагрузки AWS и связываюсь через порт 80 с экземпляром, который перенаправляет трафик: 80 в контейнер traefik.

Итак, балансировщик нагрузки в настоящее время имеет: https: 443 ==> http: 80 http: 80 ==> http: 80

Это означает, что если вы введете https://example.com, вы получите SSL, а если вы введете http://example.com, вы просто получаете обычное http-соединение.

Желательно иметь автоматическое перенаправление через http 302 - он перенаправляет http://example.com на https://example.com.

Пока что я безуспешно пробовал следующее:

** Балансировщик нагрузки AWS **

https: 443 => http: 80
http: 80 => http: 81

traefik.toml
------------
[entryPoints]
  [entryPoints.http]
  address = ":81"
     [entryPoints.http.redirect]
     regex = "^http://example.com/(.*)"
     replacement = "https://example.com/$1"
  address = ":80"

docker-compose.yml
------------------
API-Proxy:
  container_name: api-proxy
  image: traefik
  volumes:
  - "/var/run/docker.sock:/var/run/docker.sock"
  - "$PWD/traefik.toml:/etc/traefik/traefik.toml"
  command: "--web --rancher --docker.domain=rancher.localhost --logLevel=DEBUG"
  cpu_shares: 128
  restart: always
  ports:
  - 80:80/tcp
  - 81:81/tcp
  - 8100:8080/tcp

Когда я пытаюсь получить доступ через порт 80, наступает тайм-аут. Журналы Traefik бесполезны.

Это глупый подход? Или лучше завершить SSL в транспортном контейнере с помощью Let's encrypt?


person Friedrich Brunzema    schedule 02.01.2018    source источник


Ответы (2)


Попробуйте что-то подобное в своей конфигурации Traefik. Затем перенаправьте оба порта 443 и 80 на LB на порт 80 на Traefik.

[entryPoints]
  [entryPoints.http]
     address = ":80"
     [entryPoints.http.redirect]
     regex = "^http://(.*)"
     replacement = "https://$1"
person ilya    schedule 01.02.2018

Сейчас я делаю это в Kubernetes на AWS. Это немного неудобно, но это вполне возможно.

Сначала вам нужно убедиться, что ваш ELB прослушивает HTTP (не HTTPS) на порту 80 и HTTPS на порту 443. Если у вас есть ELB, который прослушивает HTTPS на порту 80, вы получите очень странное поведение клиентов. Сначала проверьте это. Примечание. Это поведение по умолчанию, если вы развернули Traefik с помощью Helm.

Используйте aws elb describe-load-balancers, чтобы распечатать все ваши ELB. Вам нужно будет найти там ELB (я не знаю, как сказать, какой именно) и посмотреть в LoadBalancerDescriptions[].ListenerDescriptions[].Listener.Protocol и InstanceProtocol, чтобы убедиться, что это HTTPS и HTTP соответственно.

Во-вторых, это все, что вам нужно в вашем config.toml:

 [entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
      regex = "^http://(.*)"
      replacement = "https://$1"
  [entryPoints.httpn]
  address = ":8880"
  compress = true

Объяснение:

  • Слушайте порт 80
  • Настройте постоянное перенаправление для любого трафика с порта 80 на порт 8880
  • Слушайте порт 8880 с помощью HTTP и включите сжатие gzip

ELB должен иметь порт 80, сопоставленный с портом 80, и порт 443, сопоставленный с портом 8880. Теперь весь HTTP-трафик будет автоматически перенаправлен (используйте curl -v -L http://example.com для тестирования) на HTTPS, завершится на ELB и перенаправлен как HTTP на Traefik.

Я все еще ищу хороший способ указать протоколы для слушателей ELB при развертывании, но я не нашел хорошего решения, кроме изменения их вручную через консоль AWS после развертывания Traefik.

person penguincoder    schedule 06.06.2018