Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 4
14. Если CrowdSec установлен на хосте, а Traefik в Docker
Если CrowdSec работает на хосте, а Traefik в контейнере, то из контейнера хост часто доступен как:
host.docker.internal
Тогда:
crowdsecLapiHost: host.docker.internal:8080
Для Linux в Docker Compose может понадобиться:
services:
traefik:
extra_hosts:
- "host.docker.internal:host-gateway"
Если вы используете localhost внутри контейнера, вы обращаетесь не к хосту, а к самому контейнеру Traefik.
15. Проверка версии плагина
Убедитесь, что версия плагина существует и совместима с вашей версией Traefik.
Например:
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: v0.3.2
Если версия указана неверно, Traefik не сможет загрузить плагин.
Проверить текущую версию Traefik:
docker compose exec traefik traefik version
Или:
docker exec traefik traefik version
Для Traefik v3 обычно нужны актуальные версии плагина. Для Traefik v2 могут требоваться более старые версии плагина.
16. Если плагин не может быть загружен
Плагин загружается при старте.
Возможные причины:
- Нет доступа в интернет.
- Используется pro*y, но переменные окружения не заданы.
- Неверная версия плагина.
- Неверное имя модуля.
- Файловая система контейнера доступна только для чтения.
- Нет прав на
/plugins-storage. - Несовместимость версии плагина с версией Traefik.
Если вы используете read-only root filesystem, добавьте volume:
services:
traefik:
volumes:
- traefik-plugins:/plugins-storage
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
traefik-plugins:
17. Пример для Kubernetes
Для Traefik v3 обычно используется:
apiVersion: traefik.io/v1alpha1
Для Traefik v2 часто используется:
apiVersion: traefik.containo.us/v1alpha1
Если вы используете неправильный apiVersion, Traefik может не увидеть Middleware.
Middleware для Traefik v3
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: crowdsec
namespace: traefik
spec:
plugin:
crowdsec:
enabled: true
logLevel: info
updateIntervalSeconds: 60
cacheExpirationSeconds: 60
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec.crowdsec.svc.cluster.local:8080
crowdsecLapiKey: "ВАШ_КЛЮЧ_БАУНСЕРА"
Если в статической конфигурации плагин называется crowdsec-bouncer, тогда:
spec:
plugin:
crowdsec-bouncer:
enabled: true
logLevel: info
updateIntervalSeconds: 60
cacheExpirationSeconds: 60
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec.crowdsec.svc.cluster.local:8080
crowdsecLapiKey: "ВАШ_КЛЮЧ_БАУНСЕРА"
IngressRoute
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: app
namespace: traefik
spec:
entryPoints:
- web
routes:
- match: Host(`app.example.com`)
kind: Rule
middlewares:
- name: crowdsec
namespace: traefik
services:
- name: app
port: 80
Если Middleware находится в другом namespace, нужно либо разрешить кросс-namespace, либо размещать ресурсы в одном namespace.
18. Статическая конфигурация плагина в Kubernetes
Плагин всё равно должен быть включён в статической конфигурации Traefik.
Например, через аргументы контейнера:
- "--experimental.plugins.crowdsec.modulename=github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec.version=vX.Y.Z"
Или через имя crowdsec-bouncer:
- "--experimental.plugins.crowdsec-bouncer.modulename=github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec-bouncer.version=vX.Y.Z"
Если используете Helm-чарт, можно добавить через additionalArguments, например:
additionalArguments:
- "--experimental.plugins.crowdsec.modulename=github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec.version=vX.Y.Z"
19. Настройка реального IP-адреса клиента
Чтобы CrowdSec мог банить реальных клиентов, Traefik должен получать корректный IP-адрес. Если перед Traefik есть балансировщик, CDN, настройте доверенные источники заголовков.
Например:
crowdsec:
plugin:
crowdsec:
enabled: true
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec:8080
crowdsecLapiKey: "ВАШ_КЛЮЧ"
forwardedHeadersTrustedIPs:
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
clientTrustedIPs:
- "10.0.0.0/8"
forwardedHeadersCustomName: X-Forwarded-For
Важно:
Не доверяйте X-Forwarded-For от произвольных клиентов из интернета. Доверенные диапазоны должны быть только ваши.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.