Întrerupător de urgență pentru un sidecar VPN: blochează traficul când iese
Partajarea spațiului de nume al unui container VPN nu oprește aplicația când tunelul moare. Adaugă o politică explicită de ieșire și testează repornirile, nu doar deconectările.
Un container de aplicație care partajează spațiul de nume de rețea al unui container VPN nu are interfață proprie, așa că e ușor de presupus că nu poate trimite nimic când tunelul eșuează. Această presupunere este greșită în modul de eșec care contează. Dacă procesul VPN moare în timp ce spațiul de nume supraviețuiește, aplicația își păstrează socketurile și spațiul de nume își păstrează rutele, iar traficul continuă pe calea care mai este instalată. Un kill switch adevărat este o politică explicită de filtrare plus teste ale ciclului de viață al runtime-ului, nu o dependență la pornire.
De ce partajarea spațiului de nume nu este un kill switch
Partajarea unui spațiu de nume înseamnă că aplicația folosește interfețele, adresele și tabela de rute ale containerului VPN. Elimină calea independentă a aplicației către rețea cât timp spațiul de nume partajat este intact, și nu spune nimic despre ce va face acel spațiu de nume când tunelul dispare.
Condițiile de dependență din Compose pot întârzia pornirea unei aplicații până când o dependență este sănătoasă. Asta acoperă un singur moment în timp și nicio defecțiune ulterioară, deci este un instrument de ordonare a pornirii, nu un firewall de ieșire continuu.
Ce se întâmplă de fapt când containerul iese
Distinge trei evenimente. Procesul VPN din interiorul containerului poate muri în timp ce containerul continuă să ruleze. Containerul se poate opri sau poate fi eliminat, ceea ce distruge spațiul de nume. Containerul poate fi recreat, ceea ce construiește un spațiu de nume nou și reguli noi.
În primul caz spațiul de nume persistă, ruta implicită poate indica în continuare interfața fizică, iar aplicația continuă să trimită direct. În al doilea caz aplicația dependentă pierde de obicei conectivitatea complet, pentru că spațiul ei de nume a dispărut. În al treilea caz aplicația se poate reconecta la un spațiu de nume proaspăt înainte ca tunelul să fie gata. Fiecare caz necesită un test diferit, iar un design care acoperă doar deconectarea ordonată acoperă cazul cel mai puțin interesant.
Construiește o politică explicită de ieșire
Scrie politica în interiorul spațiului de nume partajat ca să se aplice pachetelor aplicației. Forma este o eliminare implicită cu excepții înguste: loopback, interfața tunelului și adresa și portul concrete ale punctului final de care are nevoie transportul tunelului.
Excepția punctului final trebuie să fie în vigoare înainte ca tunelul să urce, altfel clientul VPN nu își poate atinge serverul. De aceea setul de reguli permite explicit transportul exterior în loc să permită interfața fizică în general. Adaugă și reguli IPv6 dacă spațiul de nume are conectivitate IPv6, pentru că o politică doar IPv4 lasă cealaltă familie deschisă.
DNS-ul face și el parte din politică. Dacă aplicația rezolvă nume printr-un resolver accesibil doar în interiorul tunelului, regula de eliminare va rupe rezolvarea când tunelul este oprit, ceea ce este comportamentul corect pentru un kill switch. Decide deliberat dacă asta vrei.
Testează ciclul de viață, nu doar deconectarea
Trimite o cerere nouă și inofensivă cât tunelul este sănătos, apoi omoară procesul VPN și trimite alta. Repetă după o oprire a containerului, după o repornire și după recreare. O cerere nouă contează pentru că o conexiune existentă poate supraviețui unei schimbări de reguli care le blochează pe cele noi.
Nu te baza pe o verificare de sănătate sau pe o căutare a IP-ului de ieșire ca mecanism de blocare. O verificare observă starea și o raportează; o politică controlează traficul. Ambele fac parte din aceeași implementare și nu se înlocuiesc reciproc.
Notează regulile ca testul să supraviețuiască unei actualizări
Scrie rezultatul așteptat pentru fiecare caz de eșec în documentația de implementare, împreună cu regulile care îl pun în practică. Acea înregistrare permite rularea aceluiași test după o actualizare de imagine sau a runtime-ului, când comportamentul spațiului de nume sau rutele implicite se pot schimba fără ca cineva să editeze fișierul compose.
Ține calea exterioară necesară a punctului final VPN separată de ieșirea nelimitată a aplicației și ține DNS-ul și IPv6 în acoperirea dorită. Dacă politica permite întreaga interfață fizică pentru comoditate, kill switch-ul a dispărut. Documentația de rețea Docker descrie aranjamentul spațiului de nume partajat pe care se bazează politica, și ea este referința de verificat când comportamentul runtime-ului este pus la îndoială.