Traefik – фильтр части URL

Вопрос или проблема

У меня есть следующая ситуация: один Docker Host с несколькими проектами CMS и работающим Traefik.
Я хотел бы отфильтровать URL-адрес бэкенда от публичных IP-адресов, так как он должен быть доступен только с частных IP-адресов.

публично доступно:
https://www.project.com/xyz
https://www.project.com/abc

ограничено только внутренними IP:
https://www.project.com/backend

Могу ли я реализовать это с помощью белого списка IP и, например, 2 роутеров – 1 для публичного доступа и 1 для доступа к бэкенду?

Я пробовал что-то вроде:

  # Роутер бэкенда (ограниченный доступ)
  - "traefik.http.routers.project-backend.rule=Host(`${DOMAINNAME}`) && PathPrefix(`/backend`)"
  - "traefik.http.routers.project-backend.entrypoints=https"
  - "traefik.http.routers.project-backend.tls=true"
  - "traefik.http.routers.project-backend.middlewares=backend-ipwhitelist"
  - "traefik.http.routers.project-backend.priority=100"

Но фильтр не сработал – к бэкенду все равно можно было получить доступ.

Есть какие-нибудь предложения?

Ответ или решение

Конфигурация Traefik для фильтрации части URL может показаться сложной задачей, особенно когда речь идет о доступе к ресурсам, ограниченным определенными IP-адресами. В вашем случае вы хотите сделать так, чтобы бэкенд был доступен только из внутренних IP-диапазонов, в то время как другие CMS-проекты оставались открытыми для публичного доступа. Давайте рассмотрим, как это можно реализовать.

1. Настройка маршрутизаторов

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

Маршрутизатор для публичного доступа:

# Public Router
- "traefik.http.routers.project-public.rule=Host(`${DOMAINNAME}`) && PathPrefix(`/xyz`) || PathPrefix(`/abc`)"
- "traefik.http.routers.project-public.entrypoints=https"
- "traefik.http.routers.project-public.tls=true"

Маршрутизатор для бэкенда:

# Backend Router (Restricted Access)
- "traefik.http.routers.project-backend.rule=Host(`${DOMAINNAME}`) && PathPrefix(`/backend`)"
- "traefik.http.routers.project-backend.entrypoints=https"
- "traefik.http.routers.project-backend.tls=true"
- "traefik.http.routers.project-backend.middlewares=backend-ipwhitelist"

2. Работа с Middleware для IP Whitelist

Чтобы ограничить доступ к бэкенду определенными IP-адресами, вы должны использовать middleware для IP-ограничений. Пример настройки такого middleware может выглядеть следующим образом:

# IP Whitelist Middleware
- "traefik.http.middlewares.backend-ipwhitelist.ipwhitelist.sourcerange=192.168.0.0/16,10.0.0.0/8"

В данном случае sourcerange должен содержать ваши внутренние диапазоны IP-адресов. Замените 192.168.0.0/16 и 10.0.0.0/8 на актуальные диапазоны, используемые в вашей сети.

3. Проверка конфигурации

После внесения изменений обязательно выполните следующие шаги:

  • Перезагрузите Traefik: Убедитесь, что все изменения применены и Traefik использует обновленную конфигурацию.
  • Проверьте логи: Включите логирование в Traefik для отслеживания запросов и понимания, почему некоторые запросы могут проходить через фильтры.
  • Тестирование: Из разных сетей, как внутренних, так и публичных, протестируйте доступ к вашим маршрутам.

4. Заключение

С помощью двух маршрутизаторов и соответствующего middleware вы сможете эффективно управлять доступом к различным частям вашего приложения через Traefik. Помните, что безопасность – это не только хорошая структура маршрутов, но и регулярные проверки и аудит ваших настроек. Надеюсь, эта информация поможет вам успешно настроить доступ к вашему бэкенду. Если у вас возникнут дополнительные вопросы, смело обращайтесь за помощью.

Оцените материал
Добавить комментарий

Капча загружается...