я использую Shorewall на моем сервере так просто автономный брандмауэр и хотел бы использовать Докер также.
Используя контейнер Docker и его перенаправление порта docker устанавливает свои собственные правила / цепочки iptables, которые будут убиты при перезапуске shorewall. Так контейнер станет недоступен.
Кому-нибудь удалось сохранить / восстановить правила докеров при перезапуске Shorewall или у кого-нибудь есть другое решение?
Смотрите также:
Следующие изменения конфигурации должны обеспечить поток трафика между Docker и хостом Shorewall. Проверено на Shorewall 4.5.21.9, но должно применяться к самым последним версиям:
/etc/shorewall/shorewall.conf
Убедитесь, что переадресация IP включена (большинство элементов конфигурации имеют значение «Да / Нет», но этот параметр «Вкл.»):
IP_FORWARDING=On
/ и т. д. / shorewall / masq
Включите маскарадинг (NAT) для вашей частной сети Docker (если вы используете другую сеть, т.е. вы запускаете докер с помощью --bip=#.#.#.#/#
, затем измените соответственно). + Изменить eth0
к любому интерфейсу на хост-машине с внешним подключением:
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
/ и т.д. / shorewall / интерфейсы
Добавьте запись об интерфейсе, чтобы Shorewall знал, какой интерфейс dock
зона относится к:
#ZONE INTERFACE OPTIONS
dock docker0
/ etc / shorewall / зоны
Создайте новую зону; нота, docker
слишком длинный и вызовет ошибку «недопустимое имя зоны».
#ZONE INTERFACE
dock ipv4
/ etc / shorewall / policy
Вероятно, вы захотите разрешить контейнерам 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. Это:
Только что разобрался на своей коробке. Убедитесь, что в /etc/shorewall.conf есть:
IP_FORWARDING=Yes
Докер полагается на пересылку, и я установил для этой «марионетки» значение «Нет» на всех моих серверах.
Обновление: вам, вероятно, также необходимо замаскировать трафик, исходящий из докера, из вашего интерфейса 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
цепочку перед перезапуском, а затем восстановить ее снова. Я только что разместил сообщение с пример как это сделать, хотя уверен, что это далеко не единственный возможный способ.
Службу докера можно перезапустить, не влияя на работающие контейнеры, и запустить ее после перезапуска Shorewall для перезагрузки конкретных правил докера. Очевидно, будет короткое время, когда сеть с контейнером (-ами) будет нарушена.
Это верно, по крайней мере, для моих нескольких установок Archlinux.
Действие обновления не очищает iptable, поэтому, если вы просто хотите обновить правила или политики, вы можете просто запустить обновление вместо перезапуска:
sudo shorewall refresh
Очевидно, проблема все еще остается, если вам действительно нужно перезапустить Shorewall. Затем вам нужно перезапустить докер и повторно запустить контейнеры.
Один из возможных вариантов - запустить Docker с параметром --net = host, чтобы разрешить контейнерным приложениям доступ к сети хоста без переадресации IP и NAT.