Docker- a VM-Traffic hannert OpenVPN: Route oder Ëmnummeréieren?
Containeren a Gäscht op engem Host mat engem OpenVPN-Client verléieren entweder de Réckwee oder stoussen mam Tunnelpräfix zesummen. Dräi Froen entscheeden d'Léisung.
Den Host surft duerch den Tunnel an de Container niewendrun erreecht näischt. E Port aus engem Container ze verëffentlechen, deen säin eegene VPN-Client lafe léisst, ass schlëmmer: d'Ufro kënnt un an d'Äntwert geet ni eraus. Béides si Routing-Entscheedungen um Host, an Docker ass just de Bote.
Dräi Froen entscheeden, wéi ee vun den zwee Fäll dir virun Iech hutt, an se daueren ongeféier eng Minutt.
Zwee Feeler, déi d'selwecht ausgesinn
Den éischten ass e Problem mam Réckwee. En verëffentlechte Port gëtt an de Container iwwersat, d'Ufro kënnt un, an d'Äntwert gëtt iwwer d'Standardroute vum Host geroutet, déi de OpenVPN-Client op tun0 geriicht huet. D'Äntwert geet vun enger Adress eraus, déi de Géigeniwwer net erwaart, an se gëtt verworf. Den zweeten ass eng Präfixkollisioun: dem Docker seng Standardbréck huet 172.17.0.0/16, an en Ënnernehmens-Tunnel dréckt deeselwechte Beräich.
Deen eenen gëtt mat enger Routingtabell behuewen, deen aneren duerch d'Ëmnummeréiere vun enger Bréck. Virum Änneren ze wëssen, wéi ee wat ass, ass de Wee, en funktionéierende Container futti ze maachen.
Entscheet mat dräi Froen
Fro éischt: verschwënnt de Feeler, wann dir de VPN stoppt? Wann alles funktionéiert mam Tunnel ënnen, verdächtegt de Réckwee. Fro zweet: weist ip route show table all deeselwechte Präfix zweemol, eng Kéier op enger Bréck an eng Kéier op tun0? Dat ass d'Kollisioun. Fro drëtt: ass déi betraffen Adress en Container, en NAT-Gascht oder en iwwer Bréck ugebonnene Gascht?
Déi drëtt Fro ass wichteg, well jiddereen eng aner richteg Léisung huet, an d'Container-Léisung op en libvirt-Gascht unzewennen kascht en Owend.
ip route
ip route show table all | grep -E '172\.1[7-9]|10\.8'
docker network inspect bridge --format '{{.IPAM.Config}}'Réckwee: eng Tabell fir eng Quelladress
Wann den Traffic vum Container iwwer d'physesch Interface muss eraus, während den Host selwer den Tunnel benotzt, quellbaséiert Routing ass déi klengst Ännerung. Füügt eng Regel derbäi, déi op d'Adress vum Container passt, a schéckt se an eng eege Tabell. Soss beweegt sech näischt um Host.
ip rule add from 172.22.0.3 lookup 10
ip route add default via 172.22.0.1 table 10All Pak, deem seng Quell déi Adress ass, kuckt fir d'éischt an d'Tabell 10, an d'Tabell 10 schéckt et op de Gateway vun der Bréck amplaz an den Tunnel.
Bestätegt mat ip route get 1.1.1.1 from 172.22.0.3. D'Äntwert muss d'Interface vun der Bréck nennen, net tun0. Regelen, déi esou dobäi kommen, verschwannen beim Neistart, also setzt se an d'Unit oder an den Netzwierk-Hook, deem den Container gehéiert.
Datselwecht Muster fonctionnéiert fir en WireGuard-Container, wou och de Réckwee eng explizit Regel brauch.
Präfixkollisioun: nummeréiert d'Bréck ëm
Eng Routingtabell schéckt ee Präfix op eng Plaz. Wann de VPN 172.17.0.0/16 dréckt, während dem Docker seng Bréck schonn do ass, gewënnt déi méi niddreg Metrik: Docker setzt seng verbonnen Route op Metrik 0, an déi gedréckt Route kënnt op 50 un. Dann gesäit den Tunnel futti aus, während Docker weider schafft, oder ëmgedréint, jee no Installatiounsuerdnung. Nummeréiert d'Bréck ëm, amplaz géint d'Metrik ze kämpfen.
{
"bip": "10.200.0.1/24",
"default-address-pools": [{"base": "10.201.0.0/16", "size": 24}]
}Startet Docker no der Ännerung nei a leet Netzwierker nei un, déi mam ale Pool gebaut goufen. D'Metrik ze änneren verréckelt de Konflikt nëmmen op den nächsten Neistart.
VM'en brauchen nach eng aner Äntwert
En libvirt-Gascht am Standard-NAT-Netzwierk ierft d'Routing vum Host a kënnt net méi eraus, soubal den Tunnel vum Host d'Standardroute huet. De Gascht op eng Bréck oder en macvtap-Gerät ze wiesselen gëtt him säin eegene Wee am physeschen Netzwierk. Am virt-manager füügt Dir Hardware derbäi, wielt Network, setzt d'Quell op de macvtap-Hostgerät, behält virtio als Modell a deaktivéiert dann déi al NAT-Interface.
En macvtap-Gascht kann normalerweis säin eegenen Host net erreechen. Dat ass erwaart Verhalen an net e Feeler, an et gehéiert an d'Notiz, déi Dir hannerléisst.
Fir en Gascht, deen nëmmen d'LAN vum Host brauch, huet de Client vum Hiersteller vläicht de fehlenden Schalter: mam Mullvad stellt mullvad lan set allow d'lokal Erreechbarkeet erëm hier, ouni libvirt unzepaken. A wann en Container nëmmen duerch den Tunnel erreechbar misst sinn, bënnt de verëffentlechte Port un d'Tunneladress, -p 10.8.0.5:8080:8080, amplaz en op all Adress ze verëffentlechen.