Jak przekierować http na https za pomocą etykiet Traefik 2.0 i Docker Compose?

14

Pamiętaj, że jest to pytanie Traefik V2. Miałem rozwiązanie na V1, ale V2 jest całkowitym przebudowaniem.

Powyższe ma przekierować http://whoami.mysite.com na http s : //whoami.mysite.com.

  • Http s działa dobrze.
  • Http nie przekierowuje do https i nie generuje błędu 404.

Nie ma innego pliku. Na razie wszystko jest w tym Docker-compose.yml, ponieważ jest to test przygotowujący do dalszego wdrożenia.

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "[email protected]"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"
Thib
źródło

Odpowiedzi:

10

W samouczku Géralda Croësa znajduje się teraz działające rozwiązanie:

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:  
  traefik:  
    image: "traefik:v2.0.0"  
    # ...  
    labels:  
      # ...        
      # middleware redirect  
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"  
      # global redirect to https  
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"  
      - "traefik.http.routers.redirs.entrypoints=web"  
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"  
Martin Hryniewiecki
źródło
1
Oto docker-compose.yml z artykułu github.com/containous/blog-posts/blob/master/…
TheOneRing
1
Zauważ, że posiadanie istniejącego pliku acme.json może zablokować przekierowywanie oprogramowania pośredniego do HTTPS. Usuń go, jeśli już istnieje na starcie Traefik.
AymDev
7

Nie musisz konfigurować samej usługi Traefik. Na Traefik musisz mieć tylko punkty wejścia do: 443 (web-secure) i: 80 (web)

Ponieważ Traefik działa tylko jako entryPoint i nie dokona przekierowania, oprogramowanie pośrednie w usłudze docelowej to zrobi.

Teraz skonfiguruj usługę docelową w następujący sposób:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000

Zasadniczo przepływ przebiega następująco:

Żądanie: http://sub.domain.com:80 -> traefik (usługa) -> mywebserver-web (router, reguła http) -> mywebserver-redirect-web-secure (oprogramowanie pośrednie, przekierowanie do https) - -> mywebserver-web-secure (router, reguła https) -> mywebserver (usługa)

Lars
źródło
Nie jestem pewien, czy to wymóg. Sposób, w jaki to opisałeś, wydaje się, że żądania trafiają do portu 80 traffik, a schemat zmienia się na https przed przekazaniem do usługi wewnętrznej bazy danych. Ale usługa zaplecza nie wykonuje terminacji https, więc to się nie powiedzie. Pomysł polegałby na faktycznym przekierowaniu HTTP, aby żądanie powróciło do traefik na porcie 443 z zachowaniem hosta. W Traefik v1 można to łatwo zrobić za pomocą konfiguracji statycznej.
Andrei Dascalu
To działa. Powinno to znajdować się w dokumentacji. Musisz tylko utworzyć router dla wersji http i umieścić na nim przekierowujące oprogramowanie pośrednie.
milosa
2

Ok, znalazłem ... Zakładałem, że oprogramowanie pośrednie może być zadeklarowane na poziomie Traefik, ale muszą być zadeklarowane na poziomie usługi.

Ta linia :

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Musi znajdować się na etykietach serwisu Whoami.

Inną kwestią, niezwiązaną z opisanym problemem, jest to, że wyzwanie HTTP musi zostać wykonane na porcie 80.

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

Usuń „bezpieczny” w „bezpieczny w sieci”.

Thib
źródło
To jest dziwne. Mam oprogramowanie pośrednie przekierowania zadeklarowane w usłudze Traefik, o którym mowa w usłudze aplikacji i działa.
Izydorr
W przypadku poprzedniego kodu wydaje się, że działa, ale tak naprawdę http nie przekierowuje do https.
Thib
Jak odnosisz się do oprogramowania pośredniego z aplikacji?
Thib
W służbie traefik mam etykietę określającą middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https w służbie app mam etykiety: traefik.http.routers.myapp.rule=Host($ {APP_HOST} ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
1
Mam wszystko w etykietach. Jak rozumiem, użycie oprogramowania pośredniego wymaga dwóch etykiet: jednej do deklaracji / konfiguracji (traefik.http.middlewares.https-only.redirectscheme.scheme = https), a następnie zastosowania go do usługi (traefik.http.routers.myapp.middlewares = tylko https). Deklaracja może znajdować się na przykład w usłudze aplikacji lub w serwisie Treafik - tak jak ja to robię. Zauważ, że nawet jeśli zadeklarujesz middlewawe w usłudze aplikacji, zobaczysz go na pulpicie nawigacyjnym wraz z innymi middlewares zadeklarowanymi w innych miejscach. Może się mylę, ale myślę, że możesz użyć dowolnego z nich w dowolnej usłudze.
Izydorr
1

Szukałem tej odpowiedzi, kiedy szukałem sposobu przekierowania wszystkiego do HTTPS za pośrednictwem Traefik v2.2, a najlepszą opcją dla mnie było dodanie tych zmiennych ENV do Traefik, a to automatycznie przekierowuje cały ruch do HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Dzięki temu nie muszę dodawać niczego do oprogramowania pośredniego.

Fperk
źródło