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 интерфейстери кээде гана көрүнөт жана ошол эле эскертүүгө татыктуу. Бул кемчиликтердин эч бири саясатты өткөрүп жиберүүгө себеп эмес; алар — саясат дагы эле күчүндө болгон шарттар.

Тектеш макалалар