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ź eth0
do 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 dock
odnosi się strefa:
#ZONE INTERFACE OPTIONS
dock docker0
/ etc / shorewall / zone
Utwórz nową strefę; Uwaga, docker
jest 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ą ACCEPT
politykę dla ruchu od fw
celu dock
, jeśli nie już otworzyć go z fw
celu 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.
IP_FORWARDING=Yes
i równieżIP_FORWARDING=True
pracować. Mam go na kilku routerach produkcyjnych, ale twoja odpowiedź jest znacznie jaśniejsza niż moja. Świetna robota./etc/shorewall/interfaces
.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:
źródło
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/masq
a 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,
ifconfig
aby 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ącifconfig
ponownie, aby wyszukać interfejsdocker0
.źródło
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.źródło
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.
źródło
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ć:
Oczywiście problem nadal występuje, jeśli naprawdę musisz zrestartować zaporę. Następnie musisz zrestartować okno dokowane i ponownie załadować kontenery.
źródło
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.
źródło