bağlam
Kyle Manna'nın çok iyi Docker kapsayıcısını kullanıyorum ( https://github.com/kylemanna/docker-openvpn ). OpenVPN sunucumu kurmak için sözde "paranoyak" belgeleri kullanıyorum, ama bence bu paranoyak yol değil, standart yol olmalı.
Yapılandırma
Seçilen Docker kapsayıcıları ile VPN istemcileri arasında çift yönlü bağlantıya izin vermek için, VPN istemcileri tarafından erişilmesine izin verilmesi gereken kapsayıcı ekleyeceğiniz bir Docker ağı oluşturmanız gerekir. VPN sunucusu bu kapsayıcılardan biri olacak.
VPN sunucusu olması gerekir client-to-client
, topology subnet
, dev tun0
(ya da diğer tun cihaz) ve push "route <docker net IP> <docker net mask>"
konfigüre edilmiştir.
VPN sunucusunun ana bilgisayarı, IP paketlerinin bir alt ağdan diğerine iletilmesini destekleyecek şekilde yapılandırılmalıdır. Bu, sysctl ip_forward değerini 1 olarak ayarlamak (Docker yüklemeniz varsa böyle olmalıdır), tun cihazından gelen paketlerin iptables FORWARD zincirinden geçmesine ve uygun yönlendirmenin ayarlanması anlamına gelir. Bu şu komutlarla özetlenebilir:
$ 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>
Her neyse, sunucuyu kurmak için kullandığım seçenekler şunlardır:
$ 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"
Bu, aşağıdakine benzer bir sunucu yapılandırma dosyası oluşturmalıdır:
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
Somut örnek
Şimdi somut bir örnek alacağım. Bu örnekte, yukarıda belirtilen OpenVPN sunucusunu vpn.example.com ana bilgisayarındaki Docker içinde çalıştıracağım. Bu kap Docker ağ docker-net-vpn'ye eklenir. İşte komutlar (bu örnekte sunucu yapılandırmasını doğrudan sunucuda oluşturuyorum ve CA nesnesini atlıyorum, lütfen yukarıda belirtilen projenin paranoid belgelerini izleyin):
$ 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
İlk komut, yeni bir alt ağ tanımlayan özel bir yeni Docker ağı oluşturur. OpenVPN sunucusunu bu ağa bağlayacağız.
İkincisi, 1. komutta tanımlananla aynı alt ağı kullanarak OpenVPN yapılandırmasını oluşturur.
Üçüncüsü OpenVPN sunucusunu oluşturur. Yeni oluşturulan Docker ağına bağlıdır ve bir düzeltme IP'si kullanır.
Dördüncü ve beşinci komutlar IP yönlendirmeyi yapılandırır.
Son komut, OpenVPN konteyneri sabit IP'si üzerinden VPN istemci yapılandırmasına yeni bir yol ekler.
Not
Denemedim, ancak iptables için İLERİ kuralı kısıtlamak mümkün olmalıdır. Docker ağ oluşturma yeni bir köprü aygıtı oluşturdu. Bu köprü, br-<ID>
Docker ağ kimliğinin ilk 12 karakteri olan kimlikle adlandırılır. Bu kimlik ile elde edilebilir docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Bu nedenle, aşağıdaki komut daha kısıtlayıcı olabilir (güvenlik açısından daha iyi), ancak yine de trafiğimizin yönlendirilmesine izin vermelidir:
$ 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
, fındıktun
, şimdiye kadar hiç başarı olmadan 12 saatten fazla süredir bunun üzerinde çalışıyorum.