
Разбирался я вместе с Codex. Он читал журналы, писал скрипты и сопоставлял результаты, а команды с sudo я запускал сам в Terminal. Всё описанное было в августе-октябре 2026 года, время минское. IP сайтов здесь исторические, по ним настраивать ничего не надо.
Что нашлось в журналах Claude
Начал с папки ~/Library/Logs/Claude/. В web-журналах повторялись три маркера: app-unavailable-in-region, region_unavailable и Claude isn’t available in your region. Искал так:
rg -n \ -e ‘app-unavailable-in-region’ \ -e ‘region_unavailable’ \ -e “Claude isn’t available in your region” \ “$HOME/Library/Logs/Claude”/claude.ai-web*.log
В основном файле нашлось 1 264 строки, с двумя ротациями 2 891. Это строки журнала. Приложение повторяет запросы и пишет один отказ по нескольку раз, так что «2 891 утечка» была бы враньём.
Для подробного разбора я взял девять дат. Часть ошибок шла сразу после пробуждения Mac, часть рядом с активностью WireGuard. Самым подозрительным выглядело 29 сентября, за два дня до блокировки.

Совпадение по времени есть, состояния туннеля и IP запросов в журналах нет
Последовательность красивая, но она ничего не доказывает. Окно WireGuard открылось, а это не момент подключения туннеля: расширение уже работало раньше. Запись о меню не говорит, какой пункт я нажал. Вполне возможно, я полез в WireGuard как раз потому, что Claude уже ругался.
Записи о падении туннеля, смене маршрута или внешнем IP конкретного запроса в доступных журналах не было. Региональные отказы подтвердились, утечка через провайдера нет. Связь этих ошибок с блокировкой аккаунта тоже не доказана, совпадение дат ещё не причина.
Почему сеть задним числом не восстановить
У WireGuard нашёлся бинарный файл tunnel-log.bin. По исходному коду кольцевого журнала WireGuard видно, что он держит 2 048 записей и новые пишутся поверх старых. 3 октября все 2 048 записей были за 3 октября, сентябрь уже затёрся.
Часть системной истории тоже не сохранилась. По некоторым контейнерам macOS отвечала Operation not permitted, то есть журнал мог быть, просто прочитать его не дали.
Отдельно пришлось разобраться с пометкой (direct) в логе Claude. Она про выбор HTTP-прокси внутри приложения и ничего не говорит о том, ушёл ли пакет через системный VPN. Для себя я разложил так:
-
(direct) в логе приложения значит только то, что запрос не пошёл через HTTP-прокси.
-
route get с ответом utunN показывает, что сейчас маршрут к этому адресу идёт в туннель.
-
Внешний IP от контрольного сервиса показывает адрес только для этого запроса.
-
region_unavailable значит, что сервер отказал по региону, и больше ничего.
Сегодняшняя проверка IP не восстанавливает вчерашний. И проверка одного адреса не говорит про все соединения приложения.
Через VPN перестали открываться рабочие сайты
Пока я копался в Claude, появилась вторая проблема, уже рабочая. При включённом WireGuard не открывались amoCRM, приложение TGBooster и Geekjob. Каждый раз выключать VPN ради CRM неудобно, и это ломало саму идею.
Я сравнил два пути, не выключая WireGuard: обычный маршрут и физический интерфейс en0. Обычный запрос выглядел так, для второго добавлялся —interface en0:
curl -q —proxy ‘’ —ipv4 —silent —show-error \ –connect-timeout 5 —max-time 8 —output /dev/null \ –write-out ‘http=%{http_code} remote=%{remote_ip} connect=%{time_connect}\n’ \ https://app.tgbooster.ru/companies
На другом Mac или по кабелю интерфейс может называться иначе. Запросы к Anthropic для таких проверок я не отправлял, сравнивал только рабочие сайты и контрольный сервис. 4 октября через VPN все пять адресов падали по тайм-ауту, через en0 отдавали HTTP 200: страница TGBooster, его JS и CSS на cdn.tgbooster.ru, публичная страница amoCRM, скрипт входа на statix.amocrm.ru и главная Geekjob.
Где рвётся, на VPN-сервере, в промежуточной сети или в защите сайта, я не выяснил. Писать «сайт блокирует VPN» было бы слишком сильно.
Две детали стоили мне времени. Одного основного домена мало: TGBooster тянет скрипты со своего CDN, а странице входа amoCRM нужен statix.amocrm.ru, которого в моём первом списке не было. И проверочный скрипт сначала считал ответ 401 от amoCRM сетевой ошибкой. На деле HTTPS-соединение прошло и пришла страница авторизации, это не вход, но и не тайм-аут.
Почему я не стал пускать через VPN только Claude
Первый план был простым: несколько сетей Claude в туннель, всё остальное напрямую. Проверка нашла дыру сразу. 4 октября downloads.claude.ai смотрел на 35.190.46.17, а этой сети в списке не было. В сетевых требованиях Desktop перечислены целые семейства доменов, и короткий список найденных IP их не покрывает.
Поэтому я развернул логику. VPN остаётся основным путём, а напрямую идут только проверенные рабочие адреса. Если я что-то пропущу, рабочий сайт просто не откроется, и я это увижу. А пропущенный адрес Claude молча ушёл бы мимо туннеля.
Сначала попробовал сделать это через AllowedIPs. Расчёт был правильный: все 127 подготовленных IPv4-префиксов появились в системе. Но адреса amoCRM всё равно уходили через оставшийся VPN default route на utun8. Физический default route рядом не помогал, он был привязан к интерфейсу. Пришлось смотреть, что система реально выбирает для конкретного адреса:
/sbin/route -n get 23.111.99.17 /sbin/route -n get 1.1.1.1
Что вернуло доступ
Сработали явные маршруты к отдельным IPv4-адресам через домашний шлюз. Начал с одного адреса Geekjob, проверил, потом добавил остальные:
sudo /sbin/route -n add -host 185.209.28.104 192.168.100.1
185.209.28.104 тогда был адресом Geekjob, 192.168.100.1 это шлюз моей сети. На другой машине и то и другое надо смотреть заново. После каждого маршрута я проверял три вещи: куда идёт рабочий адрес, куда идёт контрольный и проходит ли обычный HTTP-запрос без привязки к en0.

VPN остался основным путём, напрямую идут только проверенные рабочие адреса
Для amoCRM, TGBooster и Geekjob вышло десять маршрутов. Адреса Claude, которые я проверял, остались в туннеле. Потом так же добавил Cossa и Telemetr, Telemetr сразу отдал нормальную страницу с HTTP 200.
И снова споткнулся о свой скрипт. Он требовал у route get флаг STATIC, а macOS может вернуть клонированную запись с WASCLONED, хотя путь уже правильный. Переписали проверку на сравнение назначения, шлюза и интерфейса.
У решения есть честные ограничения. Маршруты живут до перезагрузки. В другой сети прежний шлюз не подходит. Сайт поменял DNS, и адреса надо пересматривать. Правило по IP действует на весь адрес, даже если на нём сидят несколько сайтов. А скрипты проверяли публичные страницы, работу внутри аккаунтов я смотрел руками в браузере.
Как защита от утечки уронила мне интернет
Оставалась защита на случай, когда туннель падает. Маршрут решает, куда отправить пакет, а kill switch должен запретить выход напрямую. Одни AllowedIPs такого запрета не давали.
Мы собрали временные правила PF, системного пакетного фильтра: туннель и выбранные рабочие адреса можно, остальной прямой выход нельзя. Первый тест прошёл. На время испытаний я закрывал Claude, Claude Code и браузеры с Claude. При ручном отключении WireGuard контрольный HTTPS-адрес перестал отвечать, а три рабочих сайта продолжили отдавать 200.
Дальше появилась служба через launchd. Она находила интерфейс WireGuard и шлюз, восстанавливала маршруты, следила за правилами PF и писала журнал. IPv6 в ней просто блокировался. Проверки при включённом VPN, ручном отключении и после перезагрузки прошли. Тут я и поторопился: решил, что этого хватит для постоянной работы.
Вечером 5 октября интернет пропал и с VPN, и без него. В журнале службы с 21:29 до 21:32 крутилось одно и то же:
Own anchor/table changed Own PF hook/order missing
Служба пыталась восстановить правила PF, снова видела расхождение и по своей же логике закрывала всё. Переключение VPN такую блокировку не снимало.

Несколько удачных тестов не заменили проверку сна, смены сети и ошибок самой службы
Цикл ошибок журнал подтверждает. Что первым нарушило правила, я не знаю, поэтому не скажу, что виновата только служба. Но она точно участвовала или усилила сбой, и оставлять её было нельзя. Сделали заготовленный откат: остановили службу, убрали автозапуск, вернули исходный /etc/pf.conf, удалили её маршруты, журналы сохранили. Контрольные запросы снова пошли и через VPN, и напрямую. Рабочие маршруты потом вернул отдельным скриптом, а самодельный guard так и остался выключен.
Что осталось на 8 октября
Доступ к рабочим сайтам при включённом WireGuard есть. Проверенные адреса Claude идут через VPN, это видно по снимкам маршрутов. Устойчивой защиты при падении туннеля нет, guard откатан. Какой IP Anthropic видел в сентябре и почему заблокировали аккаунт, я так и не узнал.
Самым полезным оказался порядок работы. Сначала сравнить пути и ответы, потом смотреть маршрут для каждого адреса, найти недостающие ресурсы страниц и только потом менять настройки маленькими шагами.
Если повторять такую настройку, я бы делал так:
-
Сравнить один и тот же запрос через туннель и через физический интерфейс.
-
Открыть страницу в браузере и выписать все домены, с которых она грузит скрипты и стили.
-
Проверять route get для каждого адреса, конфиг сам по себе ничего не гарантирует.
-
Добавлять маршруты по одному и после каждого проверять рабочий и контрольный адрес.
-
До любых правил PF вести свой короткий журнал: время, профиль VPN, интерфейсы, маршруты, состояние фильтра, ответ контрольного запроса.
Когда это не сработает
Точечные маршруты не переживут перезагрузку и смену Wi-Fi без отдельного скрипта. Если сайт часто меняет IP или сидит за большим CDN, список адресов придётся постоянно обновлять. А kill switch из нескольких удачных тестов не получается: сон и пробуждение, смену сети, падение расширения и ошибки самой проверки я так и не прогнал.
Доступ к рабочим сайтам получил понятное решение. Защита от прямого выхода осталась незакрытой задачей, а версия о причине блокировки Claude так и осталась версией, хотя хронология выглядела убедительно.
Я 19 лет в маркетинге и работаю как внешний руководитель маркетинга, поэтому amoCRM и рекламные кабинеты для меня рабочий инструмент каждый день. Сетевик из меня так себе, и этот текст скорее про то, как не выдать красивую хронологию за доказательство.
А вы как держите рабочие сервисы при включённом VPN: точечными маршрутами, отдельным профилем или просто выключаете туннель?
ссылка на оригинал статьи https://habr.com/ru/articles/1092122/