Bir OpenVPN müştərisini tuneli dayandırmadan LAN-dan bloklamaq
Müştərinin tunel ünvanını sertifikatına bağlayın, LAN trafikini FORWARD zəncirinin başında atın, sonra IPv6, izlənən sessiyalar və yenidən başlatmadan sonra qalmağı yoxlayın.
Serverinizdəki bir OpenVPN müştərisi LAN girişini itirməli, bütün digər tunellər isə işlək qalmalıdır. Bunu axtarsanız, ən yaxşı cavab adətən demonun bunu edə bilmədiyini söyləyir, bu isə yalnız yarı doğrudur: OpenVPN-də hər müştəri üçün firewall yoxdur, amma tuneli sonlandıran host artıq paketləri filtrləyir. Əhəmiyyətli iki qərar blokladığınız kimlik və qaydanın mövqeyidir. Bunları düzgün etsəniz, dəyişiklik sınaqdan keçirə və silə biləcəyiniz bir sətrə çevrilir.
Qaydanı yazmazdan əvvəl müştərini bağlayın
OpenVPN tunel ünvanlarını hovuzdan icarəyə verir, yəni 10.8.0.6 şəxs deyil, oturacaqdır. Sessiya bitəndə icarə geri qayıdır və növbəti bağlantıya verilə bilər, yəni həmin ünvana qarşı yazılmış qayda istifadəçini deyil, oturacağı izləyir. Ona görə əvvəlcə həqiqətən nəyi blokladığınıza qərar verin: qısa təcrübə üçün ünvan, yoxsa kənarda saxlamaq istədiyiniz şəxs üçün sertifikat.
Ünvanı sertifikata bağlamaq üçün client-config-dir ilə adlandırılan qovluqda fayl yaradın və fayla sertifikatın common name dəyərini eynilə verin. İçinə bir direktiv qoyun, ifconfig-push 10.8.0.6 255.255.255.0, və həmin müştəri yenidən qoşulmalarda eyni tunel ünvanını saxlayır. Bunun işləməsi üçün iki parametr olmalıdır: client-config-dir server konfiqurasiyasında elan edilməlidir və ötürülən ünvan serverin marşrutlaşdıra bildiyi alt şəbəkədə olmalıdır. Biri çatsa, fayl xəta vermədən nəzərə alınmır və bu, növbəti firewall sınağını yanıldıcı edir.
Müvəqqəti blok hovuz ünvanından istifadə edə bilər, bir şərtlə ki, biletdə həmin anda hansı sessiyanın onu tutduğu qeyd olunsun.
Sıra atmanın işləyib-işləmədiyini həll edir
Tunel ilə LAN arasında yönləndirmə edən Linux şlüzündə paketlər FORWARD zəncirini keçir. Aşağıdakı əmri cümlə kimi oxuyun: FORWARD zəncirinin başına əlavə et, tun0 interfeysindən girən, yalnız həmin hostdan gələn və LAN alt şəbəkəsinə yönəlmiş trafiki uyğunlaşdır və at.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I qaydanı işə salan hissədir. -A ilə əlavə edilsə, tunel alt şəbəkəsi üçün geniş icazələrin altına düşür və heç vaxt paket görmür. Mövqeyi iptables -vnL FORWARD --line-numbers ilə yoxlayın və sayğacları da oxuyun: yuxarıda heç nə saymayan atma trafikin başqa yolla gəldiyini bildirir.
Şlüzün öz LAN ünvanı başqa yoldur. Qutunun özünə göndərilən paketlər INPUT zəncirinə gedir, FORWARD zəncirinə yox, yəni müştəri LAN hostunu itirsə də routerin idarə səhifəsini aça bilər. Bu vacib olduqda uyğun INPUT qaydasını əlavə edin.
Filtrin görə bilmədiyi şeylər
Filtr paket qiymətləndirilərkən işləyir, yəni qurulmuş TCP sessiyası bağlanana və ya sıfırlanana qədər davam edə bilər. Blok dərhal təsir etməlidirsə, qayda əlavə edildikdən sonra həmin mənbə üçün izlənən axınları conntrack -D -s 10.8.0.6 ilə təmizləyin. Bir neçə saniyəlik üst-üstə düşmə məqbuldursa, bunu gizli saxlamaq əvəzinə qeyd edin. Hər halda növbəti şəxs qaydanın canlı trafiki, yoxsa yalnız yeni bağlantıları dayandırdığını bilməlidir.
Həmkar trafiki host firewalluna heç vaxt toxunmur. client-to-client aktiv olduqda OpenVPN bu paketləri demonun içində ötürür, yəni onları nə FORWARD, nə də INPUT görür. Yeganə həll client-to-client-i söndürmək və ya həmkarların bir-birinə çata bilməsini qəbul etməkdir; iptables qaydası bu trafiki görməyəcək.
IPv6, proqram təminatı və yenidən başlatmadan sonra qalma
IPv4 qaydası IPv6 haqqında heç nə demir. Tunel və LAN hər iki ailəni daşıyırsa, ekvivalent qayda ip6tables daxilində və ya həmin hostda siyasətə sahib nftables qaydalar dəstində olmalıdır. Router proqram təminatı çox vaxt netfilter-i öz abstraksiyası arxasında gizlədir, ona görə forumdan kopyalanan sintaksis və cədvəl adları uyğun gəlməyə bilər.
OpenWrt-də sənədləşdirilmiş yol əl ilə yazılmış iptables sətri deyil, firewall konfiqurasiya qeydidir və əl ilə yazılmış sətir firewall yenidən yüklənəndə yox ola bilər. Digər distributivlər qaydaları netfilter-persistent, yükləmə vahidi və ya vendor anbarı vasitəsilə bərpa edir və bu mexanizmlər bir-birini əvəz etmir. Seçdiyinizi yenidən başlatma ilə sübut edin, çünki yenidən yükləmə başqa yolu işlədir.
Yol ilə yoxlayın, sonra təmiz geri qaytarın
Hər yolu ayrıca sınayın, çünki bir uğurlu yoxlama digərlərini gizlədir. Bloklanmış müştəri LAN hostuna qarşı uğursuz olsa da tunel vasitəsilə internetə çatmalıdır, ikinci müştəri həmin hosta çatmalıdır, şlüz ünvanı və həmkar yolu isə hər biri öz müşahidəsini tələb edir. Nəticələri qaydanın yanında yazın ki, növbəti dəyişikliyin bazası olsun. Aşağıdakı cədvəl biletdə saxlanmağa dəyər çoxluqdur.
| Yol | Qayda ilə gözlənilən | Uğursuz olduqda |
|---|---|---|
| Bloklanmış müştəridən LAN hostuna | Cavab yoxdur | Qayda icazənin altındadır və ya mənbə uyğun gəlmir |
| Bloklanmış müştəridən internetə | tun0 vasitəsilə işləyir | Qayda çox genişdir, təyinat uyğunluğu yoxdur |
| İkinci müştəridən eyni LAN hostuna | İşləyir | Qayda nəzərdə tutulan hostdan çoxunu uyğunlaşdırıb |
| Bloklanmış müştəridən şlüzün LAN ünvanına | Yalnız uyğun INPUT qaydası ilə bloklanır | INPUT qaydası yoxdur |
| Bloklanmış müştəridən həmkar tunel ünvanına | Hələ də işləyir | client-to-client aktivdir və firewall əhatəsindən kənardadır |
Geri qaytarma flush deyil, spesifikasiya ilə silməkdir: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP məhz həmin qeydi silir və zəncirin qalanını toxunulmaz qoyur. Eyni sətri yükləmədə qaydaları bərpa edən fayldan da silin, onu yenidən yükləyin və müştərinin LAN hostuna yenidən çatdığını təsdiqləyin. FORWARD zəncirini flush etmək yazmadığınız qaydaları da ləğv edərdi və geri qaytarmanı ikinci insidentə çevirərdi.
Bileti bağlamazdan əvvəl üç şeyi təsdiqləyin: bərkidilmiş ünvan sertifikata uyğundur, qayda icazələrin üstündədir və sayğac sıfırdan fərqlidir, və davamlılıq faylı sınadığınız qaydanın eynisini saxlayır. Bunlardan biri yoxdursa, blok yalnız shell sessiyasında mövcud olan illüziyadır.