Lorsque vous utilisez Traefik et Docker-compose, j'aimerais que l'adresse IP du conteneur effectue un filtrage basé sur IP, mais à la place, je souhaite obtenir l'adresse IP de la passerelle réseau docker.
Voici les résultats d'une requête curl du conteneur curl-client:
docker-compose exec curl-client curl https://whoami.domain.name
Hostname: 608f3dcaf7d9
IP: 127.0.0.1
IP: 172.18.0.2
GET / HTTP/1.1
Host: whoami.domain.name
User-Agent: curl/7.58.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.18.0.1
X-Forwarded-Host: whoami.domain.name
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: 88756553599b
X-Real-Ip: 172.18.0.1
Ici, 172.18.0.1 est la passerelle pour le réseau traefik_net. Au lieu de cela, je m'attendrais à voir 172.18.0.9 dans le champ X-Forwarded-For, car il s'agit de l'adresse IP du conteneur curl-client:
docker-compose exec curl-client cat /etc/hosts
172.18.0.9 34f7b6e5472f
J'ai également essayé d'utiliser l'option 'traefik.frontend.whiteList.useXForwardedFor = true' sans succès.
traefik.toml
logLevel = "ERROR"
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.dashboard]
address = ":8080"
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[api]
entrypoint="dashboard"
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
[acme.dnsChallenge]
provider = "ovh"
delayBeforeCheck = 0
[[acme.domains]]
main = "*.domain.name"
[docker]
domain = "domain.name"
watch = true
network = "traefik_net"
docker-compose.yml
version: '3'
services:
traefik_proxy:
image: traefik:alpine
container_name: traefik
networks:
- traefik_net
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./acme.json:/acme.json
restart: unless-stopped
environment:
- OVH_ENDPOINT=ovh-eu
- OVH_APPLICATION_KEY=secretsecret
- OVH_APPLICATION_SECRET=secretsecret
- OVH_CONSUMER_KEY=secretsecret
labels:
- 'traefik.frontend.rule=Host:traefik.domain.name'
- 'traefik.port=8080'
- 'traefik.backend=traefik'
whoami:
image: containous/whoami
container_name: whoami
networks:
- traefik_net
labels:
- 'traefik.frontend.rule=Host:whoami.domain.name'
curl-client:
image: ubuntu
networks:
- traefik_net
command: sleep infinity
networks:
traefik_net:
external: true
Edit: Le nom de domaine est résolu en utilisant le dnsmasq.conf suivant:
domain-needed
expand-hosts
bogus-priv
interface=eno1
domain=domain.name
cache-size=1024
listen-address=127.0.0.1
bind-interfaces
dhcp-range=10.0.10.10,10.0.10.100,24h
dhcp-option=3,10.0.10.1
dhcp-authoritative
server=208.67.222.222
server=208.67.220.220
address=/domain.name/10.0.10.3
Après quelques recherches, il semble que Traefik ne soit pas le problème ici, l'impossibilité d'accéder à l'IP du conteneur est due à la façon dont Docker gère son réseau interne (voir les commentaires suivants: https://github.com/containous/traefik/issues/ 4352 et https://github.com/docker/for-mac/issues/180 ).
J'ai pu atteindre mon objectif de liste blanche des connexions internes en exécutant mon conteneur openvpn en mode nework_host, de cette façon, le client se voit attribuer une adresse IP directement par le système.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots