Konteks
Saya telah menggunakan wadah Docker yang sangat bagus dari Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). Saya menggunakan apa yang disebut dokumentasi "paranoid" untuk mengatur server OpenVPN saya, tetapi dalam pandangan saya ini harus menjadi cara standar dan bukan cara paranoid.
Konfigurasi
Untuk memungkinkan koneksi dua arah antara kontainer Docker yang dipilih dan klien VPN, Anda harus membuat jaringan Docker tempat Anda akan memasang kontainer yang harus diizinkan untuk diakses oleh klien VPN. Server VPN akan menjadi salah satu wadah itu.
Server VPN harus memiliki client-to-client
, topology subnet
, dev tun0
(atau perangkat tun lainnya) dan push "route <docker net IP> <docker net mask>"
dikonfigurasi.
Host server VPN harus dikonfigurasi untuk mendukung penerusan paket IP dari satu subnet ke yang lain. Ini berarti mengatur ip_forward sysctl ke 1 (seharusnya demikian jika Anda memasang Docker), yang memungkinkan paket dari perangkat tun untuk pergi melalui rantai iptables FORWARD dan mengatur perutean yang tepat. Ini dapat diringkas dengan perintah-perintah ini:
$ 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>
Bagaimanapun, berikut adalah opsi yang saya gunakan untuk mengatur server:
$ 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"
Ini akan menghasilkan file konfigurasi server yang mirip dengan:
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
Contoh nyata
Sekarang saya akan mengambil contoh konkret. Dalam contoh ini, saya akan menjalankan server OpenVPN yang disebutkan di atas di dalam Docker pada host vpn.example.com. Wadah ini melekat pada docker network docker-net-vpn. Berikut adalah perintah (dalam contoh ini saya menghasilkan konfigurasi server langsung di server dan saya melewatkan generasi CA, silakan ikuti dokumentasi paranoid dari proyek yang disebutkan di atas sebagai gantinya):
$ 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
Perintah pertama membuat jaringan Docker baru khusus yang mendefinisikan subnet baru. Kami akan melampirkan server OpenVPN ke jaringan ini.
Yang kedua membuat konfigurasi OpenVPN menggunakan subnet yang sama seperti yang didefinisikan dalam perintah 1.
Yang ketiga menciptakan server OpenVPN. Itu dilampirkan ke jaringan Docker yang baru dibuat dan menggunakan IP perbaikan.
Perintah keempat dan kelima mengkonfigurasi penerusan IP.
Perintah terakhir menambahkan rute baru menuju konfigurasi klien VPN melalui wadah tetap OpenVPN IP.
Catatan
Saya belum mencobanya, tetapi mungkin untuk membatasi aturan FORWARD untuk iptables. Pembuatan jaringan Docker menciptakan perangkat jembatan baru. Jembatan ini dinamai br-<ID>
dengan ID sebagai 12 karakter pertama dari ID jaringan Docker. ID ini dapat diperoleh dengan docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Oleh karena itu perintah berikut ini mungkin lebih membatasi (jadi lebih baik dari segi keamanan) tetapi harus tetap membiarkan lalu lintas kami dialihkan:
$ 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
, gilatun
, saya telah bekerja selama lebih dari 12 jam tanpa hasil sampai sekarang.