Запретить исходящий трафик, если соединение OpenVPN не активно, используя pf.conf в Mac OS X

Мне удалось отключить все подключения к внешним сетям, если мое подключение OpenVPN не работает с помощью pf.conf. Тем не менее, я теряю связь Wi-Fi, если соединение прерывается закрытием и открытием крышки ноутбука или выключением и включением Wi-Fi.

  • Я нахожусь в Mac OS 10.8.1.
  • Я подключаюсь к Интернету через Wi-Fi (из разных мест, включая интернет-кафе).
  • Соединение OpenVPN настроено с помощью Viscosity.

У меня есть следующие правила фильтрации пакетов, установленные в /etc/pf.conf

 # Deny all packets unless they pass through the OpenVPN connection wifi=en1 vpn=tun0 block all set skip on lo pass on $wifi proto udp to [OpenVPN server IP address] port 443 pass on $vpn 

Я запускаю службу фильтра пакетов с помощью sudo pfctl -e и загружаю новые правила с помощью sudo pfctl -f /etc/pf.conf .

Я также отредактировал /System/Library/LaunchDaemons/com.apple.pfctl.plist и изменил строку <string>-f</string> на чтение <string>-ef</string> чтобы фильтр пакетов <string>-ef</string> в системе запускать.

Все это, похоже, отлично работает: приложения могут подключаться только к сети, если соединение OpenVPN активно, поэтому я никогда не пропускаю данные по небезопасному соединению.

Но если я закрою и снова закрою свою крышку ноутбука или выключу и снова включу Wi-Fi, соединение Wi-Fi будет потеряно, и я увижу восклицательный знак в значке Wi-Fi в строке состояния. При нажатии на значок Wi-Fi отображается сообщение «Alert: No Internet connection»:

Нет сообщения о подключении к Интернету

Чтобы восстановить соединение, я должен отключить и повторно подключить Wi-Fi, иногда пять или шесть раз, до того, как сообщение «Alert: No Internet connection» исчезнет, ​​и я снова смогу открыть VPN-соединение. В другое время предупреждение Wi-Fi исчезает само по себе, восклицательный знак очищается, и я снова могу подключиться. В любом случае, может потребоваться пять минут или больше, чтобы снова получить соединение, что может расстраивать.

Удаление block all строк устраняет проблему (но позволяет небезопасные соединения), поэтому кажется, что есть служба, которую я блокирую, что Apple требует, чтобы восстановить и подтвердить подключение Wi-Fi. Я пытался:

  • Включение icmp путем добавления pass on $wifi proto icmp all в pf.conf
  • Включение разрешения DNS путем добавления pass on $wifi proto udp from $wifi to any port 53
  • Попытка узнать больше, block log all заблокированные пакеты (путем изменения block all для block log all ), но sudo tcpdump -n -e -ttt -i pflog0 в журнал sudo tcpdump -n -e -ttt -i pflog0 как представляется, отключена в OS X, потому что, делая sudo tcpdump -n -e -ttt -i pflog0 чтобы увидеть результаты журнала в «tcpdump : Pflog0: такого устройства нет ».

Ничто из этого не помогает быстрее восстановить соединение Wi-Fi.

Что еще я могу сделать, чтобы определить, какая услуга должна быть доступна для восстановления Wi-Fi-соединения или какое правило следует добавить в pf.conf, чтобы сделать пересоединения Wi-Fi более надежными?

5 Solutions collect form web for “Запретить исходящий трафик, если соединение OpenVPN не активно, используя pf.conf в Mac OS X”

Наблюдая за сетевыми подключениями с помощью Little Snitch, я обнаружил, что Apple использует приложение mDNSResponder в фоновом режиме, чтобы проверить, доступно ли соединение Wi-Fi. MDNSResponder отправляет UDP-пакеты в серверы имен для проверки возможности подключения и разрешения имен хостов для IP-адресов.

Изменение правила UDP, которое я ранее разрешил всем UDP-пакетам через Wi-Fi, позволяет подключиться к mDNSRsponder, что означает, что Wi-Fi теперь снова подключается после отключения. Если это поможет другим в будущем, мой окончательный pf.conf, включая правила Apple по умолчанию для Mountain Lion, выглядит следующим образом:

 # # com.apple anchor point # scrub-anchor "com.apple/*" nat-anchor "com.apple/*" rdr-anchor "com.apple/*"as dummynet-anchor "com.apple/*" anchor "com.apple/*" load anchor "com.apple" from "/etc/pf.anchors/com.apple" # # Allow connection via Viscosity only # wifi=en1 #change this to en0 on MacBook Airs and other Macs without ethernet ports vpn=tun0 vpn2=tap0 block all set skip on lo # allow local traffic pass on p2p0 #allow AirDrop pass on p2p1 #allow AirDrop pass on p2p2 #allow AirDrop pass quick proto tcp to any port 631 #allow AirPrint pass on $wifi proto udp # allow only UDP packets over unprotected Wi-Fi pass on $vpn # allow everything else through the VPN (tun interface) pass on $vpn2 # allow everything else through the VPN (tap interface) 

Это означает, что теперь данные могут быть пропущены через Wi-Fi небольшим количеством приложений, использующих протокол UDP, к сожалению, например, ntpd (для временной синхронизации) и mDNSResponder. Но это все же кажется лучше, чем предоставление данных для незащищенных данных по TCP, что и используется большинством приложений. Если у кого-то есть предложения по улучшению этой настройки, пожалуйста, комментарии или дальнейшие ответы приветствуются.

Вам не нужно разрешать все UDP. «M» в mDNS означает «многоадресная рассылка», и он использует конкретный IP-адрес назначения многоадресной рассылки, называемый «местным адресом многоадресной передачи», и номер порта 5353 UDP .

Это означает, что в вышеприведенном решении вы без необходимости разрешаете трафик всем портам UDP 65535 на все 3,7 миллиарда маршрутизируемых IP-адресов в мире, чтобы обойти VPN. Вы были бы удивлены, сколько приложений использует UDP, поэтому вы значительно преуменьшаете цель своей оригинальной идеи, чтобы предотвратить исходящий трафик, когда VPN не работает.

Почему бы не использовать это правило:

pass on $wifi proto udp to 224.0.0.251 port 5353

Очень важное правило с настройкой брандмауэра – при выполнении исключений через брандмауэр всегда старайтесь использовать наиболее конкретное правило. Специфичность иногда возникает за счет удобства и простоты использования, то есть вы можете найти там какой-то другой локально-локальный протокол, который нужно пропустить, и добавить еще одно конкретное правило.

Если вы замените приведенное выше правило и обнаружите, что исходная проблема wifi возвращается, ваш PF может блокировать DHCP, протокол, используемый для автоматической настройки IP-адресов ваших сетевых устройств. (В домашней сети, как правило, ваш широкополосный маршрутизатор будет вашим DHCP-сервером). Правило, которое вам нужно разрешить DHCP, будет:

pass on $wifi proto udp from 0.0.0.0 port 68 to 255.255.255.255 port 67

* Примечание: вам может потребоваться заменить 0.0.0.0 для any . Пакет DHCPREQUEST ваш компьютер сначала отправляет, имеет адрес источника 0.0.0.0 потому что на этом этапе ваш компьютер еще не имеет IP-адреса.
Честно говоря, я бы больше склонялся к использованию any . Другой вариант – вырвать любую исходную спецификацию, то есть pass on $wifi proto udp to 255.255.255.255 port 67 , но это означает, что мы теряем часть исходного кода правила и, будучи как можно более конкретным, всегда является наиболее безопасной опцией ,

Надеюсь, это поможет. Вот несколько полезных ссылок:

MDNS: http://en.wikipedia.org/wiki/Multicast_DNS#Packet_structure

DHSP: http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_discovery

Это дало мне достаточно фоновой информации, чтобы совершить большой прыжок и использовать pf.conf. Вот что я использую на моем 10.8, чтобы повторно подключиться после того, как VPN-соединение падает:

(Я использую только ethernet, но вы можете изменить $ lan за $ wifi, и он должен работать)

 lan=en0 wifi=en1 vpn=tun0 block all set skip on lo pass on $lan proto { udp,tcp } to 8.8.8.8 pass on $lan proto tcp to vpn.btguard.com port 1194 pass on $vpn 

С целью создания правил PF «простым» способом, идентифицируя существующие активные интерфейсы, включая текущие (vpn) интерфейсы, эта небольшая программа killswitch может использоваться,

Все еще выполняется, но может быть хорошим началом для идентификации внешнего IP-адреса и активных интерфейсов для правильного создания правил брандмауэра.

Пример или вывод с помощью опции -i (info):

 $ killswitch -i Interface MAC address IP en1 bc:57:36:d1:82:ba 192.168.1.7 ppp0 10.10.1.3 public IP address: 93.117.82.123 

Передача сервера ip -ip :

 # -------------------------------------------------------------- # Sat, 19 Nov 2016 12:37:24 +0100 # sudo pfctl -Fa -f ~/.killswitch.pf.conf -e # -------------------------------------------------------------- int_en1 = "en1" vpn_ppp0 = "ppp0" vpn_ip = "93.117.82.123" set block-policy drop set ruleset-optimization basic set skip on lo0 block all pass on $int_en1 proto udp to 224.0.0.251 port 5353 pass on $int_en1 proto udp from any port 67 to any port 68 pass on $int_en1 inet proto icmp all icmp-type 8 code 0 pass on $int_en1 proto {tcp, udp} from any to $vpn_ip pass on $vpn_ppp0 all 

Далек от совершенства, но работа продолжается. Дополнительная информация / код можно найти здесь: https://github.com/vpn-kill-switch/killswitch

– В качестве дополнения –

Вы можете добавить эту строку:

 pass on $wifi inet6 proto udp from any to FF02:0000:0000:0000:0000:0000:0000:00FB port 5353 

Разрешить mDNS работать на ipv6

Interesting Posts

Когда мне нужно быстро получить доступ к свойствам с помощью self?

Очистить историю имен пользователей в Skype

Как настроить имя схемы по умолчанию в конфигурации JPA?

«Растровое изображение слишком велико, чтобы быть загруженным в текстуру»

Как включить подтверждение предупреждения перед закрытием вкладок Chrome?

Для Android требуется уровень соответствия компилятора 5.0 или 6.0. Вместо этого найдено «1.7». Используйте Android Tools> Fix Project Properties

Почему определение стандартного макета POD 11 C ++ 11 так, как оно есть?

Удалите Windows 10, но сохраните лицензионный ключ

Как я могу сделать курсор рукой, когда пользователь наводит курсор на элемент списка?

Каково первое целое число, которое плавающий IEEE 754 не может точно представлять?

Клиент Cisco VPN не установлен и не удален

Что такое uTorrent? Как он отличается от BitTorrent?

Как удалить «заблокированный» файл?

Существуют ли в C # библиотеки чтения / записи CSV?

Excel: как создать несколько строк из одного

Давайте будем гением компьютера.