Kodėl kill switch numeta srautą, kai keičiate serverį
Kodėl kill switch blokuoja srautą keičiant serverį, ką klientas daro tame intervale ir kaip atskirti įprastą pauzę nuo įstrigusio bloko.
Pasirenkate arčiau atrodantį serverį, spaudžiate prisijungti, ir naršyklė nustoja krauti dar neįsijungus naujam tuneliui. Piktograma persijungia į jungimosi būseną ir ten lieka, kol kiekvienas skirtukas baigia laukti. Ši pauzė dažniausiai yra kill switch, veikiantis taip, kaip suprojektuotas: srautas blokuojamas, kol klientas neturi tunelio, kuriuo jį siųsti. Ar pauzė priimtina, priklauso nuo to, ką klientas daro tomis sekundėmis, ir nuo to, ar blokas nuimamas tada, kai jis sako, kad nuimtas.
Ką klientas daro tarp dviejų serverių
Galutinio taško keitimas yra keli žingsniai, o ne vienas jungiklis. Klientas išardo dabartinį tunelį, atnaujina savo blokavimo taisykles, išsprendžia ir pasiekia naują galutinį tašką už tunelio ribų, tada įdiegia naujus maršrutus ir nuima bloką. Spraga, kurią jaučiate, yra tarp pirmo ir paskutinio žingsnio.
Tvarka čia svarbesnė už greitį. Jei blokavimo taisyklės įsigalioja prieš išimtį naujam galutiniam taškui, klientas negali užbaigti rankos paspaudimo ir lieka jungimosi būsenoje iki laiko pabaigos. Jei išimtis yra seno serverio adreso kopija, naujas rankos paspaudimas atrodo kaip bet kuris kitas siunčiamas paketas ir yra numetamas. Abu atvejai naršyklėje atrodo vienodai, todėl perjungimas, kuris atsigauna po šešių sekundžių, ir tas, kuris neatsigauna niekada, gali turėti tą pačią priežastį.
Naujam galutiniam taškui reikia skylės bloke
Kad sukurtų tunelį, klientas turi siųsti paketus į naujo serverio adresą ir prievadą fiziniu sąsaja, pavyzdžiui, UDP 51820 įprastam WireGuard profiliui arba 1194 ir 443 OpenVPN, ką nors nurodo jūsų profilis. Šis srautas nėra tunelio, kuris ką tik bus sukurtas, viduje, todėl viso įrenginio blokas jį praryja, nebent yra atitinkanti leidimo taisyklė.
Profiliuose pagal pagrindinio kompiuterio vardą atsiranda antras reikalavimas: pati užklausa. Jei klientas išsprendžia galutinį tašką prieš pakeliant bloką, jis gali naudoti podėlyje saugomą adresą, bet kai profilis keičia adresus arba podėlio įrašas pasensta, rankos paspaudimas nukrypsta į adresą, kurio leidimo taisyklė neapima. IPv6 tai padaro matoma, nes dvigubo kamino galutinis taškas gali skelbti ir A, ir AAAA įrašą, o leidimo taisyklė, apimanti tik v4 adresą, palieka klientą kartoti bandymus prieš užblokuotą v6 adresą.
Parinkčių pavadinimai ir numatytosios reikšmės skiriasi priklausomai nuo kliento ir versijos, todėl skaitykite dokumentuotą sąrašą savo klientui, o ne spėliokite iš ekrano kopijų. OpenVPN Connect nustatymų nuoroda adresu openvpn.net/connect-docs/app-settings-windows yra vienas pavyzdys, kaip klientas aprašo savo blokavimo ir padalinto tunelio parinktis.
Fail-closed yra būsenų mašina, o ne jungiklis
Dauguma klientų bloką išreiškia kaip užkardos politiką trijose būsenose: tunelis pakeltas, srautas eina per tunelį ir bloko nėra; tunelis nuleistas, blokas aktyvus; ir perėjimas, kai blokas aktyvus plius laikinos išimtys galutiniam taškui. Būtent trečioje būsenoje gyvena klaidos, nes ji turi pasikeisti du kartus per kelias sekundes, o negalėjimas iš jos išeiti atrodo lygiai taip pat kaip nuolatinis blokas.
Mechanizmas skiriasi pagal platformą, ir gedimas taip pat. Windows Filtering Platform filtrai turi svorius, todėl blokuojantis filtras, viršijantis jūsų leidimą, toliau meta paketus, nors leidimas egzistuoja, ir filtrai, kuriuos paliko nužudytas kliento procesas gali išlaikyti įrenginį neprisijungusį po to, kai programos nebeliko. macOS klientai paprastai rašo pf taisykles į inkarą, kur taisyklių tvarka ir greiti sprendimai lemia, kuri taisyklė galioja. Linux klientai paprastai valdo nftables arba iptables grandinę su drop politika ir aiškiais leidimais galutiniam taškui, tunelio sąsajai ir loopback. Android always-on VPN su parinktimi blokuoti ryšius be VPN yra griežčiausias grupėje, nes operacinė sistema bloką taiko visam įrenginiui, o ne atskirai programai.
WireGuard reikia atskiros pastabos, nes AllowedIPs yra maršruto parinkėjas, o ne blokatorius. Jis nusprendžia, kurie tikslai patenka į tunelį; jis nieko nedaro, kad paketas be tunelio neišeitų per Wi-Fi. Sąrankoje tik su WireGuard ir be užkardos taisyklės kill switch iš tikrųjų yra maršruto nebuvimas, o po numesto rankos paspaudimo per fizinę sąsają gali išeiti tikras paketas.
Matuokite spragą, o ne žiūrėkite į piktogramą
Stebėkite paketus, o ne būsenos lemputę. Linux sistemoje viename terminale paleiskite lėtą ping į viešą adresą, o kitame užfiksuokite tunelio transporto prievadą fizinėje sąsajoje:
ping -i 0.2 -c 100 1.1.1.1 | tail -5
sudo tcpdump -ni eth0 'udp port 51820'
Perjunkite serverį kliente, kol abu veikia. Svarbūs trys dalykai: kiek laiko ping sustoja, ar fiksavimas rodo, kad rankos paspaudimas pasiekia naują galutinį tašką, ir ar srautas grįžta prieš kliento būsenai pasikeičiant į prisijungta, ar po to. Jei ping spraga baigiasi pirmiau, blokas arba nuimtas per anksti, arba tunelis pakeltas anksčiau, nei indikatorius tai pripažįsta. Jei spraga baigiasi vėliau, indikatorius pernelyg optimistiškas.
Windows sistemoje netsh wfp show state įrašo momentinę kopiją, kurioje galite ieškoti blokuojančių filtrų, kurie vis dar yra, nors klientas tvirtina esąs atjungtas. macOS sistemoje sudo pfctl -sr išvardija įkeltas taisykles ir jų tvarką. Susiekite bet kurią momentinę kopiją su paties kliento žurnalu; jūsų ping laiko juosta pasako, ar blokas baigėsi vėlai, ar niekada.
Įprastas užtemimas prieš įstrigusį bloką
Tam tikras pertraukimas yra šios funkcijos esmė, todėl pirmiausia įvertinkite, o tik tada keiskite bet kokį nustatymą:
| What you see | Usually means | Next check |
|---|---|---|
| Two or three seconds of timeouts, then normal browsing | Expected fail-closed gap | Nothing to fix |
| State says connected, traffic stays dead | Block filter or route left behind | Firewall snapshot, client log |
| One app dead while others work | TCP session bound to the old exit address | Restart the app |
| LAN devices unreachable after the switch | LAN exception not reapplied | Allow-LAN or split-tunnel setting |
| New server hangs, the old one reconnects | Permit covers only the old address | Resolved address of the new host, including AAAA |
Jei patekote į antrą ar penktą eilutę, neišjunkite kill switch bandymui, nes tai paverčia maršruto klaidą nuotėkiu. Paleiskite kliento tarnybą iš naujo arba perkraukite įrenginį ten, kur filtrai išlieka nužudžius procesą, ir pažiūrėkite, ar blokas išsivalo. Jei išsivalo, gedimas yra valyme perjungimo metu, o ne pačiame bloke.
Prieš kitą perjungimą patvirtinkite keturis dalykus: galutinio taško leidimas apima visas adresų šeimas, kurias išsprendžia jūsų profilis, kliento žurnalas rodo užbaigtą perėjimą, jūsų ping testas matuoja spragą, o ne piktogramą, ir kliento uždarymas atkuria įprastą ryšį. Kill switch, kuris išlaiko perjungimą ir po jo atleidžia, atlieka savo darbą. Tas, kuris atleidžia anksti arba niekada, vertas derinimo.