Vynětí jednoho portu z VPN vyžaduje směrování podle politiky
Pravidlo NAT přepisuje adresy, ale nevybírá výstupní rozhraní. Tady je pravidlo, tabulka a značka, které opravdu udrží jeden port TCP mimo tunel.
Požadavek je vždy variantou stejné věty: nech VPN na prohlížení, ale ať SSH nebo úloha zálohování použije normální připojení. Rada, která se k tomu šíří, tedy přesměrovat port pravidly iptables NAT, to nedělá. Pravidlo NAT přepisuje adresy a porty uvnitř toku; nikdy nevybírá, kterým rozhraním paket odejde. To rozhodnutí patří vyhledání trasy a to potřebuje pomoc, aby port vidělo.
Proč běžná trasa nedokáže odpovídat portu
Linux vybírá trasu vyhledáním cílové adresy v tabulce, poté co kandidátní tabulky profiltruje pravidly politiky. Ta pravidla mohou odpovídat značce firewallu, zdrojové adrese, příchozímu rozhraní nebo UID. Samotný záznam trasy pole portu nemá, protože trasa se vybírá dřív, než záleží na hlavičce transportu.
Současné iproute2 a jádra rozšiřují selektor pravidla: ipproto, sport a dport se přijímají, takže ip rule add ipproto tcp dport 22 table 100 vyjadřuje záměr na jednom řádku. Spusťte ip rule add help na skutečném hostiteli a zjistěte, zda vaše sestavení uvádí dport. Pokud ano, máte hotovo jedním příkazem; pokud ne, cesta přes značku níže je ekvivalent.
Ať tak či onak, pravidlo je jen ukazatel. Tabulka 100 stále potřebuje trasu, a to je část, na kterou lidé zapomínají.
Tři části, nebo jedna
Moderní podoba je jediné pravidlo výše plus trasa v alternativní tabulce. Klasická podoba přidává doprostřed netfilter: označte paket a pak značku porovnejte v pravidle. Obě končí u stejného vyhledání; liší se v tom, kde se port čte.
Přístup se značkou existuje proto, že netfilter vidí hlavičku transportu, zatímco směrovací kód ji historicky neviděl. To je celý mechanismus a vysvětluje, proč je záložní variantou trojice spolupracujících částí, a ne jeden důmyslný příkaz.
Tři části popořadě
Nejprve označte toky, které chcete odklonit, v řetězu, který běží dost brzy na to, aby značka existovala před rozhodnutím o trase:
nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1Zadruhé pošlete označené pakety do samostatné tabulky:
ip rule add fwmark 0x1/0x1 table 100Zatřetí dejte té tabulce výchozí trasu přes fyzické rozhraní. Adresy jsou ilustrativní; nahraďte je svými:
ip route add default via 192.168.1.1 dev wlan0 table 100Přeskočte třetí krok a označený paket v tabulce 100 nenajde trasu, takže selže. Příznak vypadá, jako by pravidlo rozbilo síť, ale ve skutečnosti odstranilo jedinou cestu, která paketu zbývala.
Co ho udrží funkční i po prvním paketu
Značky platí pro odchozí pakety. Odpověď přichází na fyzické rozhraní s adresou, kterou toto rozhraní přidělilo, a hlavní tabulka může pro tento cíl stále upřednostňovat tunel. Dva mechanismy drží cestu odpovědi konzistentní: pravidlo založené na zdroji pro adresu rozhraní a sledování spojení, které rozhodnutí zachová po celou dobu života toku. Uložit značku do conntracku a obnovit ji u odpovědi je obvyklý způsob, jak udržet stavovou výjimku stabilní.
Filtrování zpětné cesty je druhý tichý zabiják. Pokud jádro přísně ověřuje návratovou cestu a odpověď dorazí na rozhraní, které by hlavní tabulka nezvolila, paket se zahodí bez hlášky. rp_filter má výchozí hodnoty různé podle distribuce a podle toho, zda se rozhraní přeposílá, proto čtěte účinnou hodnotu, místo abyste předpokládali, že je vypnuté.
Neoznačujte vlastní transport tunelu. Tunel WireGuard nebo UDP OpenVPN není TCP 22, takže recept výše je bezpečný, ale výjimka napsaná jako vše kromě cíle tunelu může zachytit šifrované pakety a rozbít tunel způsobem, který vypadá jako směrovací smyčka.
Ověřte to, místo abyste předpokládali
Zeptejte se jádra, kterou cestou by šlo, pro cíl i pro port, a potom spusťte skutečný přenos:
ip route get 203.0.113.10
ip rule show
nft list rulesetPokud značka existuje, ale počítače se nikdy nehnou, pravidlo neodpovídá. Počítače jsou rozdíl mezi konfigurací, kterou jste napsali, a politikou, kterou jádro uplatňuje.
Kdy je to špatný nástroj
Výjimky založené na portu jsou svou povahou křehké. Služby mění porty, HTTP/3 přichází jako UDP 443 a jedna aplikace může otevřít několik toků různých druhů. Pokud je skutečným požadavkem, aby tento program používal normální rozhraní, je směrovací vrstva špatné místo; síťový jmenný prostor nebo proxy pro jednotlivou aplikaci se hodí lépe.
Pokud je požadavkem, aby tato podsíť používala normální rozhraní, vynechejte značky úplně a přidejte konkrétnější trasu. Je to jednodušší, je to vidět v jedné tabulce a další člověk to může zkontrolovat, aniž by četl sadu pravidel.
Napište si, který ze tří požadavků skutečně máte, než se dotknete firewallu. Mechanismus výše je přesný a přesnost použitá na špatné vrstvě je jen delší výpadek.