Dvaja klienti môžu obaja otvoriť jump host a napriek tomu nemajú čo robiť s otváraním jeden druhého. Dosiahnuť službu je rozhodnutie o preposielaní, kým dosiahnuť partnera je rozhodnutie politiky, a väčšina stackov VPN ich drží v oddelených objektoch. Nič, čo nastavíte pre prvé, nevynucuje druhé. Úlohou teda nie je pridať pravidlo, ale nájsť objekt, ktorý na tomto serveri rozhoduje o prevádzke medzi partnermi, zapísať tam zákaz a dokázať ho z klienta.

Trasa k zdieľanej službe nie je povolenie medzi partnermi

Inzerovanie klientskej podsiete hovorí partnerovi, ako položiť paket na drôt k adrese iného klienta. Či sa paket doručí, sa rozhoduje neskôr, tým, čo ho preposiela. Na linuxovej bráne je to reťaz FORWARD; v démone v používateľskom priestore je to vlastná tabuľka relácií tunela. Trasa odpovedá na dosiahnuteľnosť a povolenie necháva nedotknuté.

Preto kontrola izolácie, ktorá číta len trasy, nič nedokazuje. /24 možno poslať každému klientovi, pričom každý paket medzi partnermi sa zahodí na háku preposielania. Nebezpečný je opačný prípad: žiadne výslovné pravidlo, povoľujúce predvolené nastavenie a izolácia, ktorá existuje len preto, že ju nikto netestoval.

Napíšte požiadavku na jeden riadok, skôr než otvoríte terminál. Dosiahnite blok služieb a jump host, nedosahujte nič iné v bloku klientov.

Zistite, kto paket partnera skutočne preposiela

Dve správania servera vyzerajú z klientskej strany rovnako a vyžadujú odlišné pravidlá. Buď jadro prepošle paket znova von z rozhrania tunela, alebo ho démon skopíruje medzi reláciami a jadro ho nikdy nevidí.

WireGuard patrí do prvej skupiny: nemá prepínač medzi partnermi, takže paket z 10.8.0.4 na 10.8.0.5 prichádza na wg0, narazí na hák preposielania a je znovu smerovaný z wg0, keď AllowedIPs pokrýva obe adresy. OpenVPN je druhá skupina, hneď ako je v konfigurácii servera client-to-client, pretože tá direktíva odovzdáva paket medzi reláciami v používateľskom priestore. Predtým, než čokoľvek napíšete, skontrolujte v načítanej konfigurácii túto direktívu. Pravidlo jadra, ktoré nikdy nevidí prevádzku, nemožno odlíšiť od fungujúceho pravidla, a práve tak sa nasadenie končí úplne bez izolácie.

Čítajte efektívnu konfiguráciu, nie súbor, o ktorom predpokladáte, že je načítaný, lebo distribučné balíky prinášajú vlastné vloženia. Ak preposiela démon, zákaz patrí do jeho vlastných ovládacích prvkov pre jednotlivých klientov a hostiteľský firewall filtruje len prevádzku adresovanú hostiteľovi. Ak preposiela jadro, hák preposielania je jediné miesto, na ktorom záleží.

Smerované a prekladané nasadenia potrebujú ešte jednu kontrolu: zdroj, ktorý vidí vzdialený klient, nemusí byť ten, ktorý očakávate. Potom pravidlo zodpovedajúce klientskej podsieti nezodpovedá ničomu. Poznačte si adresu, ktorá prežije preklad, skôr než napíšete zhodu, a uprednostnite zhodu dvojice rozhraní pred hádaním adries NAT.

Dajte každej adrese samostatne odvolateľnú identitu

Izolácia sa zrúti, len čo dve zariadenia zdieľajú jeden údaj. Pravidlo naviazané na tú identitu ich nemôže oddeliť a odvolanie strateného notebooku odvolá celú skupinu. Certifikáty pre každé zariadenie alebo kľúče pre každého partnera držia odvolanie lokálne a politiku čitateľnú, lebo každá adresa zodpovedá presne jednému človeku alebo stroju. Kde to návrh nevie, povedzte to v runbooku, namiesto toho, aby ste pravidlo opisovali ako jemné.

Prideľovanie adries musí súhlasiť s politikou. Rezervujte blok pre služby, blok pre klientov a prideľujte klientske adresy z fondu, ktorý ovládate, nie z rozsahu prvý príde prvý berie. Ak server prekladá alebo mostíkuje, držte mapovaciu tabuľku vedľa konfigurácie, lebo práve ju ďalší čitateľ potrebuje na opätovné odvodenie pravidla.

Umiestnite zákaz tam, kde paket prechádza tunelom

Na bráne, ktorá preposiela prevádzku WireGuard, prípad pokrývajú dve pravidlá: povoľte blok služieb a potom zahoďte zvyšok bloku klientov. Dvojica rozhraní je rovnako dôležitá ako adresy, lebo zhoda len podľa cieľa zachytí aj prevádzku z LAN. Načítajte ich v tomto poradí, aby sa povolenie vyhodnotilo prvé.

S nftables ide dvojica do existujúcej tabuľky inet filter, povolenie prvé a zahodenie druhé. Obe zhody pripínajú dvojicu rozhraní aj adresy.

nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.2.0/24 accept
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.0.0/24 drop

Po načítaní prečítajte reťaz späť namiesto spoliehania sa na výstupný stav a potvrďte, že obe pravidlá stoja v zamýšľanom poradí. Pridajte zodpovedajúce pravidlá ip6 pre fond IPv6, inak je dvojica v4 na dual-stack tuneli len dekorácia. Ak má server už povoľujúcu politiku preposielania, pridajte zahodenie namiesto nahradenia celého reťaza.

Keď je na OpenVPN zapnuté client-to-client, tieto pravidlá preposielania nikdy nezodpovedajú prevádzke medzi partnermi a zákaz musí žiť vo vlastných ovládacích prvkoch démona. Ponechajte pravidlá jadra pre prevádzku adresovanú hostiteľovi, ale nepočítajte ich ako ovládací prvok izolácie.

Dokážte zákaz z klienta, nie zo servera

Testovanie z brány nič nedokazuje, lebo lokálne vytvorená prevádzka ide výstupnou cestou a nikdy neprekročí hák preposielania. Použite dvoch skutočných klientov: jedného, ktorý má dosiahnuť službu, a jedného, ktorý má byť odmietnutý. Najprv spustite prípad povolenia, aby si rozbitý tunel neplietli s fungujúcou politikou.

Z povoleného klienta potvrďte, že služba odpovedá na svojom porte. Z toho istého klienta skúste adresu partnera a čakajte tiché zahodenie, nie odmietnutie:

ping -c 3 -W 2 10.8.0.5
nc -z -w 2 10.8.0.5 22
nft list chain inet filter forward
iptables -vnL FORWARD
ping -6 -c 3 -W 2 fd00:8::5

Zahodený paket a partner offline vyzerajú oba ako vypršanie času, preto pred akýmkoľvek záverom skontrolujte počítadlá. Potvrďte, že počítadlo pravidla zahodenia rastie, kým je partner preukázateľne dostupný. Zopakujte cez IPv6, kde chýbajúce pravidlo ip6 necháva zákaz v4 vyzerať účinne. Zapíšte prijaté a odmietnuté výsledky do runbooku s dátumom, lebo nasledujúca migrácia pravidlo znova odvodí.

Súvisiace články