Zablokovať jedného klienta OpenVPN z LAN bez zastavenia tunela
Pripnite tunelovú adresu klienta k jeho certifikátu, zahoďte jeho LAN prevádzku na začiatku FORWARD a potom overte IPv6, sledované relácie a prežitie reštartu.
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 DROPPrá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ť.
| Cesta | Očakávané s pravidlom | Keď zlyhá |
|---|---|---|
| Blokovaný klient k hostiteľovi v LAN | Žiadna odpoveď | Pravidlo je pod povolením, alebo zdroj nezodpovedá |
| Blokovaný klient na internet | Funguje cez tun0 | Pravidlo je príliš široké, bez zhody cieľa |
| Druhý klient k tomu istému hostiteľovi v LAN | Funguje | Pravidlo zodpovedalo viac než zamýšľanému hostiteľovi |
| Blokovaný klient k LAN adrese brány | Blokované len so zodpovedajúcim pravidlom INPUT | Pravidlo INPUT chýba |
| Blokovaný klient k tunelovej adrese peera | Stále funguje | client-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.