Izinkan kontainer Docker terhubung ke klien OpenVPN pada antarmuka terowongan host

11

Saya memiliki pengaturan berikut:

  • Host CentOS menjalankan layanan buruh pelabuhan
  • Jaringan bridge docker yang ditentukan pengguna
  • 2 kontainer Docker terhubung ke jaringan jembatan yang ditentukan pengguna itu
  • Instalasi OpenVPN (saat ini berjalan pada host. Dapat juga berjalan dalam wadah buruh pelabuhan)
  • Beberapa klien terhubung ke OpenVPN

Bagaimana saya bisa mengizinkan wadah buruh pelabuhan di jaringan jembatan buruh pelabuhan untuk berkomunikasi dengan klien openvpn di jaringan tun0?

Saya ingin dapat memiliki komunikasi berbasis tcp antara docker1 (10.10.0.3) dan klien yang terhubung ke vpn (rentang 172.19.0.x) secara transparan.

Apa yang saya perlukan untuk setup di sisi docker (jaringan / iptables / ...) dan pada host (iptables?)

ddewaele
sumber
1
Mungkin terlambat, tetapi dalam kasus Anda, saya percaya Anda perlu tap, gila tun, saya telah bekerja selama lebih dari 12 jam tanpa hasil sampai sekarang.
Mohammed Noureldin
@MohammedNoureldin apakah kalian menemukan solusi? Saya juga mempertimbangkan sekarang akan mengetuk perangkat. Yang membuat frustrasi adalah bahwa dari dalam wadah ovpn saya dapat mengakses klien vpn. Dan dari klien vpn saya dapat mengakses kontainer lain di jaringan Docker yang sama. Tetapi penerusan antara "eth0" dan tun0 di dalam wadah ovpn tidak berfungsi. Saya kira itu karena sifat tun0 vs ketukan.
Huygens
@ Huygens, ya saya menyelesaikannya, silakan ajukan pertanyaan terpisah dan berikan referensi kepada saya dan saya akan melakukan yang terbaik untuk membantu Anda.
Mohammed Noureldin
1
Hai @MohammedNoureldin Saya menemukan 2 instruksi yang hilang agar bisa berfungsi. Itu ada di halaman manual openvpn đź‘Ť. Saya akan segera mengirim jawaban untuk pertanyaan ini untuk orang lain.
Huygens
1
@Huygens, senang tahu, sebenarnya saya belum punya waktu untuk mengirim jawaban, tapi saya tertarik untuk melihat apa yang berhasil untuk kasus Anda.
Mohammed Noureldin

Jawaban:

7

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
Huygens
sumber
Hei, ini tidak bisa berfungsi, saya bisa tracerote ke 192.168.255.6 dan saya mendapatkan:, 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Htapi saya tidak bisa melakukan ping atau mencapai port terbuka.
GuySoft
Hai @GuySoft apa yang dilaporkan traceroute adalah bahwa hop terakhir Anda (172.20.20.1) tidak dapat mencapai host 192.168.255.6. Jadi itu berarti tabel perutean Anda mungkin salah. Bisakah kita ngobrol untuk melihat di mana masalahnya?
Huygens
Itu mulai bekerja, saya pikir apa yang terjadi adalah kedua mesin memiliki buruh pelabuhan diinstal, dan keduanya memiliki subnet 172.20.20.1, yang membuat hal-hal berbenturan, saya perlu menemukan cara untuk membuat buruh pelabuhan tidak membuat subnet yang akan berbenturan pada mesin klien .
GuySoft
Jika Anda menggunakan Docker Compose, Anda dapat menentukan rentang alamat IP yang harus digunakan jaringan. Lihat dokumentasi Menulis. Dimungkinkan juga untuk melakukannya dari baris perintah dengan docker network….
Huygens
Saya pikir saya tidak mendapatkan bagian di mana koneksi ke host (host ip + port openvpn) sedang dialihkan ke wadah openvpn (172.20.20.2)
jtomasrl