Jeden klient na vašom serveri OpenVPN musí stratiť prístup do LAN, kým všetky ostatné tunely zostávajú aktívne. Ak to hľadáte, najlepšia odpoveď zvyčajne hovorí, že to démon nevie, čo je len polovica pravdy: OpenVPN nemá firewall pre jednotlivých klientov, ale hostiteľ, ktorý tunel ukončuje, už pakety filtruje. Dve rozhodnutia, na ktorých záleží, sú identita, ktorú blokujete, a pozícia pravidla. Urobte ich správne a zmena sa stane jedným riadkom, ktorý môžete otestovať a odstrániť.

Pripnite klienta skôr, než napíšete pravidlo

OpenVPN prideľuje tunelové adresy z fondu, takže 10.8.0.6 je miesto, nie osoba. Keď relácia skončí, prenájom sa vráti a môže byť pridelený ďalšiemu spojeniu, čo znamená, že pravidlo napísané proti tejto adrese sleduje miesto, nie používateľa. Najprv sa teda rozhodnite, čo vlastne blokujete: adresu pre krátky experiment alebo certifikát pre niekoho, koho chcete držať vonku.

Ak chcete adresu previazať s certifikátom, vytvorte súbor v adresári uvedenom v client-config-dir a dajte súboru presne common name certifikátu. Vložte doň jednu direktívu, ifconfig-push 10.8.0.6 255.255.255.0, a tento klient si pri opätovnom pripojení zachová rovnakú tunelovú adresu. Aby to platilo, musia existovať dve nastavenia: client-config-dir musí byť deklarované v konfigurácii servera a posielaná adresa musí ležať v podsieti, ktorú server dokáže smerovať. Keď jedno chýba, súbor sa ignoruje bez chyby, čo robí ďalší test firewallu zavádzajúcim.

Dočasná blokáda môže použiť adresu z fondu, ak tiket zaznamenáva, ktorá relácia ju vtedy držala.

Poradie rozhoduje, či sa zahodenie vykoná

Na linuxovej bráne, ktorá preposiela medzi tunelom a LAN, prechádzajú pakety reťazcom FORWARD. Prečítajte si príkaz nižšie ako vetu: vložiť na začiatok FORWARD, zachytiť prevádzku vstupujúcu z tun0, od tohto jediného hostiteľa, smerujúcu do podsiete LAN, a zahodiť ju.

iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP

Práve -I spôsobí, že pravidlo beží. Pridané cez -A skončí pod každým širokým povolením pre tunelovú podsieť a nikdy neuvidí paket. Overte pozíciu pomocou iptables -vnL FORWARD --line-numbers a čítajte aj počítadlá: zahodenie navrchu, ktoré nič nepočíta, znamená, že prevádzka prichádza inou cestou.

Vlastná LAN adresa brány je iná cesta. Pakety poslané samotnej krabici idú do INPUT, nie do FORWARD, takže klient môže stratiť hostiteľa v LAN a napriek tomu otvoriť administráciu routera. Keď na tom záleží, pridajte zodpovedajúce pravidlo INPUT.

Čo filter nevidí

Filtrovanie prebieha pri vyhodnotení paketu, takže nadviazaná TCP relácia môže pokračovať, kým sa neuzavrie alebo neresetuje. Ak má blokáda zabrať okamžite, vymažte sledované toky pre tento zdroj pomocou conntrack -D -s 10.8.0.6 po vložení pravidla. Ak je niekoľko sekúnd prekrytia prijateľných, zapíšte túto voľbu, namiesto toho aby zostala implicitná. Tak či onak, ďalší človek musí vedieť, či pravidlo zastavuje živú prevádzku alebo len nové spojenia.

Prevádzka medzi peerami sa nikdy nedotkne firewallu hostiteľa. Keď je zapnuté client-to-client, OpenVPN preposiela tieto pakety vnútri démona, takže ich nevidí ani FORWARD, ani INPUT. Jediným riešením je vypnúť client-to-client alebo prijať, že sa peery môžu navzájom dosiahnuť; pravidlo iptables túto prevádzku neuvidí.

IPv6, firmware a prežitie reštartu

Pravidlo IPv4 nehovorí nič o IPv6. Ak tunel aj LAN nesú obe rodiny, ekvivalentné pravidlo musí existovať v ip6tables, alebo v sade pravidiel nftables, ktorá na tomto hostiteľovi vlastní politiku. Firmware routera často skrýva netfilter za vlastnou abstrakciou, takže syntax a názvy tabuliek skopírované z fóra nemusia platiť.

Na OpenWrt je dokumentovanou cestou položka konfigurácie firewallu, nie ručne písaný riadok iptables, a ručne písaný riadok môže pri načítaní firewallu zmiznúť. Iné distribúcie obnovujú pravidlá cez netfilter-persistent, bootovaciu jednotku alebo úložisko výrobcu a tieto mechanizmy nie sú zameniteľné. Dokážte ten, ktorý ste zvolili, reštartom, pretože načítanie precvičuje inú cestu.

Overte po cestách a potom čisto vráťte

Testujte každú cestu zvlášť, pretože jedna úspešná kontrola skrýva ostatné. Blokovaný klient by mal stále dosiahnuť internet tunelom, ale zlyhať proti hostiteľovi v LAN, druhý klient by mal dosiahnuť toho istého hostiteľa a adresa brány aj cesta k peerovi potrebujú každá vlastné pozorovanie. Zapíšte výsledky vedľa pravidla, aby ďalšia zmena mala základ. Tabuľka nižšie je sada, ktorú stojí za to v tikete ponechať.

CestaOčakávané s pravidlomKeď zlyhá
Blokovaný klient k hostiteľovi v LANŽiadna odpoveďPravidlo je pod povolením, alebo zdroj nezodpovedá
Blokovaný klient na internetFunguje cez tun0Pravidlo je príliš široké, bez zhody cieľa
Druhý klient k tomu istému hostiteľovi v LANFungujePravidlo zodpovedalo viac než zamýšľanému hostiteľovi
Blokovaný klient k LAN adrese brányBlokované len so zodpovedajúcim pravidlom INPUTPravidlo INPUT chýba
Blokovaný klient k tunelovej adrese peeraStále fungujeclient-to-client je zapnuté a mimo dosahu firewallu

Vrátenie je zmazanie podľa špecifikácie, nie flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP odstráni presne tento záznam a zvyšok reťazca nechá nedotknutý. Odstráňte rovnaký riadok zo súboru, ktorý obnovuje pravidlá pri štarte, znova ho načítajte a potvrďte, že klient opäť dosiahne hostiteľa v LAN. Flush FORWARD by zrušil aj pravidlá, ktoré ste nenapísali, čo mení vrátenie na druhý incident.

Pred zatvorením tiketu potvrďte tri veci: pripnutá adresa zodpovedá certifikátu, pravidlo je nad povoleniami s počítadlom iným ako nula a súbor perzistencie obsahuje to isté pravidlo, ktoré ste testovali. Ak niečo z toho chýba, blokáda je ilúzia v shell relácii.

Súvisiace články