Lokálna aplikácia, pravidlo VPN: prečo sa váš reťaz FORWARD nikdy nespustí
Proces na stroji používa OUTPUT, nie FORWARD. Vyberte hook v správnom mennom priestore a potom rozhodnite, či stačí značka alebo obyčajná trasa.
Pridáte pravidlo pre VPN prevádzku do reťazca FORWARD, spustíte požiadavku z toho istého linuxového stroja a počítadlo zostane na nule. Pravidlo je pravdepodobne správne. Paket nikdy nešiel touto cestou, pretože požiadavku vytvorenú na samotnom stroji tento stroj nepreposiela. Sledovanie života paketu od socketu k drôtu vysvetľuje prečo, a kam pravidlo vlastne patrí.
Zistite, kde sa paket narodil
Poradie hookov v Netfiltri oddeľuje tri prípady a len jeden z nich zahŕňa FORWARD:
| Origin | Path | Hook that sees it |
|---|---|---|
| Local process | OUTPUT then POSTROUTING | OUTPUT, POSTROUTING |
| Addressed to a local service | PREROUTING then INPUT | PREROUTING, INPUT |
| Received for another host | PREROUTING, FORWARD, POSTROUTING | FORWARD |
Lokálna aplikácia začína v ceste OUTPUT, pretože jadro už určilo, že paket vzniká tu a nikdy nie je kandidátom na preposielanie. Vytvorenie tunela túto klasifikáciu nemení; tunel je zariadenie, ktorým paket môže odísť, nie fáza, ktorá mení lokálny výstup na tranzit.
Dva pakety, jeden príbeh
Keď je tunel hore, vnútorný paket aplikácie a zašifrovaný vonkajší paket sú rôzne objekty. Vnútorný paket nesie cieľ a užitočné zaťaženie, ktoré vybrala aplikácia. Vonkajší paket nesie šifrovaný text na adresu a port partnera, a práve on skutočne prechádza fyzickým rozhraním.
Vaša politika sa týka jedného z nich, a výber nesprávneho je častou príčinou, prečo sa zdá, že pravidlo nič nerobí. Pravidlo zhodujúce sa s vonkajšou adresou partnera vidí každý paket tunela rovnako, nech aplikácia vnútri robí čokoľvek. Pravidlo zhodujúce sa s vnútorným cieľom vidí prevádzku, ktorá vás zaujíma, a spustí sa len vtedy, keď sa ten paket dostane k hooku, na ktorom ste pravidlo nainštalovali.
Menné priestory posúvajú hranicu
Kontajner to sťažuje bez zmeny princípu. Požiadavka aplikácie je lokálny výstup vnútri sieťového menného priestoru kontajnera. Hostiteľ prijíma túto prevádzku na virtuálnom ethernetovom rozhraní a môže ju preposlať, takže pravidlo FORWARD na hostiteľovi môže mať zmysel, aj keď proces, ktorý požiadavku vytvoril, sa nikdy nedotkol reťazca OUTPUT hostiteľa.
Pred výberom hooku zistite, kde naozaj žijú sada pravidiel a tunel. Tunel vnútri kontajnera, tunel na hostiteľovi s kontajnerom smerovaným cez neho a tunel v samostatnom mennom priestore sú tri rôzne topológie s tromi rôznymi umiestneniami pravidiel. Čítajte pravidlá vnútri menného priestoru, ktorý vlastní zariadenie, nielen v predvolenom.
Spýtajte sa, či vôbec potrebujete značku
Ak je cieľom poslať jeden cieľový prefix tunelom, trasa pre tento prefix môže stačiť. Najprv skontrolujte platné trasy, vrátane všetkého, čo server vtlačil: presmerovaná predvolená trasa posiela cez VPN oveľa viac prevádzky než úzka politika, ktorú ste mali na mysli, a žiadne množstvo značenia nedosiahne, aby výsledok zodpovedal zámeru.
Klasifikácia je potrebná, keď rozhodnutie závisí od niečoho, čo trasa nedokáže vyjadriť, napríklad od zdroja, používateľa alebo procesu. Pre prijímanú prevádzku značenie v PREROUTING funguje. Pre lokálnu prevádzku sa značenie musí udiať vo výstupnej fáze, ktorá po nastavení značky dokáže vyvolať nové hľadanie trasy. V nftables je to reťazec typu route na výstupnom hooku; bežný výstupný filtračný reťazec hodnotu nastaví a trasu nechá nezmenenú.
V iptables ekvivalent žije v usporiadaní mangle OUTPUT a platí rovnaká požiadavka: rozhodnutie o smerovaní sa musí prehodnotiť po tom, čo značka existuje. Potom pravidlo politiky musí značku spotrebovať a ukázať na tabuľku s použiteľnou trasou. Nastavenie značky conntrack je tretia, samostatná operácia; ukladá hodnotu na tok a samo o sebe túto hodnotu nedá na aktuálny paket, aby ju smerovanie prečítalo.
Overte hľadanie aj počítadlo spolu
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
Adresa a značka sú ilustratívne a dve otázky na trasu odpovedajú na rôzne otázky. Druhá sa pýta, čo by jadro urobilo, keby paket niesol tú značku; neukazuje, že vaša sada pravidiel nejakú prideľuje. Berte ju ako test hypotézy, nie ako dôkaz, že politika funguje.
Potom spustite neškodnú požiadavku a sledujte dve veci naraz: počítadlo na zvolenom hooku a výstup, ktorý paket skutočne použil. Ak sa počítadlo hýbe a paket odchádza inam, značka alebo tabuľka je nesprávna. Ak sa nehýbe ani jedno, paket sa k tomu hooku vôbec nedostane, a ďalšou otázkou je menný priestor alebo cesta.
Napokon obmedzte test na to, čo mechanizmus dokáže vyjadriť. Jedna trasa pre jednu adresu sa nestane trvalou politikou pre službu, ktorej adresy sa menia. Najprv rozhodnite rozsah paketov a potom skontrolujte, či návrh smerovania a značenia udrží tento rozsah po opätovnom pripojení.