Traefik 2泊坞窗未显示客户端真实IP

时间:2020-06-11 11:59:36

标签: docker traefik

我有traefik在docker中运行(在Windows主机上)。我的问题是X-Real-IP标头alawys显示了docker网络网关ip而不是真正的客户端ip。我不确定自己在做什么错,我知道主机网络模式下的traefik应该可以工作,但是那样就再也找不到自己的docker服务了。

这是我的docker compose文件:

version: "3.7"

networks:
  t2_proxy:
    external:
      name: t2_proxy
  default:
    driver: bridge

services:
  traefik:
    # The official v2 Traefik docker image
    image: traefik/traefik:latest
    container_name: traefik
    restart: unless-stopped
    # Enables the web UI and tells Traefik to listen to docker
    command: # CLI arguments
      - --global.checkNewVersion=true
      - --global.sendAnonymousUsage=true
      - --entryPoints.https.address=:443
      - --api=true
      - --api.insecure=true
      - --api.dashboard=true
      - --log=true
      - --log.level=INFO # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC
      - --accessLog=true
      - --accessLog.filePath=/traefiklog/traefik.log
      - --accessLog.bufferingSize=100 # Configuring a buffer of 100 lines
      - --providers.docker=true
      - --providers.docker.defaultrule=Host(`{{ index .Labels "com.docker.compose.service" }}.xxx.com`)
      - --providers.docker.endpoint=unix:///var/run/docker.sock
      - --providers.docker.exposedByDefault=false
      - --providers.docker.network=t2_proxy
      - --providers.docker.swarmMode=false
      - --providers.file.directory=/rules # Load dynamic configuration from one or more .toml or .yml files in a directory.
      - --providers.file.watch=true # Only works on top level files in the rules folder
    networks:
      t2_proxy:
        ipv4_address: 192.168.90.254
    ports:
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    volumes:
      - C:\docker/traefik/rules:/rules 
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - C:\docker/traefik/logs:/traefiklog
      - C:\docker/shared:/shared
    labels:
      - "traefik.enable=true"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    networks:
      t2_proxy:
        ipv4_address: 192.168.90.200
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.xxx.com`)"
      - "traefik.http.routers.whoami.entrypoints=https"
      - "traefik.http.routers.whoami.tls=true"

我通过以下方式建立了网络

docker network create --gateway 192.168.90.1 --subnet 192.168.90.0/24 t2_proxy

这是浏览器中whoami webrequest的输出:

Hostname: 8752e7b8a5d4
IP: 127.0.0.1
IP: 192.168.90.200
RemoteAddr: 192.168.90.254:36228
GET / HTTP/1.1
Host: whoami.xxx.com:433
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US
Cache-Control: max-age=0
Dnt: 1
Te: trailers
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 192.168.90.1
X-Forwarded-Host: whoami.xxx.com:433
X-Forwarded-Port: 433
X-Forwarded-Proto: https
X-Forwarded-Server: 969f601c0c24
X-Real-Ip: 192.168.90.1

1 个答案:

答案 0 :(得分:2)

解决方案似乎在本指南中提出:https://dockerswarm.rocks/traefik/#getting-the-client-ip

如果您需要使用Traefik提供的X-Forwarded-ForX-Real-IP标头读取应用程序/堆栈中的客户端IP,则需要使Traefik直接侦听,而不是通过Docker Swarm模式侦听,即使正在以Docker Swarm模式部署。

ports:
  - target: 80
    published: 80
    mode: host
  - target: 443
    published: 443
    mode: host