Mam następującą konfigurację:
- Host CentOS z uruchomioną usługą dokowania
- Zdefiniowana przez użytkownika sieć mostu dokującego
- 2 kontenery doków podłączone do tej zdefiniowanej przez użytkownika sieci mostów
- Instalacja OpenVPN (obecnie uruchomiona na hoście. Może również działać w kontenerze dokera)
- Niektórzy klienci podłączeni do OpenVPN
Jak mogę pozwolić kontenerom dokerów w sieci mostów dokerów komunikować się z klientami openvpn w sieci tun0?
Chciałbym mieć możliwość komunikacji opartej na tcp między dokerem 1 (10.10.0.3) a klientami podłączonymi do VPN (zakres 172.19.0.x) w przejrzysty sposób.
Co muszę skonfigurować po stronie dokera (sieć / iptables / ...) i na hoście (iptables?)
tap
, do cholerytun
, pracowałem nad tym jeszcze przez 12 godzin, ale bez powodzenia.Odpowiedzi:
Kontekst
Korzystałem z bardzo dobrego kontenera Docker od Kyle'a Manny ( https://github.com/kylemanna/docker-openvpn ). Używam tak zwanej dokumentacji „paranoicznej”, aby skonfigurować mój serwer OpenVPN, ale moim zdaniem powinna to być standardowa metoda, a nie paranoiczna.
Konfiguracja
Aby umożliwić dwukierunkowe połączenie między wybranymi kontenerami Docker a klientami VPN, musisz utworzyć sieć Docker, do której chcesz dołączyć kontener, do którego klienci VPN powinni mieć dostęp. Serwer VPN będzie jednym z tych kontenerów.
Serwer sieci VPN powinny mieć
client-to-client
,topology subnet
,dev tun0
(lub innego urządzenia TUN) ipush "route <docker net IP> <docker net mask>"
skonfigurowany.Host serwera VPN powinien być skonfigurowany do obsługi przekazywania pakietów IP z jednej podsieci do drugiej. Oznacza to ustawienie sysctl ip_forward na 1 (tak powinno być, jeśli masz zainstalowaną Docker), zezwalanie pakietom z urządzenia tun na przechodzenie przez łańcuch iptables FORWARD i ustawianie właściwego routingu. Można to streścić za pomocą następujących poleceń:
W każdym razie oto opcje, których użyłem do skonfigurowania serwera:
Powinno to wygenerować plik konfiguracyjny serwera podobny do:
Konkretny przykład
Podam teraz konkretny przykład. W tym przykładzie uruchomię wyżej wspomniany serwer OpenVPN w Docker na hoście vpn.example.com. Ten kontener jest dołączony do sieci Docker docker-net-vpn. Oto polecenia (w tym przykładzie generuję konfigurację serwera bezpośrednio na serwerze i pomijam generowanie CA, proszę postępować zgodnie z dokumentacją paranoiczną powyższego projektu):
Pierwsze polecenie tworzy nową dedykowaną sieć Docker, która definiuje nową podsieć. Podłączymy serwer OpenVPN do tej sieci.
Drugi tworzy konfigurację OpenVPN przy użyciu tej samej podsieci, jak zdefiniowano w pierwszym poleceniu.
Trzeci tworzy serwer OpenVPN. Jest on dołączony do nowo utworzonej sieci Docker i używa stałego adresu IP.
Czwarta i piąta komenda konfigurują przekazywanie IP.
Ostatnie polecenie dodaje nową trasę do konfiguracji klienta VPN poprzez stały adres IP kontenera OpenVPN.
Uwaga
Nie próbowałem tego, ale powinno być możliwe ograniczenie reguły FORWARD dla iptables. Utworzenie sieci Docker stworzyło nowe urządzenie mostkowe. Ten most nosi nazwę, w
br-<ID>
której identyfikator jest pierwszymi 12 znakami identyfikatora sieci Docker. Ten identyfikator można uzyskać za pomocądocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Dlatego poniższe polecenie może być bardziej restrykcyjne (tak lepiej pod względem bezpieczeństwa), ale powinno nadal umożliwiać kierowanie naszego ruchu:źródło
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
ale nie mogę pingować ani osiągać otwartych portów.docker network…
.