Im Docker Swarm-Cluster habe ich einen Traefik-Container als Reverse-Proxy eingerichtet und versucht, ihn mit einer Konfiguration zu betreiben, die Inhalte mit einem Knotencontainer verteilt. Ich hatte jedoch Probleme, weil ich REMOTE_ADDR nicht erhalten konnte.
Notieren Sie sich, was in diesem Fall zu tun ist.
Docker-Version: 19.03.12
Die ursprüngliche Datei docker-compose.yml lautet:
version: '3.4'
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
networks:
- internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- SERVICES=1
- TASKS=1
- NETWORKS=1
- LOGSPOUT=ignore
deploy:
placement:
constraints:
- node.hostname == manager
traefik:
image: traefik:1.7-alpine
command:
- "--logLevel=error"
- "--entryPoints=Name:http Address::80 Redirect.EntryPoint:https"
- "--entryPoints=Name:https Address::443 TLS"
- "--defaultentrypoints=http,https"
- "--web"
- "--web.address=:8080"
- "--acme"
- "--acme.storage=certs.json"
- "--acme.entrypoint=https"
- "--acme.httpchallenge.entrypoint=http"
- "--acme.onHostRule=true"
- "[email protected]"
- "--docker"
- "--docker.endpoint=tcp://socket-proxy:2375"
- "--docker.swarmMode"
- "--docker.watch"
ports:
- 80:80
- 443:443
networks:
- internal
- overlay
volumes:
- ./certs/certs.json:/certs.json
deploy:
placement:
constraints:
- node.hostname == web
restart_policy:
condition: on-failure
web:
image: hoge/fuga:dev
networks:
- overlay
deploy:
replicas: 1
placement:
constraints:
- node.hostname == web
labels:
- "traefik.enable=true"
- "traefik.backend=web"
- "traefik.frontend.rule=Host:sample.com"
- "traefik.frontend.entryPoints=https"
- "traefik.frontend.passHostHeader=true"
- "traefik.docker.network=overlay"
- "traefik.protocol=http"
- "traefik.port=3000"
networks:
overlay:
external: true
internal:
internal: true
Obwohl dies nicht das Hauptthema dieser Zeit ist, wird in der obigen Einstellung "Docker-Socket-Proxy" verwendet, um den Endpunkt von Traefik einem anderen Container zuzuweisen. Im Allgemeinen wird Traefik auf dem Manager-Knoten ausgeführt und docker.sock wird als Endpunkt angegeben. Wenn jedoch in Traefik eine Sicherheitslücke gefunden wird, besteht das Risiko, dass der gesamte Cluster entführt wird. .. Durch die Verwendung von Docker-Socket-Proxy kann Traefik auf dem Worker-Knoten ausgeführt werden, und durch Eingrenzen der Berechtigung mit Docker-Socket-Proxy ist es möglich, mit erhöhter Sicherheit zu arbeiten.
Ich habe bereits eine bestimmte Site betrieben und unter böswilligem Zugriff gelitten. Daher möchte ich REMOTE_ADDR auf jeden Fall als Protokoll behalten, kann es aber trotzdem nicht abrufen.
Traefik sollte die Header-Informationen usw. an das Backend senden, wie es ist, wenn Sie in jedem Container "traefik.frontend.passHostHeader = true" angeben. User-Agent usw. kann korrekt erfasst werden, sodass diese Einstellung anscheinend aktiv ist.
Nach vielen Recherchen fand ich in Bulletin Boards in Übersee Informationen darüber, dass das Docker Swarm-Overlay-Netzwerk REMOTE_ADDR nicht zu tragen scheint. Im Fall von Nginx gab es auch eine Lösung, um den Port im Host-Modus bereitzustellen.
Also habe ich die Traefik-Port-Einstellungen wie folgt umgeschrieben.
ports:
- mode: host
protocol: tcp
published: 80
target: 80
- mode: host
protocol: tcp
published: 443
target: 443
Nach dem Testen konnte ich REMOTE_HOST sicher abrufen.
Ich denke, dass Nginx usw. es mit der gleichen Korrespondenz lösen kann. Wenn Sie Probleme mit demselben Problem haben, versuchen Sie es bitte.
Recommended Posts