I've been banging by head on this for a couple days now. It's probably something I'm doing wrong but can't figure it out after searching the nets and a bunch of testing.
Trying to get the traefik dashboard accessible through IP only from my local LAN network but traefik see's the host address as one of the docker network connecting to the socket proxy. Not sure how to get it to see the traffic as coming from my host. It works fine without the middleware ipallowlist or if I add the docker network 172.0.0.0/8 but that's not really a solution.
Hoping someone has some thoughts on this.
compose.yaml
name: reverse-proxy
services:
traefik:
image: traefik:${TRAEFIK_TAG}
container_name: traefik
environment:
- TZ=${TIMEZONE}
# Logs
- TRAEFIK_ACCESSLOG=true
- TRAEFIK_ACCESSLOG_FORMAT=json
- TRAEFIK_ACCESSLOG_FILEPATH=/var/log/traefik/access.log
- TRAEFIK_LOG_LEVEL=DEBUG
- TRAEFIK_LOG_FORMAT=json
- TRAEFIK_LOG_FILEPATH=/var/log/traefik/traefik.log
# Providers
- TRAEFIK_PROVIDERS_DOCKER=true
- TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
- TRAEFIK_PROVIDERS_DOCKER_ENDPOINT=tcp://traefik-socket-proxy:2375
- TRAEFIK_PROVIDERS_FILE=true
- TRAEFIK_PROVIDERS_FILE_DIRECTORY=/etc/traefik/dynamic-config/
- TRAEFIK_PROVIDERS_FILE_WATCH=true
# Entrypoints
- TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
- TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure
- TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
- TRAEFIK_ENTRYPOINTS_WEBSECURE_HTTP_TLS=true
- TRAEFIK_ENTRYPOINTS_WEBSECURE_HTTP3=true
- TRAEFIK_ENTRYPOINTS_VPN_ADDRESS=:51820/udp
# Let's Encrypt
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE=true
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE_ACME_DNSCHALLENGE=true
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE_ACME_DNSCHALLENGE_PROVIDER=cloudflare
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE_ACME_DNSCHALLENGE_RESOLVERS=1.1.1.1
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE_ACME_EMAIL=${TRAEFIK_CF_ACME_EMAIL}
- TRAEFIK_CERTIFICATESRESOLVERS_CLOUDFLARE_ACME_STORAGE=/letsencrypt/cf-acme.json
- CF_ZONE_API_TOKEN_FILE=/run/secrets/cf-zone-api-token
- CF_DNS_API_TOKEN_FILE=/run/secrets/cf-dns-api-token
# API
- TRAEFIK_API_DASHBOARD=true
- TRAEFIK_API_DISABLEDASHBOARDAD=true
secrets:
- cf-zone-api-token
- cf-dns-api-token
ports:
- 80:80
- 443:443
- 51820:51820/udp
networks:
- traefik-socket-proxy-net
- reverse_proxy-portainer
volumes:
- traefik_logs:/var/log/traefik
- traefik_config:/etc/traefik/
- ./dynamic-config:/etc/traefik/dynamic-config
- traefik_letsencrypt:/letsencrypt
restart: unless-stopped
depends_on:
- traefik-socket-proxy
traefik-socket-proxy:
image: wollomatic/socket-proxy:${WOLLOMATIC_SOCKET_PROXY_TAG}
container_name: traefik-socket-proxy
environment:
- TZ=${TIMEZONE}
- SP_LOGLEVEL=DEBUG
- SP_LISTENIP=0.0.0.0
- SP_ALLOWFROM=traefik
- SP_WATCHDOGINTERVAL=3600
- SP_STOPONWATCHDOG=true
- SP_SHUTDOWNGRACETIME=5
#Rules:
- SP_ALLOW_GET=.*
- SP_ALLOW_HEAD=.*
- SP_ALLOW_POST=.*
- SP_ALLOW_PUT=.*
- SP_ALLOW_PATCH=.*
- SP_ALLOW_DELETE=.*
- SP_ALLOW_CONNECT=.*
- SP_ALLOW_TRACE=.*
- SP_ALLOW_OPTIONS=.*
user: 65535:996
networks:
- traefik-socket-proxy-net
volumes:
- ${SOCKET_PATH}:/var/run/docker.sock:ro
labels:
- traefik.enable=false
restart: unless-stopped
volumes:
traefik_logs:
name: traefik_logs
traefik_config:
name: traefik_config
traefik_letsencrypt:
name: traefik_letsencrypt
networks:
traefik-socket-proxy-net:
name: traefik-socket-proxy-net
secrets:
cf-zone-api-token:
file: ${SECRETS_PATH}/cf-zone-api-token.txt
cf-dns-api-token:
file: ${SECRETS_PATH}/cf-dns-api-token.txt
traefik-dynamic-config.yaml
http:
routers:
traefik:
rule: Host(`192.168.86.53`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
entrypoints: websecure
middlewares: localnet-ipallowlist@file
service: api@internal
localnet-ipallowlist.yaml
# Allow Local Network IPs
http:
middlewares:
localnet-ipallowlist:
ipAllowList:
sourceRange:
- 192.168.86.0/24 #LAN
traefik.log
{"level":"debug","providerName":"file","time":"2025-02-19T16:31:11-06:00","caller":"github.com/traefik/traefik/v3/pkg/server/configurationwatcher.go:127","message":"Skipping unchanged configuration"}
{"level":"debug","providerName":"file","config":{"http":{"routers":{"traefik":{"entryPoints":["websecure"],"middlewares":["localnet-ipallowlist@file"],"service":"api@internal","rule":"Host(`192.168.86.53`) \u0026\u0026 (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"}},"middlewares":{"cloudflare-ipallowlist":{"ipAllowList":{"sourceRange":["173.245.48.0/20","103.21.244.0/22","103.22.200.0/22","103.31.4.0/22","141.101.64.0/18","108.162.192.0/18","190.93.240.0/20","188.114.96.0/20","197.234.240.0/22","198.41.128.0/17","162.158.0.0/15","104.16.0.0/13","104.24.0.0/14","172.64.0.0/13","131.0.72.0/22"]}},"localnet-ipallowlist":{"ipAllowList":{"sourceRange":["192.168.86.0/24"]}}}},"tcp":{},"udp":{},"tls":{}},"time":"2025-02-19T16:31:25-06:00","caller":"github.com/traefik/traefik/v3/pkg/server/configurationwatcher.go:227","message":"Configuration received"}
{"level":"debug","providerName":"file","time":"2025-02-19T16:31:25-06:00","caller":"github.com/traefik/traefik/v3/pkg/server/configurationwatcher.go:127","message":"Skipping unchanged configuration"}
{"level":"debug","time":"2025-02-19T16:31:28-06:00","caller":"github.com/traefik/traefik/v3/pkg/tls/tlsmanager.go:228","message":"Serving default certificate for request: \"\""}
{"time":"2025-02-19T16:31:28-06:00","caller":"log/log.go:245","level":"debug","message":"http: TLS handshake error from 172.20.0.1:50328: remote error: tls: unknown certificate"}
{"level":"debug","time":"2025-02-19T16:31:31-06:00","caller":"github.com/traefik/traefik/v3/pkg/tls/tlsmanager.go:228","message":"Serving default certificate for request: \"\""}
{"time":"2025-02-19T16:31:31-06:00","caller":"log/log.go:245","level":"debug","message":"http: TLS handshake error from 172.20.0.1:44526: remote error: tls: unknown certificate"}
{"level":"debug","time":"2025-02-19T16:31:31-06:00","caller":"github.com/traefik/traefik/v3/pkg/tls/tlsmanager.go:228","message":"Serving default certificate for request: \"\""}
{"time":"2025-02-19T16:31:31-06:00","caller":"log/log.go:245","level":"debug","message":"http: TLS handshake error from 172.20.0.1:44534: remote error: tls: unknown certificate"}
{"level":"debug","time":"2025-02-19T16:31:31-06:00","caller":"github.com/traefik/traefik/v3/pkg/tls/tlsmanager.go:228","message":"Serving default certificate for request: \"\""}
{"level":"debug","middlewareName":"localnet-ipallowlist@file","middlewareType":"IPAllowLister","time":"2025-02-19T16:31:31-06:00","caller":"github.com/traefik/traefik/v3/pkg/middlewares/ipallowlist/ip_allowlist.go:79","message":"Rejecting IP 172.20.0.1: \"172.20.0.1\" matched none of the trusted IPs"}
access.log
{"ClientAddr":"172.20.0.1:52804","ClientHost":"172.20.0.1","ClientPort":"52804","ClientUsername":"-","DownstreamContentSize":19,"DownstreamStatus":404,"Duration":45736,"GzipRatio":0,"OriginContentSize":0,"OriginDuration":0,"OriginStatus":0,"Overhead":45736,"RequestAddr":"192.168.86.53","RequestContentSize":0,"RequestCount":1,"RequestHost":"192.168.86.53","RequestMethod":"GET","RequestPath":"/favicon.ico","RequestPort":"-","RequestProtocol":"HTTP/2.0","RequestScheme":"https","RetryAttempts":0,"StartLocal":"2025-02-19T15:59:53.457346343-06:00","StartUTC":"2025-02-19T21:59:53.457346343Z","TLSCipher":"TLS_AES_128_GCM_SHA256","TLSVersion":"1.3","entryPointName":"websecure","level":"info","msg":"","time":"2025-02-19T15:59:53-06:00"}
docker network ls
NETWORK ID NAME DRIVER SCOPE
74c12a3705c3 bridge bridge local
ef886fcdb8b6 host host local
79370c947a6e none null local
af819c0ae406 portainer-socket-proxy-net bridge local
8cf0ff28a5f6 reverse_proxy-portainer bridge local
94f1aaed69bc traefik-socket-proxy-net bridge local
docker network inspect traefik-socket-proxy-net
[
{
"Name": "traefik-socket-proxy-net",
"Id": "94f1aaed69bc3bca330be912e1addd98faa8933aacf052b00c30c0038d4d8a24",
"Created": "2025-02-13T16:37:07.405864845-06:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.20.0.0/16",
"Gateway": "172.20.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"4888db2b6ea85cca71a58a0dfeb8ec14c402d5e8de39e671b31ee544ea53f1c3": {
"Name": "traefik-socket-proxy",
"EndpointID": "b0d554dcfe153479ab0b36f4bdde09200432e43fe700262779a2ff5c63d84843",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/16",
"IPv6Address": ""
},
"a864d69a5501673fcc28c0352716d671b9e94bf133a9cb4a298015461cfceeac": {
"Name": "traefik",
"EndpointID": "c510045757991c65731aedb3d8e1edef373a9bb1f296349d22c6840be7340dbf",
"MacAddress": "02:42:ac:14:00:03",
"IPv4Address": "172.20.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.config-hash": "a25e937ba6dbf14fa6939e07c5ba1d13a0998b96adea5242f17e946f6e56cdd9",
"com.docker.compose.network": "traefik-socket-proxy-net",
"com.docker.compose.project": "reverse-proxy",
"com.docker.compose.version": "2.32.4"
}
}
]