Směrování podle účtu se hodí, když každý IPv4 socket vlastněný jedním uživatelem Linuxu má odcházet existujícím tunelem, a nehodí se, když potřebujete izolaci na úrovni programu. Vybere podle UID, takže do rozsahu spadá vše, co pod tímto účtem běží, včetně dávkové úlohy, na kterou jste zapomněli. Tuto otázku vyřešte, než se dotknete jediného ip rule.

Příklad níže předpokládá vyhrazený účet prohlížeče na UID 1500, tunelové zařízení tun-office s lokální adresou 10.80.0.11 a VPN, která povoluje dotčené cíle. Sám démon běží mimo toto UID.

Tři podmínky, které určí mechanismus

Pravidlo UID zvolte, když je identitou vykonávající práci účet, když je přijatelné přesunout veškerý jeho provoz a když by namespace byl těžší, než si úkol zaslouží. Síťový namespace zvolte, když pracovní zátěž potřebuje vlastní rozhraní, resolver a směrovací tabulku. Proxy nebo vazbu na proces zvolte když se má přesunout právě jedna aplikace, zatímco zbytek relace zůstává na lokální cestě. Zapsání těchto tří věcí zabrání pravidlu, které tiše pokrývá víc, než bylo zamýšleno.

Chyba, které je třeba se vyhnout, je předpoklad, že vlastníka určuje spouštěč. Prohlížeč, kterému předala URL relace jiného uživatele, nevytvořil sockety pod UID 1500 a žádné pravidlo nepřesune provoz, který generuje.

Tabulka, pravidlo a pojistka

Po kontrole stávajících pravidel a volbě nepoužitých čísel tabulky a priority je uspořádání krátké: výchozí trasa ve vyhrazené tabulce nesoucí zdrojovou adresu tunelu, pravidlo, které posílá dotazy účtu do této tabulky, a ukončující pravidlo, které blokuje záložní cestu. Zapsáno je to idempotentní nahrazení trasy, ip -4 route replace default dev tun-office src 10.80.0.11 table 51820, následované ip -4 rule add priority 12100 uidrange 1500-1500 lookup 51820.

Pojistkou je ip -4 rule add priority 12101 uidrange 1500-1500 unreachable a je důležitější, než naznačuje její délka. Bez ní chybějící trasa v tabulce 51820 propadne do běžného upstreamu a účet tiše uniká provoz, který měla politika zachytit. S ní se stejná porucha změní na timeout, tedy na blokování, ne na záložní cestu.

Běžné pravidlo lokální adresy držte před těmito a vědomě rozhodněte, zda výjimky pro LAN nebo správu patří před zvolenou tabulku. Výchozí trasa nalezená tam se později neptá main na konkrétnější trasu LAN, což překvapí ty, kdo čekají, že shoda nejdelšího prefixu platí napříč tabulkami. Zamýšlený seznam výjimek napište do poznámky ke změně, dokud je zdůvodnění ještě čerstvé.

Co směrování podle UID vynechává: DNS

Démon resolveru otevírá své upstream sockety pod vlastním UID, takže volba 1500 nepřesune tyto dotazy do tabulky 51820. Integrace DNS je samostatné rozhodnutí: namiřte účet na resolver dosažitelný tunelem, nebo přijměte, že překlad názvů sleduje cestu hostitele, zatímco provoz ne.

Dotaz přes loopback na lokální stub není důkazem, že upstream dotaz použil trasu prohlížeče, a úspěšné načtení stránky z cache také ne.

IPv6 potřebuje v návrhu vlastní větu

Pravidla výše pokrývají jen IPv4. Pokud je požadavkem tunel IPv4 bez přímého IPv6 z tohoto účtu, přidejte zrevidované ukončující pravidlo jako ip -6 rule add priority 12101 uidrange 1500-1500 unreachable, pak zkontrolujte dřívější pravidla IPv6 a výjimky loopback, které chcete zachovat.

Blokování přímého IPv6 není dual-stack tunelování; je to hranice. Nazývat to tunelováním zmate dalšího člověka, který politiku přečte, a zmatek vyplave jako tiket podpory o rozbitém webu IPv6.

Ověřte se skutečným účtem a pak převezměte životní cyklus

Porovnejte dotazy: ip -4 route get 198.51.100.25 uid 1500 proti stejnému cíli s běžným UID. Pak vytvořte povolený požadavek pod vyhrazeným účtem a zkontrolujte zdrojovou adresu, kterou vidí vzdálená strana. Preferovaná zdrojová adresa není source NAT a nepřebije aplikaci, která váže něco jiného. Pokud oba dotazy vracejí stejnou cestu, pravidlo nedělá to, co si myslíte.

Tabulku, pravidla a životnost trasy tunelu držte pod jedním vlastníkem, otestujte opětovné připojení a ztrátu tunelu a při rušení politiky odstraňte jen její přesné položky. Namespace je stále k dispozici, pokud skutečně potřebujete oddělená rozhraní a oddělený stav.

Související články