Docker & Shorewall


17

Я використовую Shorewall на своєму сервері як простий окремий брандмауер і хотів би також використовувати Docker .

Використовуючи контейнер Docker і його перенаправлення порту, докер встановлює власні правила / ланцюги iptables, які будуть вбиті при повторному запуску брандмауера. Так контейнер стане недоступним .

Хтось встиг зберегти / відновити правила докера при перезапуску березня чи хтось інший вирішує?

Дивись також:

Відповіді:


19

Наступні зміни конфігурації повинні забезпечити потік трафіку між Docker та хостом Shorewall. Тестовано на Shorewall 4.5.21.9, але має застосовуватися до останніх версій:

/etc/shorewall/shorewall.conf

Переконайтеся, що переадресація IP-адреси включена (більшість елементів конфігурації - Так / Ні, але цей варіант "Увімкнено"):

IP_FORWARDING=On

/ etc / shorewall / masq

Увімкніть маскування (NAT) для вашої приватної мережі Docker (якщо ви використовуєте іншу мережу, тобто ви запускаєте докер --bip=#.#.#.#/#, тоді змініть відповідно). Змініть eth0будь-який інтерфейс на хост-машині із зовнішнім підключенням:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / інтерфейси

Додайте запис інтерфейсу, щоб Shorewall знав, до якого інтерфейсу dockвідноситься зона:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zone

Створити нову зону; Примітка, 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; перевірте свої інші зони / політики / правила для цього.


1
IP_FORWARDING=Yesі IP_FORWARDING=Trueпрацювати також. У мене це є на декількох виробничих маршрутизаторах, але ваша відповідь набагато чіткіша за мою. Чудова робота.
Aaron C. de Bruyn

Пробачте за моє невігластво - коли я перезавантажую береговий стін після додавання заданих правил, я отримую попередження про те, що док - це "ВПРАВЛЕННЯ ІНТЕРФЕЙС" ... і справді, читаючи вищесказане, мені незрозуміло, яким чином береговий стін може зробити висновок про зв'язок між 172.17 адреси та зона "док". Я пропускаю щось очевидне в тому, як працює берегова стіна?
Джон Клементс

Вибачте з цього приводу, я пропустив зміну у файлі інтерфейсів. Я відредагував відповідь, дивіться новий розділ /etc/shorewall/interfaces.
фаз

Дякую. Він добре працює також з shorewall 5 (що відомо докер), щоб хост приєднався до своїх контейнерів.
Драсиль

налаштування маски дуже важливі, інакше докер-контейнер не зможе отримати доступ до іншого контейнера за допомогою зовнішнього IP - він заблокується
Eugen Mayer

6

Оскільки Docker представив функцію ізоляції мережі, інших рішень, згаданих тут, більше не вистачає, якщо ви хочете використовувати користувацькі мережі. Shorewall 5.0.6 представляє підтримку Docker, включаючи мережі Docker. Це:

  • Дозволяє запускати / зупиняти / перезавантажувати березня та докер у будь-якому порядку
  • Уникає необхідності підтримки сценарію розширення

2

Просто зрозумів це на своїй коробці. Переконайтесь, що /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.


2

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


0

Служба докера може бути перезапущена, не впливаючи на запущені контейнери, і її можна запустити після перезавантаження Shorewall для перезавантаження конкретних правил докера. Очевидно, буде короткий час, коли мережа до контейнера (ив) буде порушена.

Це справедливо принаймні для моїх кількох встановлень Archlinux


0

Дія оновлення не очищає iptable, тому це, якщо ви просто хочете оновити правила чи правила, ви можете просто запустити оновлення замість перезавантаження:

sudo shorewall refresh

Очевидно, проблема все ще залишається, якщо вам дійсно потрібно перезапустити берегову стіну. Потім вам доведеться перезапустити докер і відновити контейнери.


0

Один з можливих варіантів - запустити Docker за допомогою параметра --net = хост, щоб дозволити контейнерному застосуванню доступу до хост-мережі без ip переадресації та NAT.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.