Jedna služba hostitele musí odpovídat internetu přes fyzický vzestupný spoj, zatímco všechno ostatní na stroji dál používá tunel. Zda směrování založené na politice tuto zátěž unese, rozhodují tři podmínky a každou z nich lze před psaním pravidla levně ověřit. Služba musí končit na tomto hostiteli, ne za DNAT nebo přesměrovaným portem, vlastní pravidla VPN musí výjimku povolit a musíte porovnávat odpověď, nikoli požadavek. Selže-li kterákoli ze tří, příkazy níže se načtou bez chyby, ale neudělají nic užitečného.

Před psaním pravidla ověřte tři podmínky

Kontejner, který publikuje port přes DNAT, nebo server za přesměrováním portu, vytváří pakety, které na tomto hostiteli nevznikají. Tyto pakety se přeposílají, takže pravidlo navázané na místní vstup hostitele je nikdy nevidí a provoz dál používá výchozí trasu. Než budete pokračovat, potvrďte, kde služba skutečně běží, protože to je podmínka, kterou lidé pletou nejčastěji.

Druhá podmínka je politika, ne mechanika. Každá trasa, která tunel obchází, je výjimkou z účelu tunelu, a na spravovaném hostiteli patří to rozhodnutí tomu, kdo vlastní politiku, ne člověku, který ladí časový limit.

Porovnávejte odpověď, ne cílový port klienta

Odpověď serveru naslouchajícího na TCP 443 opouští hostitele se zdrojovým portem 443. Prohlížeč na stejném hostiteli, který se připojuje ke vzdálenému webu HTTPS, posílá efemérní zdrojový port a cílový port 443. Obojí je provoz portu 443 a jen jedno z toho má použít tabulku WAN, proto by shoda cílového portu zachytila špatnou polovinu.

Směr odpovědi je to, co dokážete rozlišit. Porovnejte zdrojový port, omezte pravidlo na místně vytvořené pakety a pravidlo pokryje vlastní odpovědi služby, aniž by se dotklo požadavků prohlížeče.

Než pravidlo na tabulku ukáže, vytvořte úplnou návratovou tabulku

Prázdná tabulka znamená žádnou trasu, což vypadá jako rozbitá služba, ne rozbitá politika. Nejprve ji naplňte číslem tabulky a prioritou, které nic jiného na hostiteli nenárokuje:

ip -4 route add table 100 192.0.2.0/24 dev eth0
ip -4 route add table 100 default via 192.0.2.1 dev eth0
ip -4 rule add priority 1000 iif lo ipproto tcp sport 443 lookup 100

Čísla čtěte ze živého hostitele, nekopírujte je. ip -4 rule show vám řekne, které priority jsou obsazené, a přidání pravidla na již existující prioritu tiše změní pořadí dvou pravidel, která sama o sobě vypadají v pořádku.

Skutečnou práci tu dělají dva selektory. iif lo je způsob, jakým jádro hlásí pakety, které hostitel sám vytvořil, takže pravidlo nemůže omylem zachytit přeposílaný provoz přicházející zvenčí. ipproto tcp sport 443 zužuje na jeden transport a jeden port, což je tak těsné, jak požadavek dovolí. Odeberte selektor protokolu a pravidlo zachytí i UDP 443, což je jiná služba s jiným chováním.

Privátní odpovědi udržte uvnitř tunelu

Pokud stejný posluchač odpovídá i klientům na privátní straně, výchozí WAN trasa typu catch-all v tabulce 100 se pokusí tyto odpovědi vrátit přes vzestupný spoj. Přidejte privátní prefixy, které nesmějí následovat výchozí WAN trasu, nebo je nechte propadnout na další pravidlo politiky:

ip -4 route add table 100 throw 10.90.0.0/24

Trasa throw ukončí vyhledávání v této tabulce a vrátí paket seznamu pravidel, takže následující politika VPN dostane svou šanci. Sama nic do tunelu nesměruje, a pokud žádné pozdější pravidlo nemá odpovídající trasu, paket přesto selže; ověřte následující politiku, místo abyste předpokládali, že throw je oprava.

Filtrování reverzní cesty a pravidla firewallu hostitele stále platí pro přicházející požadavek. Podívejte se na jejich skutečné verdikty, než validaci uvolníte, protože výjimka ve směrování nezpůsobí, že rp_filter přijme návratovou cestu, kterou považuje za nemožnou.

Otestujte TCP, pak QUIC, pak restart

Otevřete jedno spojení z autorizovaného externího klienta a jedno z privátní strany, pak prozkoumejte vyhledání odpovědi se skutečnými adresami a porty. Pokud externí odpověď použije tabulku 100 a privátní ne, politika dělá to, o co jste požádali.

HTTP/3 se poskytuje přes UDP a pravidlo TCP ho nezachytí, takže posluchač QUIC potřebuje vlastní selektor, jinak bude dál používat tunel, zatímco HTTPS funguje. Uložte pravidla, na kterých se ustálíte, u komponenty, která vlastní rozhraní, a potvrďte je po opětovném připojení nebo obnovení DHCP. Když konkurenční správce po restartu odstraní běhovou trasu, je to problém vlastnictví, který se má řešit u zdroje, ne důvod přidávat navrch širší pravidla NAT.

Související články