Արգելափակել մեկ OpenVPN հաճախորդին LAN-ից՝ առանց թունելը կանգնեցնելու
Կապեք հաճախորդի թունելի հասցեն նրա վկայագրին, գցեք նրա LAN երթևեկությունը FORWARD-ի գլխին, ապա ստուգեք IPv6-ը, հետևված սեսիաները և վերագործարկումից հետո գոյատևումը։
Ձեր OpenVPN սերվերի վրա մեկ հաճախորդ պետք է կորցնի LAN-ի հասանելիությունը, մինչ մյուս բոլոր թունելները մնում են աշխատող։ Եթե սա փնտրեք, լավագույն պատասխանը սովորաբար ասում է, որ դեմոնը չի կարող, ինչը կիսով չափ ճիշտ է. OpenVPN-ը չունի հաճախորդական firewall, բայց թունելը վերջացնող հոսթը արդեն զտում է փաթեթները։ Երկու որոշումներն են՝ ում ինքնությունը եք արգելափակում և կանոնի դիրքը։ Ճիշտ արեք երկուսն էլ, և փոփոխությունը կդառնա մեկ տող, որը կարող եք փորձարկել ու հեռացնել։
Կապեք հաճախորդին նախքան կանոնը գրելը
OpenVPN-ը թունելի հասցեներ վարձակալում է լողավազանից, այնպես որ 10.8.0.6-ը տեղ է, ոչ մարդ։ Երբ սեսիան ավարտվում է, վարձակալությունը վերադառնում է և կարող է տրվել հաջորդ միացմանը, այսինքն՝ այդ հասցեի դեմ գրված կանոնը հետևում է տեղին, ոչ օգտատիրոջը։ Ուստի նախ որոշեք, թե իրականում ինչ եք արգելափակում՝ հասցե կարճ փորձի համար, թե վկայագիր մեկի համար, ում ուզում եք դուրս պահել։
Հասցեն վկայագրին կապելու համար ստեղծեք ֆայլ client-config-dir-ով նշված պանակում և ֆայլին տվեք հենց վկայագրի common name-ը։ Դրա մեջ դրեք մեկ հրահանգ՝ ifconfig-push 10.8.0.6 255.255.255.0, և այդ հաճախորդը պահում է նույն թունելի հասցեն վերամիացումների ընթացքում։ Երկու կարգավորում պետք է լինի, որպեսզի սա ուժի մեջ լինի. client-config-dir-ը պետք է հայտարարված լինի սերվերի կազմաձևման մեջ, և ուղարկվող հասցեն պետք է լինի ենթացանցում, որը սերվերը կարող է երթուղավորել։ Եթե մեկը բացակայում է, ֆայլը անտեսվում է առանց սխալի, ինչը հաջորդ firewall-ի թեստը դարձնում է մոլորեցնող։
Ժամանակավոր արգելափակումը կարող է օգտագործել լողավազանի հասցե, եթե տոմսը գրանցում է, թե որ սեսիան էր այն պահում այդ պահին։
Կարգը որոշում է՝ գցումը կկատարվի՞
Linux-դարպասում, որը փոխանցում է թունելի և LAN-ի միջև, փաթեթներն անցնում են FORWARD շղթայով։ Կարդացեք ստորև հրամանը որպես նախադասություն. տեղադրեք FORWARD-ի գլխին, համապատասխանեցրեք tun0-ից եկող, հենց այդ մեկ հոսթից, դեպի LAN ենթացանց ուղղված երթևեկությունը և գցեք այն։
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I-ն է, որ կանոնը գործարկում է։ -A-ով ավելացնելու դեպքում այն ընկնում է թունելի ենթացանցի ցանկացած լայն թույլտվությունից ներքև և երբեք փաթեթ չի տեսնում։ Ստուգեք դիրքը iptables -vnL FORWARD --line-numbers-ով և կարդացեք նաև հաշվիչները. վերևում գցում, որը ոչինչ չի հաշվում, նշանակում է, որ երթևեկությունը գալիս է այլ ճանապարհով։
Դարպասի սեփական LAN հասցեն այլ ճանապարհ է։ Արկղին ուղղված փաթեթները գնում են INPUT, ոչ FORWARD, այնպես որ հաճախորդը կարող է կորցնել LAN հոսթը և դեռ բացել երթուղիչի ադմին էջը։ Ավելացրեք համապատասխան INPUT կանոնը, երբ դա կարևոր է։
Ինչ զտիչը չի կարող տեսնել
Զտումը տեղի է ունենում փաթեթի գնահատման պահին, այնպես որ հաստատված TCP սեսիան կարող է շարունակվել մինչև փակվելը կամ վերականգնվելը։ Եթե արգելափակումը պետք է անմիջապես ազդի, մաքրեք այդ աղբյուրի հետևված հոսքերը conntrack -D -s 10.8.0.6-ով կանոնը մտցնելուց հետո։ Եթե մի քանի վայրկյան համընկնումը ընդունելի է, գրանցեք այդ ընտրությունը՝ այն անուղղակի թողնելու փոխարեն։ Ամեն դեպքում, հաջորդ մարդը պետք է իմանա՝ կանոնը կանգնեցնո՞ւմ է կենդանի երթևեկությունը, թե միայն նոր միացումները։
Գործընկերների միջև երթևեկությունը երբեք չի դիպչում հոսթի firewall-ին։ Երբ client-to-client-ը միացված է, OpenVPN-ը այդ փաթեթները փոխանցում է դեմոնի ներսում, այնպես որ ոչ FORWARD-ը, ոչ INPUT-ը դրանք չեն տեսնում։ Միակ լուծումները client-to-client-ը անջատելն է կամ ընդունելը, որ գործընկերները կարող են հասնել միմյանց. iptables-ի կանոնը այդ երթևեկությունը չի տեսնի։
IPv6, firmware և վերագործարկումից հետո գոյատևում
IPv4 կանոնը ոչինչ չի ասում IPv6-ի մասին։ Եթե թունելը և LAN-ը կրում են երկու ընտանիքները, համարժեք կանոնը պետք է լինի ip6tables-ում, կամ nftables-ի կանոնների հավաքածուում, որը տիրապետում է այդ հոսթի քաղաքականությանը։ Երթուղիչի firmware-ը հաճախ թաքցնում է netfilter-ը իր իսկ վերացականության հետևում, այնպես որ ֆորումից պատճենված շարահյուսությունը և աղյուսակների անունները կարող են չկիրառվել։
OpenWrt-ում փաստաթղթավորված ուղին firewall-ի կազմաձևման գրառումն է, ոչ ձեռքով գրված iptables տող, և ձեռքով գրված տողը կարող է անհետանալ, երբ firewall-ը վերաբեռնվի։ Այլ տարածումներ կանոնները վերականգնում են netfilter-persistent-ի, boot միավորի կամ վաճառողի պահոցի միջոցով, և այդ մեխանիզմները փոխարինելի չեն։ Ապացուցեք ընտրվածը վերագործարկումով, որովհետև վերաբեռնումը այլ ուղի է վարժեցնում։
Ստուգեք ըստ ուղու, ապա մաքուր հետ շրջեք
Փորձարկեք յուրաքանչյուր ուղին առանձին, որովհետև մեկ հաջող ստուգումը թաքցնում է մյուսներին։ Արգելափակված հաճախորդը պետք է դեռ հասնի ինտերնետին թունելով, բայց ձախողվի LAN հոսթի դեմ, երկրորդ հաճախորդը պետք է հասնի նույն հոսթին, և դարպասի հասցեն ու գործընկերոջ ուղին յուրաքանչյուրը պետք է իր դիտարկումը։ Գրեք արդյունքները կանոնի կողքին, որպեսզի հաջորդ փոփոխությունն ունենա հիմք։ Ստորև աղյուսակը այն հավաքածուն է, որն արժե պահել տոմսում։
| Ուղի | Սպասվող կանոնով | Երբ ձախողվում է |
|---|---|---|
| Արգելափակված հաճախորդ դեպի LAN հոսթ | Պատասխան չկա | Կանոնը թույլտվությունից ներքև է, կամ աղբյուրը չի համապատասխանում |
| Արգելափակված հաճախորդ դեպի ինտերնետ | Աշխատում է tun0-ով | Կանոնը չափազանց լայն է, առանց նպատակակետի համապատասխանության |
| Երկրորդ հաճախորդ նույն LAN հոսթ | Աշխատում է | Կանոնը համապատասխանեց ավելիին, քան նախատեսված հոսթը |
| Արգելափակված հաճախորդ դեպի դարպասի LAN հասցե | Արգելափակված միայն համապատասխան INPUT կանոնով | INPUT կանոնը բացակայում է |
| Արգելափակված հաճախորդ դեպի գործընկերոջ թունելի հասցե | Դեռ աշխատում է | client-to-client-ը միացված է և firewall-ի շրջանակից դուրս |
Հետ շրջելը ջնջում է ըստ ճշգրտման, ոչ flush. iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-ը հեռացնում է հենց այդ գրառումը և շղթայի մնացած մասը թողնում անձեռնմխելի։ Հեռացրեք նույն տողը ցանկացած ֆայլից, որը վերականգնում է կանոնները boot-ին, վերաբեռնեք այն և հաստատեք, որ հաճախորդը նորից հասնում է LAN հոսթին։ FORWARD-ի flush-ը կչեղարկի նաև ձեր չգրած կանոնները, ինչը հետ շրջելը դարձնում է երկրորդ միջադեպ։
Տոմսը փակելուց առաջ հաստատեք երեք բան. ամրացված հասցեն համապատասխանում է վկայագրին, կանոնը թույլտվություններից վեր է և հաշվիչը զրո չէ, և պահպանման ֆայլը պարունակում է նույն կանոնը, որը փորձարկել եք։ Եթե դրանցից մեկը բացակայում է, արգելափակումը shell սեսիայի պատրանք է։