Přidáte pravidlo pro VPN provoz do řetězce FORWARD, spustíte požadavek ze stejného linuxového stroje a čítač zůstane na nule. Pravidlo je pravděpodobně správné. Paket touto cestou nikdy nešel, protože požadavek vzniklý na samotném stroji se jím nepředává. Sledování života paketu od socketu k drátu vysvětluje proč a kam pravidlo vlastně patří.

Najděte, kde se paket narodil

Pořadí hooků v Netfilteru odděluje tři případy a jen jeden z nich zahrnuje FORWARD:

OriginPathHook that sees it
Local processOUTPUT then POSTROUTINGOUTPUT, POSTROUTING
Addressed to a local servicePREROUTING then INPUTPREROUTING, INPUT
Received for another hostPREROUTING, FORWARD, POSTROUTINGFORWARD

Místní aplikace začíná v cestě OUTPUT, protože jádro už zjistilo, že paket vzniká zde a nikdy není kandidátem na předávání. Vytvoření tunelu tuto klasifikaci nemění; tunel je zařízení, kterým paket může odejít, ne fáze, která z místního výstupu dělá tranzit.

Dva pakety, jeden příběh

Jakmile tunel běží, vnitřní paket aplikace a šifrovaný vnější paket jsou různé objekty. Vnitřní paket nese cíl a užitečné zatížení, které aplikace zvolila. Vnější paket nese šifrový text na adresu a port protějšku a právě on skutečně prochází fyzickým rozhraním.

Vaše politika se týká jednoho z nich a volba špatného je častou příčinou, proč se zdá, že pravidlo nic nedělá. Pravidlo odpovídající vnější adrese protějšku vidí každý paket tunelu stejně, ať aplikace uvnitř dělá cokoli. Pravidlo odpovídající vnitřnímu cíli vidí provoz, který vás zajímá, a spustí se jen tehdy, když se tento paket dostane k hooku, na který jste pravidlo nainstalovali.

Jmenné prostory posouvají hranici

Kontejner to ztěžuje, aniž by měnil princip. Požadavek aplikace je místní výstup uvnitř síťového jmenného prostoru kontejneru. Hostitel tento provoz přijímá na virtuálním ethernetovém rozhraní a může jej předat, takže pravidlo FORWARD na hostiteli může mít smysl, i když proces, který požadavek vytvořil, nikdy nesáhl na řetězec OUTPUT hostitele.

Než zvolíte hook, zjistěte, kde sada pravidel a tunel skutečně žijí. Tunel uvnitř kontejneru, tunel na hostiteli s kontejnerem směrovaným skrz něj a tunel v samostatném jmenném prostoru jsou tři různé topologie se třemi různými umístěními pravidel. Čtěte pravidla uvnitř jmenného prostoru, který vlastní zařízení, ne jen v tom výchozím.

Ptejte se, zda vůbec potřebujete značku

Pokud je cílem poslat jeden cílový prefix tunelem, stačí možná trasa pro tento prefix. Nejprve zkontrolujte efektivní trasy, včetně všeho, co server protlačil: přesměrovaná výchozí trasa posílá tunelem VPN mnohem více provozu než úzká politika, kterou jste měli na mysli, a žádné množství značení tomu výsledek nepřiblíží záměru.

Klasifikace je potřeba, když rozhodnutí závisí na něčem, co trasa neumí vyjádřit, například na zdroji, uživateli nebo procesu. Pro přijímaný provoz funguje značení v PREROUTING. Pro místní provoz se značka musí nastavit ve výstupní fázi, která po nastavení značky dokáže vyvolat nové hledání trasy. V nftables je to řetězec typu route na výstupním hooku; běžný výstupní filtrační řetězec hodnotu nastaví a trasu nechá beze změny.

V iptables ekvivalent žije v uspořádání mangle OUTPUT a platí stejný požadavek: rozhodnutí o směrování se musí přehodnotit poté, co značka existuje. Pak musí pravidlo politiky značku spotřebovat a ukázat na tabulku s použitelnou trasou. Nastavení značky conntrack je třetí, samostatná operace; uloží hodnotu na tok a samo o sobě tuto hodnotu nedá na aktuální paket, aby ji směrování přečetlo.

Ověřte hledání i čítač společně

nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1

Adresa i značka jsou ilustrativní a dva dotazy na trasu odpovídají na různé otázky. Druhý se ptá, co by jádro udělalo, kdyby paket tuto značku nesl; neukazuje, že vaše sada pravidel nějakou přiřazuje. Berte jej jako test hypotézy, ne jako důkaz, že politika funguje.

Potom spusťte neškodný požadavek a sledujte dvě věci zároveň: čítač na zvoleném hooku a výstup, kterým paket skutečně odešel. Pokud se čítač hýbe a paket odchází jinam, značka nebo tabulka je špatně. Pokud se nehýbe ani jedno, paket se k onomu hooku vůbec nedostává a další otázkou je jmenný prostor nebo cesta.

Nakonec omezte test na to, co mechanismus umí vyjádřit. Jedna trasa pro jednu adresu se nestane trvalou politikou pro službu, jejíž adresy rotují. Nejprve rozhodněte rozsah paketů a potom zkontrolujte, zda návrh směrování a značení tento rozsah udrží i po opětovném připojení.

Související články