Вопрос или проблема
У меня есть следующая ситуация: один 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. Помните, что безопасность – это не только хорошая структура маршрутов, но и регулярные проверки и аудит ваших настроек. Надеюсь, эта информация поможет вам успешно настроить доступ к вашему бэкенду. Если у вас возникнут дополнительные вопросы, смело обращайтесь за помощью.