Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 4

Полный гайд по устранению ошибки «middleware does not exist» при интеграции crowdsec-bouncer-traefik-plugin в Traefik, Docker Compose и Kubernetes.

2026.10.05                  


Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 4Подробный гайд: Ошибка 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. Если плагин не может быть загружен

Плагин загружается при старте.

Возможные причины:

  1. Нет доступа в интернет.
  2. Используется pro*y, но переменные окружения не заданы.
  3. Неверная версия плагина.
  4. Неверное имя модуля.
  5. Файловая система контейнера доступна только для чтения.
  6. Нет прав на /plugins-storage.
  7. Несовместимость версии плагина с версией 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 от произвольных клиентов из интернета. Доверенные диапазоны должны быть только ваши.


Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта