mitmproxy, DevTools, Gradle: tri sloja iza VPN-a
Loopback nikada ne ulazi u tunel. Svrstajte simptom u slušalac, trust store ili paketni filter i popravite sloj koji je stvarno pao.
VPN se povezuje, a tri nepovezana alata padaju na tri različita načina istog poslijepodneva. mitmproxy prestaje viđati zahtjeve, Chrome odbija debugger, a Gradle baca BindException dok veže lokalni socket. Zajednička sumnja je da tunel blokira localhost. Ne može: 127.0.0.1 se obrađuje unutar kernela i nikada ne dolazi do adaptera, a kamoli do gatewaya.
Tri sloja, tri različita kvara
Ono što se promijenilo s klijentom nije ruta do loopbacka. To su lokalni proxy, mašinski trust store i paketni filter, i svaki od njih kvari drugi dio razvojnog toka. Razvrstavanje simptoma u pravi red je veći dio dijagnoze:
| Symptom | Layer | First check |
|---|---|---|
| Proxy sees no traffic | Local proxy or listener | ss -lntp, or netstat -ano on Windows |
| TLS error in one tool only | Trust store | Which CA bundle does that runtime read? |
| Local bind or connect refused | Packet filter or port owner | Who holds the port, and what rule drops it? |
Skoro svaki ovakav izvještaj počinje od zadnjeg reda i ide prema gore, što je naopako. Tunel je jedini sloj koji dokazivo ne može vidjeti loopback promet, pa zaslužuje najmanje sumnje. Počnite od onoga što je proces vezao, zatim pitajte kojim sertifikatima vjeruje i tek onda pogledajte politiku na mašini.
Počnite sa slušaocem, ne s tunelom
Kada proxy na 127.0.0.1:8080 prestane primati promet, dogodilo se jedno od troje: nije nikada startovao, vezao je drugi port ili je filter ispustio loopback vezu. Popis slušajućih socketa odgovara na to jednom komandom, a pokazuje i koji proces drži port kada se dva alata ne slažu oko toga ko je bio prvi.
Lokalna adresa u pretrazi rute potvrđuje istu stvar sa druge strane. ip route get prema loopback odredištu prijavljuje loopback uređaj, nikada tunel, što je korisna rečenica kada neko predloži promjenu rutiranja kao rješenje.
Sloj proxyja: okruženje nije konfiguracija
Mnogi korporativni klijenti pokreću HTTP proxy i očekuju da ga aplikacije koriste. Postavljanje HTTPS_PROXY u shellu popravlja komandne alate koji ga poštuju, a ne čini ništa za alat koji čita sopstveni fajl postavki. Gradle, Selenium i gRPC svaki konsultuje sopstvenu konfiguraciju, a proxy izvezen u jednom terminalu nevidljiv je za demon koji pokrene IDE.
Alati za kontejnere su uobičajeno mjesto gdje to postaje vidljivo. Loopback kontejnera je njegov vlastiti, pa 127.0.0.1 unutar kontejnera nikada ne znači proxy hosta; potrebna je adresa hosta ili postavka host mreže. Popravka koja radi u shellu a pada u buildu obično je ovaj red, ne tunel.
Sloj povjerenja: alat čita drugi store
Presretanje je druga promjena i proizvodi najzavodljivije greške. Klijent predstavlja vlastiti sertifikat za pregledane veze, pa pretraživač koji vjeruje korporativnom korijenu uspijeva, dok alat sa ugrađenim CA storeom pada. Python requests kroz certifi klasičan je slučaj: store operativnog sistema može biti ispravan a zahtjev ipak pada, jer to okruženje nikada ga ne čita. Tekst greške rijetko spominje presretanje, zato se ovaj red pogrešno dijagnostikuje kao pokvarena krajnja tačka.
Uporedite šta krajnja tačka zaista predstavlja s onim što je alat validirao. openssl s_client prikazuje lanac koji je server poslao; vlastiti izlaz validacije alata prikazuje šta je odlučio. Kada se ne slažu, REQUESTS_CA_BUNDLE ili SSL_CERT_FILE je poluga za to okruženje, a korporativni korijen pripada u store koji to okruženje čita, a ne na globalno mjesto koje poštuju samo neki alati.
Promjena verzije koja popravi SSL grešku dokaz je o politici povjerenja i šifri, ne o VPN-u. Spuštanje verzije Pythona zbog kojeg SOAP klijent proradi promijenilo je ugrađeni CA store i zadane TLS postavke; mrežna putanja se nije pomjerila.
Sloj filtera: i on može ispustiti loopback
Treća promjena je paketni filter, a neki proizvodi instaliraju pravila koja ispuštaju promet koji ne ulazi u tunel. Lokalni slušaoci mogu biti uključeni. To pretvara radni socket u odbijenu ili istek lu vezu, a nastala greška izgleda kao bug u aplikaciji, ne kao politika na mašini.
Vlasništvo nad portom je druga polovina ovog sloja. BindException znači da socket nije mogao biti otvoren, što je drugačiji neuspjeh od odbijene veze. Provjerite drži li port već drugi proces prije nego optužite filter, zatim potražite pravilo koje ispušta lokalni promet i dodajte najuže dopuštenje koje proizvod podržava. Dva alata koja se takmiče za isti debug port daju tačno istu poruku kao blokada politikom, a samo jedan od njih popravlja se promjenom firewalla.
Chromeov debug port pada u istoj familiji. Pretraživač se pokrene, drajver ne može doći do DevTools krajnje tačke, a poruka imenuje DevTools, ne mrežu. Dodatni flagovi za pokretanje i suvišni menadžer drajvera mijenjaju koji proces drži port, zato se njihovo uklanjanje ponekad čini kao popravka VPN-a.
Popravite sloj koji je pao
Popravite sloj koji je pao, ne tunel. Nedostupnom loopback slušaocu treba popraviti slušaoca ili port. Nepovjerenom sertifikatu treba korporativni korijen instaliran tamo gdje to konkretno okruženje gleda, uz usko izuzeće. Filteru koji ispušta lokalni promet treba konkretno pravilo dopuštenja, a ne isključen filter, jer isključivanje ponovo otvara i sve drugo što je štitio.
Ponovno povezivanje VPN-a ne testira nijedan od ovih slojeva. Ono samo ponovo pokreće promjenu koja ih je pokvarila, zato se ista tri kvara vraćaju nakon svakog ponovnog povezivanja i nestaju nakon svakog restarta koji ostavi klijent neaktivnim.