Что передает телеметрия агентов для написания кода
Телеметрия агентов состоит из четырех потоков данных, включая аналитику и обучение моделей. Узнайте, как провести аудит сетевых соединений и отключить передачу лишней информации.
Что на самом деле охватывает телеметрия агентов для написания кода
Телеметрия агентов для написания кода состоит из четырех отдельных потоков данных, объединенных одним термином, и для каждого потока предусмотрено собственное управление. Вывод модели (model inference) передает ваши запросы и ваш код тому, кто предоставляет модель, и ни одна настройка не может это отключить. Продуктовая аналитика и отчеты о сбоях отправляются поставщику, а зачастую и в компанию, занимающуюся сбором логов, которой платит поставщик. Хранение данных для обучения — это вопрос условий договора, а не сетевых настроек. Четвертый поток — это то, что часто упускают из виду: каждая добавленная вами интеграция может открыть соединение с хостом, который вы не выбирали.
Список текущих настроек по умолчанию от поставщиков — это та часть темы, которая устаревает быстрее всего. Новый релиз может изменить значение по умолчанию, а новая функция — добавить направление передачи данных, которое не охватывается ни одним существующим переключателем. Поэтому полезным навыком является аудит, который можно повторить для любого агента: ознакомьтесь с документацией поставщика, проверьте, какая конфигурация фактически применена на этой машине, отследите процесс с самой машины, а затем выберите те средства контроля, за которые вы готовы платить. Каждая команда, приведенная ниже, выполняется на вашей собственной машине и направлена на анализ вашего собственного трафика.
Четыре категории и причины, по которым для них требуются разные средства контроля
Трафик инференса модели неизбежен. Агент отправляет ваш запрос, прочитанные им файлы, вывод выполненных команд и сгенерированный им текст на конечную точку модели. Это штатная работа продукта. Единственное реальное решение — кто именно получает эти данные: API, управляемый сторонней организацией, или модель, которую вы запускаете самостоятельно. Корпоративная облачная учетная запись (Bedrock, Vertex, Foundry) меняет получателя, но не устраняет поток данных. Ничто из описанного далее в этой статье не уменьшит трафик инференса, поэтому мысленно отделяйте его от трех других категорий.
Аналитика продукта и отчеты о сбоях — это другой поток к другим хостам. Счетчики использования, показатели задержки, проверки флагов функций и трассировки стека обычно отправляются на имена хостов, не имеющие отношения к API модели, и часто — в сторонние системы отслеживания ошибок. Поставщики обычно документируют это как «метрики» и «отчеты об ошибках» и, как правило, предоставляют по одной переменной окружения для каждой категории. Объем данных ничтожен, поэтому поиск по количеству байтов здесь не поможет. Вы охотитесь за именами хостов, а не за пропускной способностью.
Хранение и обучение — это политика, а не пакеты. То, хранит ли поставщик ваши запросы, как долго и обучает ли он на них будущие модели, прописано в условиях вашего тарифного плана. Потребительские и коммерческие планы обычно различаются, а соглашение об отсутствии хранения данных (zero-retention) — это, как правило, отдельный договор. Вы не сможете проверить это с помощью tcpdump, так как пакеты в обоих случаях выглядят идентично. Читайте условия, и если это важно для вашего работодателя, требуйте письменного подтверждения.
Интеграции незаметно добавляют промежуточный узел. Сервер MCP (model context protocol), маркетплейс плагинов, проверка автоматических обновлений, инструмент веб-поиска, проверка безопасности, разрешающая URL перед его загрузкой: каждый из них — это запрос к хосту, который не является конечной точкой модели. Именно здесь скрываются сюрпризы, поскольку обвязка может перенаправлять работу, которую вы считали локальной, через собственный сервис, и обновление может начать делать это без изменения ни одной строки в вашей конфигурации. Рассматривайте каждый добавляемый инструмент как новый пункт назначения, пока не проконтролируете его сетевую активность.
Шаг 1: что указано в документации поставщика?
Откройте справочник настроек и страницу использования данных для вашего агента и изучите их, имея под рукой список терминов: metrics, analytics, error reporting, crash, feedback, survey, update check, safety check, marketplace. Каждое из этих слов обычно соответствует отдельному переключателю. Выпишите точные имена переменных, так как на шаге 2 они потребуются для поиска через grep.
Одно слово может ввести вас в заблуждение. У ряда агентов термин "telemetry" в документации означает экспорт OpenTelemetry, который вы настраиваете для отправки метрик в собственный коллектор, что противоположно передаче данных поставщику. Claude Code — один из таких примеров: установка CLAUDE_CODE_ENABLE_TELEMETRY=1 запускает экспорт на конечную точку, указанную в OTEL_EXPORTER_OTLP_ENDPOINT, и это не связано с собственной аналитикой поставщика, для которой предусмотрен отдельный механизм отказа. Прежде чем что-либо настраивать, определите направление потока данных.
Ожидайте наличия главного переключателя и учитывайте, что у него могут быть исключения. По состоянию на август 2026 года, параметр CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC в Claude Code отключает метрики, отчеты об ошибках, команду обратной связи и опросы сессий, однако в той же документации указано, что он не затрагивает проверку безопасности домена WebFetch. Эта функция отправляет имя хоста, к которому вы собираетесь обратиться, в API поставщика и имеет собственный отдельный параметр. Это не претензия к конкретному продукту. Это общая проблема: главный переключатель охватывает только те категории, которые существовали на момент его создания.
Будьте готовы к тому, что отказ от сбора данных может иметь последствия. В той же документации отмечается, что отключение телеметрии также отключает оценку флагов функций (feature-flag), от которых зависят некоторые возможности. Таким образом, переключатель, активированный ради конфиденциальности, может отключить используемую вами функцию без какого-либо сообщения об ошибке, указывающего на связь между этими событиями. Читайте описание рядом с флагом, а не только его название.
Шаг 2: какая конфигурация была применена на самом деле?
Настройка, которую вы внесли, не всегда является той, что была применена. Агенты объединяют конфигурацию из нескольких файлов, один из которых может находиться в репозитории, который вы только что клонировали у другого пользователя. Начните с проверки окружения вашей собственной оболочки.
env | grep -Ei 'telemetry|otel|analytics|error_report|do_not_track|proxy'Затем выведите список всех файлов настроек, которые считывает инструмент, в порядке, указанном в документации. Для Claude Code по состоянию на август 2026 года это пользовательский файл, два проектных файла и управляемая директория политик в Linux.
for f in ~/.claude/settings.json .claude/settings.json .claude/settings.local.json; do
echo "== $f"; [ -f "$f" ] && cat "$f"
done
ls -l /etc/claude-code/ 2>/dev/nullПроектный файл, полученный вместе с git clone, содержит конфигурацию, написанную другим человеком, и он может повторно включить то, что было отключено в вашем пользовательском файле. Если у агента есть команда статуса, отображающая список загруженных источников, это самый быстрый способ получить достоверные данные: Claude Code выводит список загруженных источников настроек в /status.
Самая надежная проверка — это чтение данных запущенного процесса, а не файлов. Сначала создайте для агента отдельную учетную запись пользователя Linux, что сделает каждую команду в этой статье короче, а затем прочитайте окружение, с которым был запущен процесс.
pgrep -u agent -a node
sudo tr '\0' '\n' < /proc/$(pgrep -u agent -n node)/environ | grep -Ei 'telemetry|proxy|otel'/proc/<pid>/environ показывает переменные, которые были у процесса в момент выполнения, поэтому этот метод позволяет выявить случай, когда ваш экспорт .bashrc не был применен к сервису, запущенному через systemd. Если установленная вами переменная отсутствует здесь, значит, она никогда не вступала в силу, независимо от того, что написано в ваших dotfiles.
Шаг 3: к каким хостам выполняется подключение?
Начните с открытых сокетов, отфильтрованных по учетной записи, от имени которой работает агент.
sudo ss -tnpe state established-e добавляет поле uid: к каждой строке, что позволяет отделить подключения агента от подключений вашего браузера, не анализируя имена процессов. Запишите удаленные адреса, а затем получите имена, стоящие за ними. Самый надежный источник имен — это рукопожатие TLS (transport layer security), так как каждое новое соединение начинается с ClientHello, содержащего поле SNI (server name indication) — имя хоста, которое запросил клиент.
sudo apt install -y tshark
sudo tshark -i any -f 'tcp port 443' -Y 'tls.handshake.type == 1' \
-T fields -e ip.dst -e tls.handshake.extensions_server_nameВы получите по одной строке на каждое новое соединение, что и является искомым списком: API модели, сервер обновлений, хост аналитики, трекер ошибок и всё, что добавлено интеграциями. Пустой столбец имени означает, что клиент использовал ECH (encrypted client hello), поэтому имя хоста не видно в сети. В этом случае используйте IP-адрес назначения, обратный поиск (reverse lookup) или прокси из шага 4.
Представление DNS (domain name system) является полезной перекрестной проверкой, так как оно показывает имена, которые агент запрашивал, даже для соединений, которые не были установлены.
sudo tcpdump -ni any -l 'udp port 53'Каждая строка запроса заканчивается типом записи и именем в формате A? host.example.net. (39). Выполняйте захват на any, а не на внешнем интерфейсе, так как при использовании systemd-resolved приложение обращается к локальному заглушечному слушателю (stub listener) на 127.0.0.53, и только этот слушатель взаимодействует с внешней сетью. Если вы не видите никакого DNS-трафика, хотя агент явно работает, значит, среда выполнения использует DNS over HTTPS, и имена можно будет получить только на шаге 4.
Выполняйте захват, пока агент совершает реальные действия. Начните сессию, заставьте его прочитать файл, выполнить команду или вызвать ошибку. Трафик, который генерируется один раз при запуске или только при возникновении исключения, никогда не появится в захвате простаивающего процесса, а захват простаивающего процесса — самый частый способ прийти к уверенному, но неверному выводу при аудите.
Шаг 4: что находится внутри запросов?
Имена хостов указывают на получателя. Чтобы увидеть содержимое, установите подконтрольный вам прокси перед агентом и используйте его центр сертификации (CA) только для этой среды выполнения. Обычно для этого используется mitmproxy. Проект рекомендует использовать автономные бинарные файлы с сайта mitmproxy.org, а также документирует uv tool install mitmproxy как способ установки через пакетный менеджер Python.
mitmdump -w /tmp/agent-flows.mitmПри первом запуске создается CA в ~/.mitmproxy/, где mitmproxy-ca-cert.pem — это сам сертификат. В оболочке, из которой вы будете запускать агент, укажите клиенту путь к прокси и к этому сертификату.
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
export NODE_EXTRA_CA_CERTS="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"
export REQUESTS_CA_BUNDLE="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"
export SSL_CERT_FILE="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"Многие CLI-интерфейсы агентов написаны на Node, а Node считывает NODE_EXTRA_CA_CERTS при запуске процесса, поэтому экспортируйте переменную до запуска агента, а не в другом терминале после него. Python-клиенты считывают REQUESTS_CA_BUNDLE или SSL_CERT_FILE, а Go-бинарные файлы, использующие стандартную библиотеку, считывают SSL_CERT_FILE в Linux. Проверьте работоспособность пути с помощью curl, прежде чем винить агент.
curl -sS -o /dev/null -w '%{http_code}\n' https://example.comРаботающий прокси выводит 200, и запрос появляется в выводе mitmdump. Недоверенный CA приводит к curl: (60) SSL certificate problem: self-signed certificate in certificate chain, а аналогичная ошибка в Node-агенте сопровождается кодом SELF_SIGNED_CERT_IN_CHAIN. Просматривайте сохраненные потоки позже с помощью консольного интерфейса, где можно открыть отдельный запрос и прочитать его заголовки и тело.
mitmproxy -r /tmp/agent-flows.mitmСтоит выделить четыре возможных исхода. Вы видите запросы — в этом случае изучите их и примите решение. Агент отказывается запускаться из-за ошибки сертификата — это проблема доверия в данной среде выполнения, а не находка, касающаяся поставщика. Вы видите только API модели — это означает, что другие категории отключены или срабатывают по событию, которое вы не инициировали. Или вы не видите ничего, хотя агент явно работает — это значит, что клиент игнорирует переменные окружения прокси или использует закрепление сертификатов (certificate pinning), и ни одной настройке приложения нельзя доверять. Последний исход — самый важный; он возвращает вас к шагу 3, так как перехват пакетов невозможно обмануть, он всегда покажет соединение.
Средства контроля: от самых слабых к самым сильным
Настройки opt-out. Самый дешевый и слабый метод, так как он полагается на добросовестность поставщика и охватывает только уже существующие категории. Устанавливайте их так, чтобы они сохранялись после перезагрузки и открытия нового терминала: в файле пользовательских настроек или в профиле оболочки. Добавьте DO_NOT_TRACK=1, пока вы этим занимаетесь: это соглашение, которое поддерживают многие инструменты командной строки, включая некоторые агенты, и это ничего не стоит. После обновления повторно выполните шаг 3, так как именно в этот момент меняется область охвата.
Ограничение исходящего трафика. Здесь вы перестаете просить и начинаете принудительно ограничивать. Запустите агент от имени отдельного пользователя, разрешите этому пользователю только loopback и DNS, а остальное отбросьте. Это создает собственную таблицу, поэтому существующие правила межсетевого экрана остаются нетронутыми.
table inet agentegress {
chain output {
type filter hook output priority filter; policy accept;
meta skuid "agent" ip daddr 127.0.0.0/8 accept
meta skuid "agent" udp dport 53 accept
meta skuid "agent" counter log prefix "agent-egress-drop " drop
}
}Примените это с помощью sudo nft -f /etc/nftables.d/agent.nft, следите за счетчиком через sudo nft list table inet agentegress и просматривайте отброшенные пакеты с помощью sudo journalctl -k -g agent-egress-drop. Растущий счетчик отброшенных пакетов с неожиданным именем хоста — это и есть цель упражнения. Два честных ограничения. meta skuid соответствует пользователю, которому принадлежит сокет, поэтому правило работает, только пока эта учетная запись не может стать другим пользователем: беспарольный sudo для агента превращает это правило в рекомендацию. А открытый UDP 53 для любого сервера оставляет канал, по которому данные могут передаваться в именах запросов, поэтому закройте и его, если ваша модель угроз этого требует, направив резолвер агента на хост, которым вы управляете. Списки разрешенных имен хостов лучше размещать в прокси, а не в nftables, так как API-эндпоинты находятся за сетями доставки контента (CDN), IP-адреса которых постоянно меняются. Цена этого контроля — поломки и обслуживание: установка пакетов, git по SSH и проверка обновлений самого агента будут завершаться ошибкой, пока вы их не разрешите, и теперь этот список — ваша зона ответственности. Если вы настраиваете это на сервере, а не на ноутбуке, та же учетная запись и структура межсетевого экрана станут основой для безопасного запуска Claude Code на VPS.
Одноразовая машина. Предоставьте агенту виртуальную машину (VM), на которой нет важных для вас учетных данных и которая уничтожается по завершении задачи. Это не уменьшает объем отправляемых агентом данных, но ограничивает то, к чему агент имеет доступ для отправки, что обычно и является риском, который вас беспокоит. Сочетайте это с правилами исходящего трафика, описанными выше, так как свежая VM с неограниченным доступом в интернет все равно может связаться с любым хостом в вашей сети. Метод и состояние, которое нужно восстанавливать каждый раз, описаны в запуске агентов для программирования в одноразовой VM, а вопрос выбора ресурсов — в запуске агента для программирования на VPS.
Self-hosting модели. Единственный способ контроля, который устраняет поток данных для инференса, так как промпт никогда не покидает ваше оборудование. Цена реальна: вы не можете запустить закрытую модель самостоятельно, поэтому это означает выбор моделей с открытыми весами и принятие разрыва в возможностях при выполнении сложных задач, плюс затраты на оборудование для их обслуживания. Компромиссы разобраны в возможности self-hosting для Claude, а различия в возможностях основных агентов — в различиях между Claude Code, Cursor, Codex и Copilot.
Ни один из этих четырех методов контроля не меняет того, что агенту разрешено читать на диске, а трафик инференса передает все, что он прочитал. Если файл .env находится в рабочем каталоге, он будет отправлен модели в тот момент, когда агент выполнит поиск имени переменной. Ограничение доступа к таким материалам — это отдельная задача, описанная в защите секретов от попадания в контекст AI-агента.
Что проверять после каждого обновления
- Сравните страницы настроек и использования данных от поставщика с вашими предыдущими записями, чтобы найти новые переключатели и новые именованные сервисы.
- Повторно считайте переменные окружения процесса из
/proc/<pid>/environ, чтобы убедиться, что ваши исключения по-прежнему применяются к запущенному процессу. - Снова выведите на экран файлы настроек проекта, так как
git pullможет добавить файл конфигурации, который изменил коллега. - Запустите захват SNI для одного полного сеанса реальной работы и сравните список имен хостов с предыдущим.
- Проверьте счетчик отброшенных пакетов в межсетевом экране, так как новый пункт назначения обычно появляется там раньше, чем вы заметите его где-либо еще.
Это занимает около десяти минут и является единственной частью процесса, которая не теряет актуальности. Настройка по умолчанию, которую вы проверили в августе 2026 года, — это факт об августе 2026 года. Захват трафика — это факт о сегодняшнем дне.
FAQ
Могу ли я запретить кодинг-агенту отправлять мой код в модель?
Нет, и любая настройка, которая якобы это делает, описывает что-то другое. Отправка вашего промпта, файлов, которые прочитал агент, и вывода выполненных им команд на эндпоинт модели — это и есть процесс инференса, поэтому единственная переменная здесь — кто именно получает эти данные. Вы можете сменить получателя, направив агента на облачный аккаунт компании или на модель, которую вы хостите самостоятельно, а также можете уменьшить объем отправляемых данных, ограничив права агента на чтение файлов. Отключение аналитики и отчетов об ошибках никак не влияет на этот поток данных.
Как увидеть, к каким хостам подключается мой кодинг-агент?
Запустите агента от имени отдельного пользователя Linux, а затем перехватывайте TLS ClientHello для каждого нового соединения во время работы: sudo tshark -i any -f 'tcp port 443' -Y 'tls.handshake.type == 1' -T fields -e ip.dst -e tls.handshake.extensions_server_name. Для каждого соединения будет выводиться одна строка с адресом назначения и запрошенным именем хоста. Сверяйте имена с sudo tcpdump -ni any 'udp port 53', выполняя захват на any, так как локальный резолвер на 127.0.0.53 обрабатывает запрос первым. Выполняйте захват, пока агент занят реальной работой, так как пинги при запуске и отчеты о сбоях не отображаются в захвате трафика при простое.
Мой прокси не видит трафик, пока агент работает. Что пошло не так?
Либо клиент игнорирует HTTP_PROXY и HTTPS_PROXY, либо он использует certificate pinning и отклоняет ваш CA. Сначала протестируйте путь с помощью curl: если curl выходит в интернет через прокси, а агент не появляется в списке потоков, значит, агент не использует переменные окружения прокси. Некоторым средам выполнения требуется предоставление CA особым образом, а Node, в частности, считывает NODE_EXTRA_CA_CERTS только при запуске процесса, поэтому экспорт переменной после запуска агента не даст результата. Если прокси не видит трафик, переходите к захвату пакетов, который невозможно обойти никакими настройками приложения.
Остановит ли отключение телеметрии использование моего кода для обучения?
Нет. Аналитика и отчеты о сбоях — это поток, отличный от инференса, поэтому их отключение удаляет счетчики использования и стектрейсы, но оставляет отправку всех промптов в модель в прежнем виде. Будут ли эти промпты сохранены и будут ли они использоваться для обучения будущих моделей, определяется условиями вашего тарифного плана; потребительские и коммерческие планы обычно различаются. Это вопрос условий договора, а не перехвата пакетов, поэтому изучите страницу использования данных для вашего плана и, если это критично, оформите коммерческое соглашение или соглашение с нулевым удержанием данных до начала первой сессии.