Рейтинг:2

Docker: изолируйте составные стеки на сетевом уровне, позволяя Traefik использовать обратный прокси для одной службы.

флаг de

Я пытаюсь обезопасить контейнеры в своей домашней лаборатории.

Основная цель:

  • изоляция nginxA и nginxB, поэтому они не могут общаться друг с другом через 172.17.0.1 (например, предотвращение nginxA от достижения nginxB с помощью 172.17.0.1:5001)
  • изоляция nginxA и nginxB с локального хоста, что делает их доступными исключительно через traefik
  • Разрешение nginxA поговорить с nginxA_DB, которые находятся в одном стеке, но не позволяют другим контейнерам или traefik общаться с nginxA_DB

Каждый стек докеров имеет службу nginx/apache, порт которой отображается в docker-compose следующим образом:

docker-compose-nginxA.yml:

сети:
  внутренний:
    IPAM:
      конфигурация:
        - подсеть: 10.0.0.0/29

...СНИП...

нгинксА:
  сети:
    внутренний:
      ipv4_адрес: 10.0.0.2
  порты:
    - "172.17.0.1:5000:80"

docker-compose-nginxB.yml:

сети:
  внутренний:
    IPAM:
      конфигурация:
        - подсеть: 10.0.0.8/29

...СНИП...

нгинксБ:
  сети:
    внутренний:
      ipv4_адрес: 10.0.0.10
  порты:
    - "172.17.0.1:5001:80"

Сделать эти услуги доступными только через локальный хост (172.17.0.1) или траефик,

Traefik также находится на той же машине со следующей конфигурацией:

http:

  маршрутизаторы:

    нгинксА:
     Точки входа:
       - сеть
     сервис: nginxA

    нгинксБ:
     Точки входа:
       - сеть
     сервис: nginxB


...СНИП...

  Сервисы:

    нгинксА:
      loadBalancer:
        серверы:
          - адрес: http://172.17.0.1:5000

    нгинксБ:
      loadBalancer:
        серверы:
          - адрес: http://172.17.0.1:5001

Идея заключалась в том, чтобы соединить все контейнеры в одном /24 сеть с traefik, не раскрывая никаких портов через компоновку, но единая сеть traefik не изолирует контейнеры друг от друга, только снаружи.

Другая идея состояла в том, чтобы создать /31 network для каждого контейнера и объединить все сети traefik, но я не уверен, что это сделает изоляцию, как задумано. например.

нгинксА:
  сети:
    внутренний:
      ipv4_адрес: 10.0.0.2 #/29
    nginxA-трафик:
      ipv4_адрес: 10.50.0.1 #/31

трафик:
  сети:
    nginxA-трафик:
    nginxB-трафик:
  ...

Спасибо, что дочитали до этого места! У вас есть идеи, как это можно сделать?

Рейтинг:0
флаг es

Вы на правильном пути. Как и в вашем последнем примере, вы хотите создать отдельную сеть для каждого пути связи между двумя контейнерами. Все это может быть /31или /29s или все, что вы хотите, если подсети разные.

Пример:

  • nginxA-traefik подключение nginxA и траефик
  • nginxB-traefik подключение nginxB и траефик
  • nginxA-nginxA_DB подключение nginxA и nginxA_DB

Вы не должны делать сопоставление портов на нгинкс контейнеры с траефик будет общаться с ними напрямую через сети докеров. Это позволит каждому нгинкс контейнер для связи с траефик (и наоборот), но они не могут общаться друг с другом.


Однако! Это не очень хорошо масштабируется, потому что вам придется создавать/управлять одной сетью для каждой службы, подключенной к traefik, что быстро станет громоздким. Лучшим способом было бы создать единую сеть для всех сервисов, связанных с traefik (например, traefik_public), подключите все свои сервисные контейнеры (т. nginx_A, nginx_B и все остальное) в эту сеть и добавить некоторые правила в iptables разрешить трафик только в/из траефик.

Я написал довольно простой контейнерный брандмауэр, который позаботится о iptables правила для вас автоматически: https://github.com/kaysond/trafficjam Вы просто указываете сеть, которую хотите защитить (traefik_public) и контейнер для обеспечения связи с/от (например, предок = traefik: последний), а об остальном позаботится он!

st00nks avatar
флаг de
Вы настоящий чемпион, я думаю, что ваш метод намного лучше моего решения (в итоге я создал отдельные сети для 20 сервисов). Я проверю это и, возможно, все переформатирую. Спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.