Докер и Shorewall


17

Я использую Shorewall на своем сервере в качестве простого автономного брандмауэра и хотел бы также использовать Docker .

Используя контейнер Docker и его перенаправление портов, Docker устанавливает собственные правила / цепочки iptables, которые будут уничтожены при перезапуске shorewall. Таким образом, контейнер станет недоступным .

Кому-нибудь удалось сохранить / восстановить правила докера после перезагрузки shorewall или у кого-нибудь есть другой обходной путь?

Смотрите также:

Ответы:


19

Следующие изменения конфигурации должны обеспечить поток трафика между Docker и хостом Shorewall. Протестировано на Shorewall 4.5.21.9, но должно применяться к самым последним версиям:

/etc/shorewall/shorewall.conf

Убедитесь, что IP-переадресация включена (большинство параметров конфигурации - Да / Нет, но этот «Вкл»)

IP_FORWARDING=On

/ И т.д. / Shorewall / MASQ

Включите маскирование (NAT) для вашей частной сети Docker (если вы используете другую сеть, то есть запускаете Docker --bip=#.#.#.#/#, затем измените ее соответствующим образом). Перейдите eth0на любой интерфейс на хост-машине с внешним подключением:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ И т.д. / Shorewall / интерфейсы

Добавьте запись интерфейса, чтобы Shorewall знал, к какому интерфейсу dockотносится зона:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ и т.д. / Shorewall / зон

Создать новую зону; обратите внимание, dockerон слишком длинный и вызовет ошибку «недопустимое имя зоны».

#ZONE   INTERFACE
dock    ipv4

/ И т.д. / Shorewall / политика

Возможно, вы захотите разрешить контейнерам Docker общаться с хост-машиной и Интернетом, так что это хорошая отправная точка:

#SOURCE         DEST            POLICY
# ...(other policies)...
dock            all             ACCEPT
# ...(other policies, catch-all)...

Вам также может понадобиться аналогичную ACCEPTполитику в отношении трафика , fwчтобы dock, если вы уже не открыть его с fwк all.

При необходимости вы можете усилить это в файлах политики или правил . Например, вышеописанное явно не позволяет внешнему трафику достигать ваших контейнеров Docker; проверьте ваши другие зоны / политики / правила для этого.


1
IP_FORWARDING=Yesи IP_FORWARDING=Trueработать так же. У меня он есть на нескольких производственных роутерах, но ваш ответ гораздо яснее моего. Отличная работа.
Аарон С. де Брюн,

Прости мое невежество - когда я перезапускаю shorewall после добавления данных правил, я получаю предупреждение о том, что док-станция является «ПУСТЫМ ИНТЕРФЕЙСОМ» ... и действительно, читая выше, мне не ясно, как shorewall может определить связь между 172.17 адресов и зона «док». Я что-то упускаю из виду, как работает shorewall?
Джон Клементс

К сожалению об этом, я пропустил изменение в файле интерфейсов. Я отредактировал ответ, см. Новый раздел /etc/shorewall/interfaces.
fazy

Спасибо. Это хорошо работает и с shorewall 5 (который поддерживает докер), чтобы хост подключался к своим контейнерам.
Drasill

настройки masq очень важны, иначе docker-контейнер не сможет получить доступ к другому контейнеру с помощью внешнего IP - он будет заблокирован
Eugen Mayer

6

Поскольку Docker представил свою функцию изоляции сети, других упомянутых здесь решений уже недостаточно, если вы хотите использовать пользовательские сети. В Shorewall 5.0.6 добавлена поддержка Docker, включая сети Docker. Эта:

  • Позволяет запускать / останавливать / перезапускать shorewall и докер в любом порядке
  • Избегает необходимости поддерживать скрипт расширения

2

Просто понял это на моей коробке. Убедитесь, что /etc/shorewall.conf имеет:

IP_FORWARDING=Yes

Docker полагается на переадресацию, и я определил, что «puppet» устанавливает «Нет» на всех моих серверах.

Обновление: Вам, вероятно, также нужно маскировать трафик, исходящий из докера, через интерфейс WAN.

Отредактируйте /etc/shorewall/masqи вам понадобится строка, похожая на:

br0 172.17.0.0/12

В этом случае мой интерфейс WAN на самом деле br0 (мост), но ваш, вероятно, будет что-то вроде eth0. (Используйте, ifconfigчтобы увидеть ваши интерфейсы и их IP-адреса). На моей машине докер использует 172.17.0.0/24, который является частным адресным диапазоном RFC1918. Это может отличаться в других системах, но вы можете увидеть диапазон, используя ifconfigеще раз для поиска интерфейса docker0.


2

Вы можете убедиться, что набор правил Docker переживет перезапуск shorewall, создав сценарии расширения, которые сохранят DOCKERцепочку до перезапуска, а затем восстановят ее снова после. Я только что опубликовал пост с примером того, как это сделать , хотя я уверен, что это далеко не единственный возможный метод.


0

Службу Docker можно перезапустить, не влияя на работающие контейнеры, и ее можно запустить после перезапуска Shorewall, чтобы перезагрузить определенные правила докера. Очевидно, будет короткое время, когда соединение с контейнерами будет нарушено.

Это верно по крайней мере на моих нескольких установках Archlinux.


0

Действие обновления не очищает iptable, поэтому, если вы просто хотите обновить правила или политики, вы можете просто запустить обновление вместо перезапуска:

sudo shorewall refresh

Очевидно, что проблема все еще остается, если вам действительно нужно перезапустить shorewall. Затем вам нужно перезапустить докер и повторно запустить ваши контейнеры.


0

Один из возможных вариантов - запустить Docker с параметром --net = host, чтобы разрешить контейнеризованному приложению доступ к сети хоста без пересылки ip и NAT.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.