Туннельді тоқтатпай бір OpenVPN клиентін LAN-нан блоктау
Клиенттің туннель мекенжайын оның сертификатына бекітіңіз, оның LAN трафигін FORWARD басында тастаңыз, содан кейін IPv6, бақыланатын сессиялар және қайта жүктеуге төзімділікті тексеріңіз.
Сіздің OpenVPN серверіңіздегі бір клиент LAN қатынасынан айырылуы керек, ал қалған туннельдер жұмыс істеп тұруы керек. Мұны іздесеңіз, үздік жауап әдетте демон мұны істей алмайды дейді, бұл жартылай ғана рас: OpenVPN-де әр клиентке бөлек брандмауэр жоқ, бірақ туннельді аяқтайтын хост пакеттерді әлдеқашан сүзеді. Маңызды екі шешім — блоктайтын тұлға және ереженің орны. Осы екеуін дұрыс жасасаңыз, өзгеріс тексеруге және жоюға болатын бір жолға айналады.
Ережені жазбас бұрын клиентті бекітіңіз
OpenVPN туннель мекенжайларын пулдан жалға береді, сондықтан 10.8.0.6 — адам емес, орын. Сессия аяқталғанда жалдау қайтады және келесі қосылымға берілуі мүмкін, яғни сол мекенжайға қарсы жазылған ереже орынды қадағалайды, пайдаланушыны емес. Сондықтан алдымен нақты нені блоктайтыныңызды шешіңіз: қысқа тәжірибе үшін мекенжай ма, әлде сыртта ұстағыңыз келетін адамның сертификаты ма.
Мекенжайды сертификатқа байлау үшін client-config-dir көрсеткен каталогта файл жасап, файлға сертификаттың common name мәнін дәл солай беріңіз. Ішіне бір директива қойыңыз, ifconfig-push 10.8.0.6 255.255.255.0, сонда бұл клиент қайта қосылғанда да сол туннель мекенжайын сақтайды. Бұл күшіне енуі үшін екі параметр болуы керек: client-config-dir сервер конфигурациясында жариялануы керек, ал жіберілетін мекенжай сервер маршруттай алатын ішкі желіде болуы керек. Біреуі жетпесе, файл қатесіз еленбейді, бұл келесі брандмауэр сынағын жаңылыстырады.
Уақытша блоктау пул мекенжайын қолдана алады, егер билет сол кезде қай сессия ұстағанын жазса.
Тәртіп тастаудың орындалуын шешеді
Туннель мен LAN арасында бағыттайтын Linux шлюзінде пакеттер 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 арқылы тазалаңыз. Бірнеше секунд қабаттасу қолайлы болса, бұл таңдауды жасырын қалдырмай жазып қойыңыз. Қалай болғанда да, келесі адам ереже тірі трафикті тоқтата ма, әлде тек жаңа қосылымдарды ма білуі керек.
Теңдестер арасындағы трафик хост брандмауэрына ешқашан тимейді. client-to-client қосулы болса, OpenVPN бұл пакеттерді демонның ішінде жібереді, сондықтан оларды не FORWARD, не INPUT көрмейді. Жалғыз шешім — client-to-client-ті өшіру немесе теңдестер бір-біріне жете алатынын қабылдау; iptables ережесі бұл трафикті көрмейді.
IPv6, микробағдарлама және қайта жүктеуге төзімділік
IPv4 ережесі IPv6 туралы ештеңе айтпайды. Туннель мен LAN екі отбасын да тасыса, балама ереже ip6tables ішінде немесе сол хостта саясатқа ие nftables ережелер жиынтығында болуы керек. Маршрутизатор микробағдарламасы netfilter-ді жиі өз абстракциясының артына жасырады, сондықтан форумнан көшірілген синтаксис пен кесте атаулары жарамсыз болуы мүмкін.
OpenWrt-те құжатталған жол — брандмауэр конфигурациясының жазбасы, қолмен жазылған iptables жолы емес, ал қолмен жазылған жол брандмауэр қайта жүктелгенде жоғалуы мүмкін. Басқа дистрибутивтер ережелерді netfilter-persistent, жүктеу бірлігі немесе өндіруші қоймасы арқылы қалпына келтіреді, бұл механизмдер бірін-бірі алмастырмайды. Таңдағаныңызды қайта жүктеумен дәлелдеңіз, өйткені қайта жүктеу басқа жолды жаттықтырады.
Жол бойынша тексеріп, содан кейін таза қайтарыңыз
Әр жолды бөлек сынаңыз, өйткені бір сәтті тексеру қалғандарын жасырады. Блокталған клиент туннель арқылы интернетке жете беруі керек, бірақ LAN хостына қарсы сәтсіз болуы керек, екінші клиент сол хостқа жетуі керек, ал шлюз мекенжайы мен теңдес жолының әрқайсысына жеке бақылау қажет. Нәтижелерді ереженің қасына жазыңыз, сонда келесі өзгерістің негізі болады. Төмендегі кесте билетте қалдыруға тұрарлық жиынтық.
| Жол | Ережемен күтілетін | Сәтсіз болғанда |
|---|---|---|
| Блокталған клиенттен LAN хостына | Жауап жоқ | Ереже рұқсаттың астында, немесе көз сәйкес келмейді |
| Блокталған клиенттен интернетке | tun0 арқылы жұмыс істейді | Ереже тым кең, мақсат сәйкестігі жоқ |
| Екінші клиенттен сол LAN хостына | Жұмыс істейді | Ереже көзделген хосттан көбірек сәйкесті |
| Блокталған клиенттен шлюздің LAN мекенжайына | Тек сәйкес INPUT ережесімен блокталады | INPUT ережесі жоқ |
| Блокталған клиенттен теңдестің туннель мекенжайына | Әлі де жұмыс істейді | client-to-client қосулы және брандмауэр аясынан тыс |
Қайтару — спецификация бойынша жою, flush емес: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP дәл сол жазбаны жояды және тізбектің қалғанын бүлінбеген күйде қалдырады. Сол жолды жүктеуде ережелерді қалпына келтіретін кез келген файлдан жойыңыз, оны қайта жүктеңіз және клиенттің LAN хостына қайта жететінін растаңыз. FORWARD тізбегін flush ету өзіңіз жазбаған ережелерді де жояды, бұл қайтаруды екінші оқиғаға айналдырады.
Билетті жаппас бұрын үш нәрсені растаңыз: бекітілген мекенжай сертификатқа сәйкес, ереже рұқсаттардан жоғары және есептегіш нөлге тең емес, және тұрақтылық файлында сынаған ережеңіздің өзі бар. Осылардың бірі жоқ болса, блок — shell сессиясындағы елес.