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?)
tap
, gilatun
, saya telah bekerja selama lebih dari 12 jam tanpa hasil sampai sekarang.Jawaban:
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) danpush "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:
Bagaimanapun, berikut adalah opsi yang saya gunakan untuk mengatur server:
Ini akan menghasilkan file konfigurasi server yang mirip dengan:
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):
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 dengandocker 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:sumber
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
tapi saya tidak bisa melakukan ping atau mencapai port terbuka.docker network…
.