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 конфигурације које систем може да покрене. Запишите те одговоре, затим прочитајте адресу и порт сервера из клијентове сопствене конфигурације.
Напишите скуп правила око путање тунела
Датотека испод подразумевано одбија и поново прима пет ствари: 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
Трајност захтева launch daemon који извршава pfctl -e и учитава вашу датотеку при подизању. Третирајте га као сваки други привилеговани посао: апсолутне путање, дневник који можете после да прочитате, и тест на машини до које физички можете да дођете. Демон који тихо падне оставља машину незаштићену и нормалног изгледа.
Документујте празнине, почевши од другог VPN клијента који ствара сопствени уређај тунела. Ваша правила именују један тунелски интерфејс, па други остаје блокиран или га хвата широко правило додато касније. Интерфејси за tethering и hotspot појављују се само понекад и заслужују исту белешку. Ниједна од тих празнина није разлог да се прескочи политика; то су услови под којима она још важи.