707 Jan. 25, 2024, 11:28 a.m.

Трудности с сетями Docker (swarm)

Задача: понять как работает сеть в docker.

На сервере в контейнерах находятся следующие проекты:

  • http(s) прокси сервис
  • сайт
  • еще один сайт
  • почтовый сервис
  • база данных

Возникла необходимость обеспечить данным ресурсам видимость реальных IP адресов клиентов для работы защит от перебора паролей и SFP системы на почтовом сервисе. По-возможности не хочется отказываться от использования docker swarm из-за его секретов, конфигов и других kubernetes подобных функций.

По-умолчанию Docker Swarm не дает контейнерам эту иформацию в силу особенностей балансировщика. Можно попробовать использовать сеть host, но при развертывании нескольких экземпляров контейнера получим конфликт портов и в добавок лишимся сетевой изоляции.

Также можно попробовать вынести proxy сервис в обычный docker run и подключить к сети docker swarm что даст результат, но IP адрес будет передаваться заголовком, что будет работать для сайтов, но не для email сервиса, который не понимает эти заголовки и не умеет работать с nginx прокси сервисом.

Можно попробовать HAProxy (в режиме контейнера), который не будет передевать данные IP адресов, а будет в качестве источника указывать себя.

При всём этом в kubernetes это делается путём установки externalTrafficPolicy: Local

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ...

Была предпринята попытка перехода на docker compose но как оказалось при хождении между подсетями теряется IP адрес источника

После всех проделанных попыток, изучения матчасти стало понятно что данную схему реализовать не возмножно. Для передачи IP источника нужно использовать proxyProtocol и заколовки. Для этого сервис должен понимать данную технологию чтобы с ней работать. К сожалению, простого решения нет.