Skript při odpojení, nebo pravidlo firewallu: co zastaví únik?
Shazování rozhraní při odpojení je hrubé a často běží bez oprávnění. Srovnejte ho s pravidlem firewallu, které přežije výpadek a uzavře mezeru.
Dva návrhy slibují totéž: když tunel spadne, nic neodejde ven v otevřené podobě. Jeden spustí při odpojení skript a odřízne rozhraní. Druhý nechá pravidlo firewallu v platnosti a po klientovi VPN nic nechce. Liší se v tom, kdo má oprávnění jednat, co se děje během mezery a jak se stroj potom vrátí do sítě. Srovnávat je v těchto třech bodech je užitečnější než hádat se, které je přísnější.
Stejná práce dvěma mechanismy
Klient může spouštět háky při navázání tunelu i při jeho odpojení, pokud profil povoluje spouštění skriptů. Tento hák běží uvnitř životního cyklu klienta, v okamžiku, kdy se spojení zavírá. Pravidlo firewallu naopak patří systému a nezajímá ho, zda klient běží, spadl nebo byl zabit.
| Property | Teardown script | Firewall unit |
|---|---|---|
| Runs when the client is killed | No | Yes |
| Needs privilege at teardown time | Usually yes | Configured once, at boot |
| Acts on the whole machine | Often, including recovery paths | Only on the flows it matches |
Celý argument je v této tabulce. Skript, který běží jen při řádném ukončení, pokrývá případ, který vás zneklidňoval nejméně; důležitý případ je pád nebo zmizení sítě a ani jeden z nich neposkytuje čisté odpojení.
Co hák při odpojení umí a co ne
Zdokumentovaný vzor prochází síťová rozhraní a shazuje vše kromě loopback. Když je fyzické zařízení dole, nic nemůže uniknout mimo tunel, což je přesně záměr.
#!/bin/sh
for dev in /sys/class/net/*; do
name=$(basename "$dev")
[ "$name" = lo ] || ip link set dev "$name" down
done
Shodí také místní síť, jakoukoli službu, kterou stroj hostuje, a cestu, kterou byste použili k opravě problému. Na notebooku občas bezdrátové zařízení potřebuje potom ruční přepnutí, takže krátký výpadek se změní v opravnou seanci. Horší je, že háku to nemusí být vůbec dovoleno: když klient odhodí oprávnění, skript při odpojení běží pod neprivilegovaným účtem a každá změna rozhraní selže s chybou oprávnění zapsanou v okamžiku, kdy nikdo nečte log.
Než háku uvěříte, zkontrolujte, jak se klient spouští. Skript, který funguje při ručním spuštění jako root, nic nedokazuje o službě, která startuje při bootu.
Co pravidlo firewallu dělá jinak
Pravidlo, které povoluje jen provoz tunelu, funguje dál i tehdy, když proces klienta zmizí, protože jádro na něm nezávisí. Pravidlo je také užší: blokuje přesně toky, na které sedí, a nechává loopback, místní podsíť a cestu pro obnovu na pokoji, a proto stroj neuvízne.
Cena je v tom, že pravidlo musí napsat a udržovat ten, kdo vlastní firewall hostitele, a musí pojmenovat tunelové zařízení, které klient skutečně vytváří. To znamená, že pravidlo a profil se musí udržovat společně; přejmenované rozhraní zanechá firewall, který blokuje všechno a nic nevysvětlí.
Ani jeden mechanismus nečiní ten druhý nadbytečným. Pravidlo firewallu, které se po úpravě nikdy znovu nenačte, je stejně fiktivní jako skript, který nikdy neběží.
persist-tun rozhoduje, zda mezera existuje
Když tunelové zařízení přežije odpojení, přežijí i trasy, které do něj míří. Provoz se pak zahazuje místo přesměrování, takže výchozí trasa nespadne zpět na fyzickou bránu. Právě toto chování činí únik nepravděpodobným ještě dřív, než do hry vstoupí jakékoli pravidlo firewallu.
Bez tohoto nastavení se zařízení odstraní i s trasami a výchozí trasa může znovu ukázat na fyzickou bránu. Zda to udělá, závisí na platformě a klientovi, a právě proto se má stav pozorovat, ne předpokládat. Berte nastavení jako součást kill switch, ne jako volbu výkonu.
Udržte cestu pro opětovné připojení živou a pak otestujte čtyři stavy
Přísný blok může klientovi zabránit i v opětovném připojení, protože klient stále potřebuje trasu k serveru přes fyzickou bránu, zatímco všechno ostatní je zakázané. Nainstalujte hostitelskou trasu pro tuto jedinou adresu dřív, než tunel vstane, a nejprve přeložte jméno, protože DNS může být v době, kdy ho potřebujete, zablokované.
ip route add 198.51.100.20/32 via 192.168.0.1 dev wlan0
Pak ověřujte stavy, ne etiketu. Záměrně projděte čtyři okamžiky: studený start bez tunelu, zdravou relaci, výpadek, který nikdo nevyžádal, a relaci po obnovení. V každém okamžiku přečtěte výchozí trasu a odešlete jeden požadavek, jehož výstupní adresa je vidět. Aplikace, která to vzdá, dokud je tunel dole, nic neříká o poštovním klientovi nebo aktualizátoru, takže poslední kontrolu zopakujte s jednou aplikací na pozadí. Zapište pravidlo, názvy rozhraní i kroky obnovy, protože kill switch, který nikdo nedokáže ověřit, je jen pověst.