macOS-та қорғаныс қосқышы артындағы пакет сүзгісінің саясаты қаншалықты жақсы болса, соншалықты жақсы, ал pf — сол саясатты орындайтын бөлік. Саясат бір уақытта екі қарама-қарсы іс істеуі керек: клиенттің өз серверіне жетуіне жол беріп, туннель болуына мүмкіндік беру, және қалғанның бәрінің тікелей шығуын тоқтату. Жарияланған ережелер жиынтықтарының көбі екіншісін орындап, біріншісін ұмытады, сондықтан машина қорғаныс алудың орнына байланысын жоғалтады. Жұмыс істейтін нұсқа соңғы нүктені, шешушіні және туннельді атайды, одан артық ештеңе жоқ.

Пакет сүзгісі қандай шешім қабылдай алады және нені алмайды

pf интерфейстерге, мекенжайларға, протокол нөмірлеріне және порттарға қарайды, сонда тоқтайды. Ол қай процесс сокет ашқанын ешқашан білмейді, сондықтан бір бағдарлама үшін жазылған рұқсат сол портқа жете алатын әрбір бағдарламаға рұқсат болады. Осылайша жомарт UDP ерекшелігі қорғаныс қосқышын қайтадан кәдімгі желіге айналдырады. Қолданбаны танитын бөгеу клиентке немесе жүйелік кеңейтуге тиесілі, бұл файлға емес.

Сүзгі маршруттарды да жасамайды. Клиент құлағанда әдепкі маршрут әлі өлі туннельге нұсқауы мүмкін, және pf оны Wi-Fi-ға үнсіз қайтудың орнына бөгелген пакеттерге айналдырады. Бөгеу — күтілетін нәтиже, айналып өтетін ақау емес.

Нәтижені ереже мәтінінен гөрі реттілік жиі шешеді. quick жоқ болса, pf сәйкестіктен кейін де бағалауды жалғастырады және соңғы сәйкес ереже жеңеді, сондықтан төмендегі кең өткізу жоғарыдағы ұқыпты ерекшеліктерді жояды. Өткізулерді quick деп белгілеу бірінші сәйкестікті қорытынды етеді, саясат авторы әдетте соны меңзейді.

Алдымен интерфейс пен соңғы нүкте деректерін оқыңыз

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

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

route -n get default
ifconfig -l
scutil --nc list

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

Ережелер жиынтығын туннель жолының төңірегінде жазыңыз

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

set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353

DHCP жолы Mac мекенжайды иемденбес бұрын сұрайтындықтан бар, сондықтан сұрау пайдалы бастау мекенжайынсыз 68 порттан 67 портқа қарай шығады. Multicast жолы жүйеге сымсыз байланыстың пайдалануға тұрарлық екенін анықтауға мүмкіндік береді, ал оны алып тастау жұмыс істеп тұрған желіде ешқандай байланыс жоқ деп хабарлайтын машина жасайды. Соңғы нүкте жолы — OpenVPN өз серверіне жалпы жетуіне мүмкіндік беретін жол; онсыз block all сыртқы қол алысуды тастайды және туннель ешқашан көтерілмейді. Шешуші жолы жалпы DNS рұқсатынан тар, өйткені машина жасайтын әр сұраудың орнына бір мекенжай мен бір портты атайды.

Осы соңғы нүкте мен шешуші ерекшеліктері — болуы тиіс екі ерекшелік; қалғанының бәрі бөгелген күйде қалады. Егер клиент нақты мекенжайға қоңырау шалса, шешуші жолын алып тастап, соңғы нүкте жолын сақтаңыз. Егер сервер мекенжайы өзгерсе, келесі қосылымға дейін сол жолды жаңартыңыз, немесе клиенттің өз ілгегінен pf кестесін толтырып, оның орнына кестені сәйкестендіріңіз.

Туннельді түсіріңіз, содан кейін қайта жүктеңіз

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

sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info

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

Қайта жүктеу — адамдар өткізіп жіберетін бөлік. macOS жүктелуде /etc/pf.conf файлын оқиды, бірақ файлды оқу сүзгіні қосумен бірдей емес, сондықтан қазір жұмыс істеп тұрған ережелер жиынтығы қайта жүктеуден кейін белсенді емес болуы мүмкін. Содан кейін sudo pfctl -s info іске қосып, күй жолы сүзгіні қосулы деп хабарлайтынын растаңыз.

Шығу және қайта жүктеу жолын адал ұстаңыз

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

sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules

Тұрақтылық үшін pfctl -e іске қосатын және жүктелуде файлыңызды жүктейтін launch daemon керек. Оған кез келген басқа артықшылықты жұмыс ретінде қараңыз: абсолютті жолдар, кейін оқи алатын журнал, және физикалық түрде жете алатын машинада сынақ. Үнсіз сәтсіздікке ұшыраған демон машинаны қорғаныссыз және қалыпты көрінетін күйде қалдырады.

Олқылықтарды құжаттаңыз, өз туннель құрылғысын жасайтын екінші VPN клиентінен бастаңыз. Сіздің ережелеріңіз бір туннель интерфейсін атайды, сондықтан екіншісі бөгелген күйде қалады немесе кейінірек қосылған кең ережеге ілігеді. Tethering және hotspot интерфейстері тек кейде көрінеді және сол ескертуге лайық. Бұл олқылықтардың ешқайсысы саясатты өткізіп жіберуге себеп емес; олар — саясат әлі де қолданылатын шарттар.

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