Potato Boom — защита Linux-клиента при обрыве VPN Требуется Linux, nftables, iproute2 и Python 3; для автозапуска — systemd. Поддерживается один UDP VPN-сервер с IPv4 endpoint. IPv6 блокируется. Настройка закрывает интернет и локальную сеть вне VPN. Запускай только с локальной консоли своего клиента, не через SSH и не на VPN-сервере. 1. Для Ubuntu: sudo apt install nftables iproute2 python3 Скачай potato-client-guard.py с сайта Potato Boom и изучи перед запуском. Приватный ключ программе не нужен. Она не заменяет VPN-клиент. 2. До включения VPN команда ip route get 1.1.1.1 покажет uplink после dev. Узнай имя VPN-интерфейса: wg-quick up potato обычно создаёт potato; у OpenVPN посмотри ip -br link после первого тестового подключения. Из Endpoint/remote профиля возьми IPv4 и UDP-порт сервера. DNS-имя нужно разрешить ДО включения защиты и заменить в профиле на этот IPv4: разрешение имени сервера вне туннеля после включения будет заблокировано. 3. Пример временной защиты — замени интерфейсы, IPv4 и порт своими: sudo python3 potato-client-guard.py enable --tunnel potato --uplink eth0 --endpoint 147.45.243.223 --port 51820 Затем подключи VPN. Пока VPN не работает, интернет остаётся заблокированным. Для OpenVPN укажи реальный TUN-интерфейс и UDP-порт из своего профиля. Статус: sudo python3 potato-client-guard.py status 4. Для автозапуска после перезагрузки используй install с теми же аргументами: sudo python3 potato-client-guard.py install --tunnel potato --uplink eth0 --endpoint 147.45.243.223 --port 51820 Будут созданы /etc/potato-client-guard.json (root:600), скрипт в /usr/local/libexec/ и potato-client-guard.service перед network-pre.target. Ручная остановка службы НЕ снимает правила. После перезагрузки проверь статус и трафик на своей ОС. Существующая установка не перезаписывается. При смене endpoint/uplink сначала сохрани параметры, затем с локальной консоли удали установку и установи заново с новыми параметрами. 5. В VPN-клиенте настрой DNS 1.1.1.1. Для wg-quick нужен рабочий resolvconf или интеграция resolved по правилам дистрибутива; в NetworkManager задай DNS профиля. Ненастроенный DNS приводит к отказу, а не к разрешению обхода. Локальный stub 127.0.0.53 доступен, его внешние запросы также ограничены. 6. После подключения проверь внешний IPv4 выбранным доверенным сервисом. Например curl -4 --max-time 8 https://api.ipify.org отправит свой IP этому сервису проверки; ответ должен быть IPv4 VPN-сервера. curl -6 --max-time 8 https://api6.ipify.org должен завершиться ошибкой. На uplink через tcpdump должны быть видны только VPN UDP к endpoint и DHCPv4. Прямые запросы DNS (UDP/TCP 53, 853), HTTP(S) и IPv6 блокируются. Останови VPN-процесс, затем выключи/удали туннель: доступ должен оставаться заблокированным. Верни VPN и повтори проверку. Проверь также смену сети и перезагрузку. Для нового uplink нужно явно обновить конфигурацию. 7. Временное снятие блокировки с локальной консоли: sudo python3 potato-client-guard.py disable Если служба установлена, она вернёт защиту при следующем запуске/перезагрузке. Полное удаление установки и снятие блокировки: sudo python3 potato-client-guard.py uninstall Можно использовать установленный /usr/local/libexec/potato-client-guard.py. Отключение возвращает обычный сетевой доступ, в том числе вне VPN. Изменяется только своя таблица inet potato_client_guard с меткой v1. Чужие таблицы, NAT и маршруты не очищаются. Совпавшая чужая таблица не изменяется. Loopback, IPv4 внутри выбранного VPN, UDP к одному серверу и DHCPv4 разрешены; остальной исходящий трафик блокируется. Входящий firewall не меняется. Root может менять firewall: административный flush ruleset удалит защиту. Другой firewall может дополнительно ограничивать доступ. Статус ENABLED подтверждает установку правил, но не handshake, DNS или доступность VPN.