Докер и 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.