Тек VPN портын рұқсат ететін фаервол — бір ереже емес. Бұл бірдей порт нөміріне қатысты үш бөлек шешім: кіріс тізбегі жергілікті процеске ненің жете алатынын анықтайды, қайта бағыттау тізбегі туннель клиенттерінің атынан хосттан ненің өте алатынын анықтайды, ал NAT кестесі шығу кезінде дереккөз мекенжайын қайта жазады. Біреуін қате жасасаңыз, нәтиже сирек таза үзіліс болады. Клиенттерді қабылдайтын, бірақ ештеңе жүктемейтін хост аласыз, немесе біреу тізбектер ретін оқығанша жабық көрінетін хост.

Жабыла алмайтын жалғыз порт

VPN тыңдаушысы болжауға болмайтын мекенжайлардан қосылымдарды қабылдауы керек, сондықтан ол анықтама бойынша жария қызмет. Дизайн осыған негізделген жалғыз ерекшелік: OpenVPN үшін бір UDP порты, WireGuard үшін бір UDP порты, SSL VPN үшін бір TCP порты. Қалғанының бәрі туннельдің артында, яғни қолданба қызметтері барлық интерфейске емес, туннель мекенжайына немесе loopback-ке байлануы керек.

Алайда байлау — орындау емес. 0.0.0.0-ке байланған процесс ереже рұқсат еткенде ғана қолжетімді, ал әдепкі саясат ешбір ережеге сәйкес келмеген трафик үшін қосалқы жол, портты басқаратын ереже емес. Drop-тың үстіне қойылған accept бәрібір accept болып қалады, ал қызметті жария мекенжайдан алыстату — тәуелсіз жақсарту, тізбектің орнын баспайды.

Кіріс, қайта бағыттау және NAT әртүрлі сұрақтарға жауап береді

Кіріс трафигі хосттың өзіне арналған, сондықтан VPN тыңдаушысы мен әкімшілік жол сонда тұрады. Қайта бағыттау трафигі хосттан өтеді, ал туннель клиенттеріне ол net.ipv4.ip_forward=1-пен бірге керек. Классикалық жартылай бұзылған конфигурация шығыс ағынын рұқсат етіп, қайту бағытын ұмытады, сондықтан клиент қол алысуды аяқтайды, содан кейін ештеңе жүктелмейді; орныққан және байланысты трафик үшін conntrack ережесі сол бағытты жабады.

NAT — үшінші сұрақ. postrouting-те қайта жазу болмаса, қайта бағытталған пакеттер туннельдің жеке дереккөзімен шығып, жоғарыда тасталады, өйткені хосттан тыс ешбір желі пулды кері маршруттай алмайды. Сол ережедегі дереккөз префиксі VPN пулына сәйкес болуы керек, хосттың өз мекенжайына емес, және клиенттердің ішкі желісін атайтын қайта бағыттау ережесіне де сол қатысты.

IPv6 — екінші саясат, кейінгі ой емес. Қатаң IPv4 тізбегі және ip6tables-де ашық саясаты бар хост ештеңе жабпаған; қызметтер екінші отбасы арқылы әлі де қолжетімді. Немесе ережелер жиынтығын ip6tables-пен көшіріңіз, немесе жария интерфейсте IPv6-ны әдейі өшіріңіз және қайсысын таңдағаныңызды жазыңыз.

Бір қарауда оқылатын негіз

Бас тартудан бастаңыз, содан кейін хостқа қажет нәрсені ғана қосыңыз. Алдымен loopback және жауаптар, содан кейін әкімшілік жол, содан кейін туннель тыңдаушысы, содан кейін клиенттер үшін қайта бағыттау саясаты:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Интерфейс атаулары, порт және пул — орын толтырғыштар; оларды көшірмей серверден оқыңыз. Нәтижені сақтау оны жазу сияқты маңызды, өйткені тек жадта өмір сүретін ережелер жиынтығы келесі қайта жүктеуде жоғалып, хостты үнсіз қайта ашады. Оны тарату механизмімен тұрақты етіп, машина қосылмайтын күн үшін машинаның сыртында көшірме ұстаңыз.

Соңғы портты хосттан айырылмай жабу

Дизайнда бір тұзақ бар. Егер SSH тек туннель арқылы болса, сәтсіз VPN қызметі SSH-ды да алып кетеді, ал қайтудың жалғыз жолы сіз ешқашан ашпаған консоль болуы мүмкін. Соңғы жария портты жаппас бұрын сол консольдің бар екенін және оны шынымен пайдалана алатыныңызды растаңыз, немесе туннельге тәуелді емес бір тар әкімшілік жолды қалдырыңыз: тіркелген мекенжайдан SSH, тек кілттер, құпиясөзбен аутентификация өшірілген.

Өзгерісті әлдеқашан орныққан сессиядан қолданыңыз, сүзгілейін деп отырған қосылым арқылы емес. Қатенің мәңгілік болып қалмай, мерзімі бітуі үшін кері қайтаруды жоспарлаңыз, мысалы алдыңғы ережелер жиынтығын қалпына келтіретін systemd-run --on-active=10min тапсырмасы, және біріншісін сынап жатқанда екінші SSH сессиясын ашық ұстаңыз. Содан кейін кері қайтару тапсырмасы шынымен іске қосылатынын тексеріңіз, өйткені сыналмаған қалпына келтіру қалпына келтірудің жоқтығымен бірдей.

Скрипті емес, жолды тексеріңіз

Жүктелген ережелерді оқыңыз, оларды жүктеуі тиіс файлды емес. Уәкілетті сыртқы хосттан тек көзделген порттар жауап беретінін растаңыз; туннельдің ішінен жарияламақ болған қызметтердің қолжетімді екенін растаңыз. Туннель трафигін де бөгейтін әдепкі бас тарту саясаты біреу оны пайдалануға тырысқанша жұмыс істеп тұрған құлыптауға ұқсайды.

iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr show

Рұқсат етілген портты, клиенттер пулын, туннель интерфейсін, әкімшілік дереккөзді және консоль тәртібін конфигурацияның қасына жазыңыз. Пул немесе интерфейс атауындағы келесі өзгеріс сүзгіде де, NAT ережесінде де сәйкесуі керек, әйтпесе хост ешкім байқамай жартылай ашық күйге қайтады.

Бір әдет ережелер жиынтығынан қымбат: әр өзгерістен кейін қайта бағыттау жолын клиент сұранысымен, ал қалпына келтіру жолын екінші сессиямен дәлелдеңіз. Пайдаланбаған құлыптау — тек болжам.

Қатысты мақалалар