Jak uzamknout výstup na Linuxu, aby při výpadku VPN nic neuniklo
Směrování a filtrování jsou oddělená rozhodnutí. Zamkněte výstupní hák a pak ohraničte výjimky pro koncový bod, DNS a správu, které tunel potřebuje k opětovnému připojení.
Představte si mediální box na domácí lince, který má internet dosahovat jen tunelem. Když tunel spadne, aplikace by se měla zastavit, místo aby tiše pokračovala přes fyzické rozhraní. Dosáhnout tohoto chování je problém firewallu, nikoli směrování, a ten rozdíl je důležitý, protože trasu lze nahradit restartem démona, kdežto filtr zůstává tam, kam jste ho umístili. Následuje, jak cesta paketu skutečně rozhoduje, a pak jak ohraničit výjimky, které drží tunel při opětovném připojování.
Lokální výstup je jiný hák než předávání
Paket opouštějící aplikaci na stroji prochází výstupním hákem; paket, který stroj směruje pro jiný hostitel, prochází předáváním. Politika, která zmiňuje jen forward, omezuje druhé a nechává první zcela otevřené, a proto tolik zámků výstupu vypadá správně a nedělá nic. Párování rozhraní patří do stejného pravidla: oifname "tun0" accept propouští provoz, který už byl tunelem směrován. Směrování a filtrování také zůstávají oddělená rozhodnutí, takže trasa k poskytovateli může existovat, zatímco filtr paket odmítá. Na tomto oddělení stavíte.
Brána, která předává provoz jiným zařízením, potřebuje oba háky. Zamknout jen výstup chrání samotný stroj a každému klientovi níž nechává volnost unikat.
Seznam výjimek pište od koncového bodu ven
Začněte u koncového bodu tunelu: jedna cílová adresa nebo malá schválená množina, transportní protokol a cílový port, například udp dport 1194 ip daddr 203.0.113.7 accept. Pokud klient překládá název hostitele, potřebuje počáteční výměna DNS vlastní pravidlo omezené na resolver a na port 53, nikoli plošné povolení adresy toho resolveru. Každá výjimka by měla pojmenovat důvod, proč existuje. Povolení veškerého UDP provozu na port VPN pokrývá mnohem víc než jedinou autentizovanou službu, kterou jste měli na mysli.
Právě při počátečním překladu zámky obvykle hnijí. Množina adres obnovovaná časovačem potřebuje definované chování, když obnovení selže, a tím chováním nesmí být otevření linky, dokud se to nepodaří. Obnovujte tunelem, dokud tunel stojí, a jinak se vraťte k poslednímu známému funkčnímu koncovému bodu.
Lokální správa potřebuje stejné zacházení. Správní podsíť není důvěryhodná jen proto, že její adresy jsou privátní, a pravidlo, které jí věří, zve druhou cestu kolem zámku.
Párování rozhraní není důkaz zdravého tunelu
Pravidla, která přijímají vše vycházející z tun0, předpokládají, že paket na tomto rozhraní přišel z tunelu. Názvy rozhraní se znovu vytvářejí a název není kryptografická identita. Protistrana také může zmizet, zatímco rozhraní zůstává nahoře, a pravidlo se tím mění ve velmi přesvědčivou nečinnost.
Sledování spojení přidává příbuznou past. Široké pravidlo pro navázaná spojení přehrává oprávnění, které tok získal dřív, takže relace zahájená před pádem tunelu funguje dál. Omezte stavové přijímání na rozhraní a adresy, které skutečně myslíte, jinak jste postavili zámek, který se sám otevírá. Vstupní a výstupní pravidla také odpovídají na různé otázky a zpevnění jednoho při ignorování druhého nechává stroj dostupný ve směru, o kterém jste neuvažovali.
Co přežije pád démona
Filtr nainstalovaný skriptem, který běží po vzestupu tunelu, zmizí spolu s tunelem, přesně v okamžiku, kdy byl potřeba. Načítejte zámek při startu a nechte démona spravovat jen jeho výjimky.
Smazání výchozí trasy také není náhradou. Trasa je stav, který démon vlastní a přepisuje, a její odstranění může vzít cestu potřebnou k opětovnému připojení. IPv6 potřebuje vlastní plán, protože objevování sousedů a oznámení routerů jsou linkové služby, které musí fungovat dál, zatímco běžný provoz je blokován. DHCP patří do stejné kategorie. Zapište tyto věci jako výjimky s účelem, místo abyste je později objevovali jako výpadky.
Cesta obnovy před nasazením
Testujte zámek tak, jak selže: start bez tunelu, zabití démona, změna koncového bodu a opětovné připojení. Každý případ by měl zastavit aplikace a nechat záchranný kanál funkční. Dělejte to z konzole, protože vzdálený shell je relace, kterou vaše vlastní pravidlo nejpravděpodobněji zamkne.
Pak zkontrolujte, kam se běžná aplikace ještě dostane, s neškodným cílem a požadavkem, který můžete ověřit. Výsledek, který chcete, je odmítnutí na lince a úspěch tunelem, ne dvojznačné čekání, které může znamenat obojí. Držte sadu pravidel pod stejným vlastníkem jako zbytek firewallu, místo abyste nahrazovali celou tabulku ze shell skriptu. Politika, v níž každé povolení umí zdůvodnit samo sebe, má větší cenu než dlouhá sada pravidel, kterou nikdo nedokáže vysvětlit.