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
tap
, do cholerytun
, pracowałem nad tym jeszcze przez 12 godzin, ale bez powodzenia.