Пераключальнік блакавання pf у macOS для OpenVPN: правілы, якія зачыняюцца
Набор правілаў pf блакуе прамы трафік, пакуль тунель апушчаны. Захавайце шлях кліента да яго сервера, затым дакажыце блакаванне з выключаным тунелем.
У macOS пераключальнік блакавання настолькі добры, наколькі добра палітыка фільтра пакетаў за ім, і pf — гэта частка, якая выконвае гэтую палітыку. Палітыка павінна рабіць дзве процілеглыя рэчы адначасова: дазволіць кліенту дасягнуць свайго сервера, каб тунель мог існаваць, і спыніць усё астатняе ад прамога выхаду. Большасць апублікаваных набораў правілаў спраўляецца з другім і забывае пра першае, таму машына губляе злучэнне замест таго, каб атрымаць абарону. Працоўная версія называе канцавы пункт, рэзалвер і тунель, і нічога больш.
Што фільтр пакетаў можа вырашыць, а што не
pf глядзіць на інтэрфейсы, адрасы, нумары пратаколаў і порты, і на гэтым спыняецца. Ён ніколі не даведваецца, які працэс адкрыў сокет, таму дазвол, напісаны для адной праграмы, становіцца дазволам для кожнай праграмы, якая можа дасягнуць таго ж порта. Менавіта так шчодрае выключэнне UDP ператварае пераключальнік блакавання назад у звычайную сетку. Блакаванне з улікам праграм належыць кліенту або сістэмнаму пашырэнню, а не гэтаму файлу.
Фільтр таксама не стварае маршруты. Калі кліент падае, маршрут па змаўчанні можа ўсё яшчэ паказваць на мёртвы тунель, і pf ператварае гэта ў заблакаваныя пакеты, а не ў ціхі адкат да Wi-Fi. Блакаванне — гэта мэтавы вынік, а не няспраўнасць, якую трэба абыходзіць.
Парадак вырашае вынік часцей, чым тэкст правіла. Без quick pf працягвае ацэнку пасля супадзення, і перамагае апошняе правіла, што супала, таму шырокі пропуск каля нізу перакрывае старанныя выключэнні вышэй. Пазначэнне пропускаў як quick робіць першае супадзенне канчатковым, што звычайна і мае на ўвазе аўтар палітыкі.
Спачатку прачытайце факты пра інтэрфейс і канцавы пункт
Бесправадныя інтэрфейсы не заўсёды нумаруюцца аднолькава на кожным Mac, а прылада тунелю атрымлівае нумар, які можа змяніцца паміж загрузкамі. Правіла, якое называе неіснуючую прыладу, правальваецца пры разборы, што гучна і лёгка злавіць, а правіла, якое называе няправільную існуючую прыладу, разбіраецца чыста і дазваляе трафік, які вы хацелі спыніць.
Збірайце факты, пакуль кліент падключаны, бо прылада тунелю існуе толькі тады. Вам патрэбны інтэрфейс, які трымае маршрут па змаўчанні, прылада, створаная кліентам, і адрас і порт сервера, да якога ён звяртаецца. Менавіта апошняе значэнне большасць набораў правілаў апушчае, і менавіта праз гэта скапіяваны набор блакуе свой уласны тунель.
route -n get default
ifconfig -l
scutil --nc list
Першая каманда называе інтэрфейс, які зараз перамагае, другая пералічвае кожную прыладу, вядомую ядру, а трэцяя паказвае канфігурацыі VPN, якія сістэма можа запусціць. Запішыце гэтыя адказы, затым прачытайце адрас і порт сервера з уласнай канфігурацыі кліента.
Напішыце набор правілаў вакол шляху тунелю
Файл ніжэй адмаўляе па змаўчанні і зноў дапускае пяць рэчаў: петлявы інтэрфейс, прыладу тунелю, шлях кліента да свайго сервера, рэзалвер, які выкарыстоўваецца да ўзнікнення тунелю, і два абмены, якія трымаюць бесправадное злучэнне прыдатным. Назвы інтэрфейсаў і адрас сервера паходзяць з вашай машыны, таму падстаўце значэнні, якія вы пацвердзілі. Нумар тунелю таксама не супадзе з вашым.
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
Для захавання патрэбны launch daemon, які запускае pfctl -e і загружае ваш файл пры загрузцы. Стаўцеся да яго як да любой іншай прывілеяванай задачы: абсалютныя шляхі, журнал, які можна прачытаць потым, і тэст на машыне, да якой можна фізічна дабрацца. Дэман, які моўчкі падае, пакідае машыну незабароненай і з выглядам нармальнай.
Задакументуйце прабелы, пачынаючы з другога кліента VPN, які стварае сваю ўласную прыладу тунелю. Вашы правілы называюць адзін інтэрфейс тунелю, таму другі застаецца заблакаваным або супадае з шырокім правілам, дададзеным пазней. Інтэрфейсы тэтэрынгу і гарачай кропкі з’яўляюцца толькі часам і заслугоўваюць той жа заўвагі. Ні адзін з гэтых прабелаў не прычына прапускаць палітыку; гэта ўмовы, пры якіх яна ўсё яшчэ дзейнічае.