Aș dori să permit utilizatorilor OpenVPN să ajungă la toate containerele Docker care fac parte din rețeaua Overlay ca și cum s-ar afla în aceeași rețea LAN. Cel mai simplu exemplu sunt 3 containere distribuite pe 2 gazde, iar gazdele sunt conectate prin rețea de suprapunere, iar toate cele 3 containere fac parte din acea rețea de suprapunere.
Pentru asta, am pregătit un container OpenVPN (OpenVPN în modul bridge cu adaptor TAP), iar în acel container am creat un bridge br0 și am legat interfețele eth0 și tap0 la br0. Prin aceasta, aș spune că mi-am conectat TAP și toți clienții OpenVPN la rețeaua de suprapunere (nu sunt sigur dacă această afirmație este corectă).
Până acum, atunci când utilizatorii mei OpenVPN se conectează la OpenVPN și încearcă să pună ping la Dummy Container 1 (care se află pe aceeași gazdă cu OpenVPN container), utilizatorii pot face ping la Dummy Container 1 (și, desigur, pot să pună ping pe containerul OpenVPN de asemenea). Până acum, bine!
Cu toate acestea, utilizatorii nu pot face ping la Dummy Container 2, care există pe a diferit gazdă (dar face parte din aceeași suprapunere cu containerul OpenVPN așa cum s-a menționat mai sus).
Deci, pe scurt, utilizatorii VPN care sunt conectați la containerul OpenVPN (conectați la rețeaua de suprapunere Docker) și încearcă să pună ping la celelalte containere pot trimite ping containerelor numai pe aceeași gazdă, nu pe cealaltă gazdă, ca și cum bridge-ul funcționează numai pe local. bridge și nu cu rețea Overlay.
De asemenea, este important să spunem că din interiorul containerului OpenVPN însuși pot da ping la Dummy Container 2 (și, desigur, la Dummy Container 1).
Această cifră asemănează întreaga poveste pe care am spus-o mai sus. Observați săgeata roșie care reprezintă conexiunea pe care aș dori să o obțin, dar nu funcționează în acest moment (utilizatorul VPN se conectează la Host 1 prin OpenVPN, apoi încercați să ping Dummy Container 2).
Câteva informații tehnice detaliate
Container OpenVPN
/etc/openvpn # adresă ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue stare UNKNOWN grup implicit qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft pentru totdeauna preferred_lft pentru totdeauna
2: tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 06:9b:33:89:85:81 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
link/ether 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.4/24 scope global br0
valid_lft pentru totdeauna preferred_lft pentru totdeauna
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP grup implicit
link/ether 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
76: eth1@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP grup implicit
link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth1
valid_lft pentru totdeauna preferred_lft pentru totdeauna
/etc/openvpn # rută ip
implicit prin 172.18.0.1 dev eth1
10.8.0.0/24 dev br0 proto kernel scope link src 10.8.0.4
172.18.0.0/16 dev eth1 proto kernel scope link src 172.18.0.4
Configurare server OpenVPN:
portul 1194
proto udp
dev tap0
ca ca.crt
cert server.crt
cheie server.key # Acest fișier trebuie păstrat secret
dh dh.pem
ifconfig-pool-persist ipp.txt
de la client la client
menține în viață 10 120
cifrul AES-256-GCM
comprimați lz4-v2
apăsați „comprimați lz4-v2”
cheie-persiste
persist-tun
stare /var/log/openvpn-status.log
verbul 3
explicit-exit-notify 1
##### Autentificare #####
# Nu este necesar un certificat de client. Clientul trebuie să se autentifice folosind numai numele de utilizator/parola.
verify-client-cert niciunul
# Dezactivează renegocierea cheilor. Valoarea implicită este de o oră, ceea ce deconectează utilizatorul la fiecare oră și provoacă ca utilizatorul final să fie provocat să reautorizeze folosind un nou OTP.
reneg-sec 0
# Încarcă și utilizează configurația pluginului LDAP.
plugin /usr/lib/openvpn/plugins/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf
# Încarcă și folosește pluginul PAM-auth (în principal pentru 2FA).
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so „openvpn login USERNAME parola PAROLA PIN OTP”
Mireasa se face astfel:
openvpn --mktun --dev tap0
ip link set tap0 promisc activat
ip link adăugați nume br0 tip bridge
linkul ip setați dev br0
set link ip dev tap0 master br0
set link ip dev eth0 master br0
ip addr flush dev eth0
ip addr add 10.8.0.4/24 dev br0
OpenVPN este pornit folosind comanda
VPN_SERVER_HOST_IP_ADDRESS=10.8.0.254
VPN_NETMASK=255.255.255.0
VPN_POOL_START_IP_ADDRESS=10.8.0.50
VPN_POOL_END_IP_ADDRESS=10.8.0.100
openvpn \
--config server.conf \
--server-bridge $VPN_SERVER_HOST_IP_ADDRESS $VPN_NETMASK $VPN_POOL_START_IP_ADDRESS $VPN_POOL_END_IP_ADDRESS
My Dummy Container 2 (foarte similar cu Dummy Container 1, dar cu IP-uri diferite):
/ # adresă ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft pentru totdeauna preferred_lft pentru totdeauna
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
link/ether 02:42:0a:08:00:05 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.5/24 brd 10.8.0.255 scope global eth0
valid_lft pentru totdeauna preferred_lft pentru totdeauna
37: eth1@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
valid_lft pentru totdeauna preferred_lft pentru totdeauna
/ # rută ip
implicit prin 172.18.0.1 dev eth1
10.8.0.0/24 dev eth0 scope link src 10.8.0.5
172.18.0.0/16 dev eth1 scope link src 172.18.0.3