Zezwalaj kontenerom Docker na łączenie się z klientami OpenVPN w interfejsie tunelu hosta

12

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?)

ddewaele
źródło
1
Może późno, ale w twoim przypadku uważam, że potrzebujesz tap, do cholery tun, pracowałem nad tym jeszcze przez 12 godzin, ale bez powodzenia.
Mohammed Noureldin
@MohammedNoureldin, czy znaleźliście rozwiązanie? Zastanawiam się teraz, czy teraz dotknę urządzenia. Frustrujące jest to, że z kontenera ovpn mogę uzyskać dostęp do klientów VPN. A od klientów VPN mogę uzyskać dostęp do innych kontenerów w tej samej sieci Docker. Ale przekazywanie między „eth0” i tun0 wewnątrz kontenera ovpn nie działa. Myślę, że jest to spowodowane naturą tun0 vs. tap.
Huygens,
@Huygens, tak, rozwiązałem to, proszę zadać osobne pytanie i podać referencje do mnie, a ja dołożę wszelkich starań, aby Ci pomóc.
Mohammed Noureldin
1
Cześć @MohammedNoureldin Znalazłem 2 brakujące instrukcje, aby działało. Były na stronach man openvpn 👍. Wkrótce opublikuję odpowiedź na to pytanie dla innych.
Huygens
1
@Huygens, dobrze wiedzieć, właściwie nie miałem jeszcze czasu na opublikowanie odpowiedzi, ale jestem zainteresowany, aby zobaczyć, co zadziałało w twojej sprawie.
Mohammed Noureldin

Odpowiedzi:

7

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) i push "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ń:

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>

W każdym razie oto opcje, których użyłem do skonfigurowania serwera:

$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"

Powinno to wygenerować plik konfiguracyjny serwera podobny do:

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
client-to-client

### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"

### Extra Configurations Below
topology subnet

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):

$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2

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:

$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT
Huygens
źródło
Hej, nie mogę tego uruchomić, mogę śledzić do 192.168.255.6 i otrzymuję:, 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hale nie mogę pingować ani osiągać otwartych portów.
GuySoft,
Cześć @GuySoft, co zgłasza traceroute, to że twój ostatni skok (172.20.20.1) nie może dotrzeć do hosta 192.168.255.6. Oznacza to, że twoja tabela routingu jest prawdopodobnie nieprawidłowa. Czy możemy porozmawiać, aby sprawdzić, gdzie jest problem?
Huygens
Zaczęło działać, myślę, że zdarzyło się, że na obu komputerach zainstalowano dokera, a obie miały podsieć 172.20.20.1, która powodowała konflikty, muszę znaleźć sposób, aby doker nie tworzył podsieci, która kolidowałaby z maszyną klienta .
GuySoft
Jeśli korzystasz z Docker Compose, możesz określić zakres adresów IP, z którego powinna korzystać sieć. Zobacz dokumentację tworzenia. Można to również zrobić za pomocą wiersza polecenia docker network….
Huygens
Myślę, że nie dostaję części, w której połączenie z hostem (host ip + port openvpn) jest kierowane do kontenera openvpn (172.20.20.2)
jtomasrl