Eine Geschichte, die sich mit dem Problem befasst, dass REMOTE_ADDR nicht in einem mit Docker Swarm + Traefik (1.7) erstellten Cluster erworben werden kann.

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.

Ursache

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.

Lösung

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

Eine Geschichte, die sich mit dem Problem befasst, dass REMOTE_ADDR nicht in einem mit Docker Swarm + Traefik (1.7) erstellten Cluster erworben werden kann.
Das Problem, dass die von Docker gestartete localhost-Seite vom Browser nicht bestätigt werden kann, wenn die ESET-Firewall ausgeführt wird
Eine Geschichte über einen Fehler während der Migration in Docker PHP Laravel
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
Ich habe versucht, ein Programm in Java zu erstellen, das das Problem des Handlungsreisenden mit einem genetischen Algorithmus löst
[Docker] Eine Geschichte über einen Fehler beim Erstellen von Docker
[Rails] Probleme, die mit devise nicht registriert / angemeldet werden können
Vermeiden Sie das Problem, dass beim Upgrade von Rails 4.2.x auf 5.0.x keine Sitzung abgerufen werden kann, wenn Canary freigegeben wird.
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
Die Geschichte, dass Tomcat in Eclipse unter einem Timeout-Fehler litt
Die Geschichte, ein Projekt zu bauen, das Maven mit Ant gebaut hat
So lösen Sie das Problem, dass unter iOS14 keine Benachrichtigung angefordert werden kann
Die Geschichte, dass das Servlet nicht in die Java-Webanwendung geladen werden konnte
767 JSON :: ParserError tritt auf und der lokale Server kann nicht gestartet werden.
Nachdem ich das Montyhall-Problem mit Ruby überprüft hatte, war es eine Geschichte, die ich gut verstehen konnte und die ich nicht gut verstand