Docker i Shorewall

17

Używam Shorewall na moim serwerze jako prostej autonomicznej zapory ogniowej i chciałbym również używać Dockera .

Korzystając z kontenera Docker i dokera przekierowania portów, konfiguruje własne reguły / łańcuchy iptables, które zostaną zabite, jeśli zostanie ponownie uruchomiona zapora sieciowa. Pojemnik stanie się więc niedostępny .

Czy komuś udało się zapisać / przywrócić reguły dokera po ponownym uruchomieniu zapory lub czy ktoś ma inne obejście?

Zobacz też:

Jaltek
źródło

Odpowiedzi:

19

Poniższe zmiany konfiguracji powinny zapewnić przepływ ruchu między Dockerem a hostem Shorewall. Testowany na Shorewall 4.5.21.9, ale powinien mieć zastosowanie do najnowszych wersji:

/etc/shorewall/shorewall.conf

Upewnij się, że przekazywanie IP jest włączone (większość elementów konfiguracji to Tak / Nie, ale ten jest włączony):

IP_FORWARDING=On

/ etc / shorewall / masq

Włącz maskaradowanie (NAT) dla swojej prywatnej sieci Docker (jeśli używasz innej sieci, tzn. Uruchamiasz doker za pomocą --bip=#.#.#.#/#, a następnie odpowiednio zmieniasz). Przejdź eth0do dowolnego interfejsu na hoście z łącznością zewnętrzną:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / interfaces

Dodaj pozycję interfejsu, aby Shorewall wiedział, do którego interfejsu dockodnosi się strefa:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zone

Utwórz nową strefę; Uwaga, dockerjest za długi i spowoduje błąd „nieprawidłowa nazwa strefy”.

#ZONE   INTERFACE
dock    ipv4

/ etc / shorewall / policy

Prawdopodobnie chcesz zezwolić kontenerom Docker na komunikowanie się z hostem i Internetem, więc jest to dobry punkt wyjścia:

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

Konieczne może być również podobną ACCEPTpolitykę dla ruchu od fwcelu dock, jeśli nie już otworzyć go z fwcelu all.

Można to dokręcić dalej w politycznych lub zasad plików, ile potrzeba. Na przykład powyższe nie zezwala wyraźnie na ruch zewnętrzny do twoich kontenerów Docker; sprawdź w tym celu inne strefy / zasady / reguły.

fazy
źródło
1
IP_FORWARDING=Yesi również IP_FORWARDING=Truepracować. Mam go na kilku routerach produkcyjnych, ale twoja odpowiedź jest znacznie jaśniejsza niż moja. Świetna robota.
Aaron C. de Bruyn
Wybacz moją ignorancję - kiedy ponownie uruchamiam zaporę po dodaniu podanych reguł, pojawia się ostrzeżenie, że stacja dokująca to „PUSTY INTERFEJS”… i rzeczywiście, czytając powyższe, nie jest dla mnie jasne, w jaki sposób zapora może wywnioskować połączenie między 172,17 adresów i strefa „dok”. Czy brakuje mi czegoś oczywistego na temat działania ściany brzegowej?
John Clements
Przepraszam za to, że przegapiłem zmianę w pliku interfejsów. Zredagowałem odpowiedź, zobacz nową sekcję /etc/shorewall/interfaces.
fazy
Dziękuję Ci. Działa również z przybrzeżną ścianą 5 (która jest świadoma dokerów), aby host dołączał do swoich kontenerów.
Drasill,
ustawienia maskowania są bardzo ważne, w przeciwnym razie kontener dokujący nie będzie mógł uzyskać dostępu do innego kontenera za pomocą zewnętrznego adresu IP - zostanie zablokowany
Eugen Mayer
6

Ponieważ Docker wprowadził funkcję izolacji sieci, inne wymienione tutaj rozwiązania nie są już wystarczające, jeśli chcesz korzystać z sieci niestandardowych. Shorewall 5.0.6 wprowadza obsługę Docker, w tym sieci Docker. To:

  • Pozwala na uruchomienie / zatrzymanie / ponowne uruchomienie nabrzeża i dokera w dowolnej kolejności
  • Unika potrzeby utrzymywania skryptu rozszerzenia
linuxhackerman
źródło
2

Właśnie wymyśliłem to na moim pudełku. Upewnij się, że /etc/shorewall.conf ma:

IP_FORWARDING=Yes

Docker polega na przesyłaniu dalej, a ja rozstawiłem, że „marionetka” ustawia go na „Nie” na wszystkich moich serwerach.

Aktualizacja: Prawdopodobnie musisz również maskować ruch przychodzący z dokowania z interfejsu WAN.

Edytuj, /etc/shorewall/masqa potrzebujesz linii podobnej do:

br0 172.17.0.0/12

W tym przypadku moim interfejsem WAN jest br0 (most), ale twój prawdopodobnie będzie podobny do eth0. (Użyj, ifconfigaby zobaczyć swoje interfejsy i ich adresy IP). Na moim komputerze doker używa 172.17.0.0/24, który jest prywatnym zakresem adresów RFC1918. Może się to różnić w innych systemach, ale możesz zobaczyć zasięg, używając ifconfigponownie, aby wyszukać interfejs docker0.

Aaron C. de Bruyn
źródło
2

Możesz upewnić się, że zestaw reguł Docker przetrwa restart systemu brzegowego, tworząc skrypty rozszerzeń, które zapisują DOCKERłańcuch przed restartem, a następnie przywracają go później. Właśnie opublikowałem post z przykładem tego, jak to zrobić , chociaż jestem pewien, że nie jest to jedyna możliwa metoda.

womble
źródło
0

Usługę dokowania można zrestartować bez wpływu na działające kontenery i można ją uruchomić po ponownym uruchomieniu Shorewall w celu przeładowania określonych reguł dokera. Oczywiście będzie krótki czas, w którym zakłóci się łączenie sieci z kontenerami.

Dotyczy to przynajmniej moich kilku instalacji Archlinux.

atom
źródło
0

Odświeżanie nie czyści iptable, więc jeśli chcesz tylko odświeżyć reguły lub zasady, możesz po prostu uruchomić odświeżanie zamiast restartować:

sudo shorewall refresh

Oczywiście problem nadal występuje, jeśli naprawdę musisz zrestartować zaporę. Następnie musisz zrestartować okno dokowane i ponownie załadować kontenery.

Lenybernard
źródło
0

Jedną z możliwych opcji jest uruchomienie Dockera z opcją --net = host, aby umożliwić dostęp do kontenerowej sieci hosta bez przekazywania adresu IP i NAT.

DukeLion
źródło