Докер и Shorewall

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

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

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

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

7 ответов

Решение

Следующие изменения конфигурации должны обеспечить поток трафика между 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; проверьте ваши другие зоны / политики / правила для этого.

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

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

Просто понял это на моей коробке. Убедитесь, что /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,

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

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

sudo shorewall refresh

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

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

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

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

Другие вопросы по тегам