Welke data verstuurt mijn coding agent?
Coding agents versturen vier soorten verkeer, waarvan er slechts één onvermijdelijk is. Leer hoe u zelf het netwerkverkeer van uw agent controleert en ongewenste data blokkeert.
Wat telemetrie van coding agents daadwerkelijk omvat
Telemetrie van coding agents bestaat uit vier afzonderlijke datastromen die onder één noemer vallen, waarbij elke stroom zijn eigen instellingen heeft. Model-inference verstuurt uw prompts en uw code naar de partij die het model host; er is geen instelling om dit uit te schakelen. Productanalyses en crashrapporten gaan naar de leverancier, en vaak ook naar een logging-bedrijf dat door de leverancier wordt betaald. Retentie voor trainingsdoeleinden is een contractuele kwestie in plaats van een netwerkkwestie. De vierde stroom is degene die vaak over het hoofd wordt gezien: elke integratie die u toevoegt, kan een verbinding openen naar een host die u nooit zelf heeft gekozen.
Een lijst met huidige standaardinstellingen van leveranciers is het onderdeel van dit onderwerp dat het snelst veroudert. Een release kan een standaardinstelling wijzigen en een nieuwe functie kan een bestemming toevoegen die door geen enkele bestaande schakelaar wordt gedekt. De duurzame vaardigheid is daarom een audit die u voor elke agent kunt herhalen: lees wat de leverancier documenteert, controleer welke configuratie daadwerkelijk op deze machine is toegepast, monitor het proces vanaf de machine zelf en kies vervolgens de instellingen waarvoor u bereid bent te betalen. Elk onderstaand commando voert u uit op uw eigen machine, gericht op uw eigen netwerkverkeer.
De vier categorieën en waarom ze verschillende controles vereisen
Verkeer voor model-inference is onvermijdelijk. De agent verstuurt uw prompt, de gelezen bestanden, de output van uitgevoerde commando's en de eigen gegenereerde tekst naar een model-endpoint. Dit is de werking van het product. De enige echte beslissing is wie dit ontvangt: een API die door iemand anders wordt beheerd, of een model dat u zelf draait. Een zakelijk cloud-account (Bedrock, Vertex, Foundry) wijzigt de ontvanger, maar heft de stroom niet op. Niets in de rest van dit artikel vermindert het inference-verkeer; houd dit daarom in uw hoofd gescheiden van de andere drie categorieën.
Product-analytics en crash-rapportage vormen een andere stroom naar andere hosts. Gebruikstellers, latentiecijfers, feature-flag opzoekingen en stack traces gaan doorgaans naar hostnames die niets met de model-API te maken hebben, en vaak naar een externe fouttracker. Leveranciers documenteren deze meestal als "metrics" en "error reports" en bieden u vaak één omgevingsvariabele per categorie. Het volume is klein, dus byte-aantallen zullen dit nooit aan het licht brengen. U zoekt naar hostnames, niet naar bandbreedte.
Retentie en training zijn beleid, geen pakketten. Of de leverancier uw prompts bewaart, hoe lang, en of ze een toekomstig model op basis daarvan trainen, staat in de voorwaarden die aan uw abonnement zijn gekoppeld. Consumentenabonnementen en commerciële abonnementen verschillen meestal, en een afspraak zonder retentie is doorgaans een aparte overeenkomst. U kunt dit niet verifiëren met tcpdump, omdat het pakket er in beide gevallen identiek uitziet. Lees de voorwaarden en, als dit belangrijk is voor uw werkgever, leg het schriftelijk vast.
Integraties voegen stilletjes een extra stap toe. Een MCP (model context protocol) server, een plugin-marktplaats, een controle op automatische updates, een tool voor webzoekopdrachten, een veiligheidscontrole die een URL omzet voordat deze wordt opgehaald: elk onderdeel is een verzoek aan een host die niet het model-endpoint is. Hier bevinden zich de verrassingen, omdat een harness werk waarvan u aannam dat het lokaal was, via een eigen service kan routeren, en een release kan hiermee beginnen zonder dat u één regel in uw configuratie hoeft te wijzigen. Behandel elke tool die u toevoegt als een nieuwe bestemming totdat u deze op het netwerkverkeer heeft gecontroleerd.
Stap 1: wat documenteert de leverancier?
Open de instellingenreferentie en de pagina over datagebruik voor uw agent en lees deze door met een woordenlijst bij de hand: metrics, analytics, error reporting, crash, feedback, survey, update check, safety check, marketplace. Elk van deze termen is meestal een afzonderlijke schakelaar. Noteer de exacte variabelenamen, aangezien stap 2 hierop zoekt met grep.
Eén woord zal u op het verkeerde been zetten. Bij verschillende agents betekent "telemetry" in de documentatie een OpenTelemetry-export die u configureert om metrics te sturen naar een collector die u zelf beheert; dit is het tegenovergestelde van data die naar de leverancier gaat. Claude Code is hier een voorbeeld van: het instellen van CLAUDE_CODE_ENABLE_TELEMETRY=1 start een export naar het endpoint dat u opgeeft in OTEL_EXPORTER_OTLP_ENDPOINT, en dit staat los van de eigen analytics van de leverancier, waarvoor een andere opt-out geldt. Bepaal in welke richting de data stroomt voordat u instellingen wijzigt.
Verwacht een hoofdschakelaar en verwacht dat deze gaten vertoont. Sinds augustus 2026 schakelt CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC van Claude Code metrics, foutrapporten, het feedback-commando en sessie-enquêtes tegelijkertijd uit. Dezelfde documentatie vermeldt echter dat dit niet de WebFetch-domeinveiligheidscontrole dekt; deze stuurt de hostnaam die u op het punt staat op te halen naar de API van de leverancier en heeft een eigen, afzonderlijke instelling. Dit is geen klacht over één specifiek product. Het is de aard van het probleem overal: een hoofdschakelaar dekt alleen de categorieën die bestonden op het moment dat deze werd geschreven.
Verwacht ook dat de opt-out u iets kost. Dezelfde documentatie merkt op dat het uitschakelen van telemetrie ook de evaluatie van feature-flags uitschakelt waar sommige functies afhankelijk van zijn. Een schakelaar die wordt omgezet voor privacy kan dus een functie uitschakelen die u gebruikt, zonder foutmelding die het verband tussen beide aangeeft. Lees de zin naast de vlag, niet alleen de naam van de vlag.
Stap 2: welke configuratie is daadwerkelijk toegepast?
Een instelling die u heeft geschreven, is niet per se een instelling die is toegepast. Agents voegen configuraties uit verschillende bestanden samen, en een daarvan bevindt zich in de repository die u zojuist van iemand anders heeft gekloond. Begin met de omgeving van uw eigen shell.
env | grep -Ei 'telemetry|otel|analytics|error_report|do_not_track|proxy'Druk vervolgens elk configuratiebestand af dat de tool inleest, in de volgorde die de documentatie aangeeft. Voor Claude Code is dat, per augustus 2026, het gebruikersbestand, de twee projectbestanden en een beheerde beleidsmap op 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/nullEen projectbestand dat met een git clone is meegekomen, bevat configuratie die door een ander is geschreven, en dit kan instellingen opnieuw inschakelen die uw gebruikersbestand heeft uitgeschakeld. Als de agent een statuscommando heeft dat weergeeft welke bronnen zijn geladen, is dat de snelste manier om de feitelijke situatie te achterhalen: Claude Code toont de geladen configuratiebronnen in /status.
De meest betrouwbare controle leest het actieve proces in plaats van een bestand. Geef de agent eerst een eigen Linux-gebruikersaccount, waardoor elk commando in dit bericht korter wordt, en lees vervolgens de omgeving waarmee het proces is gestart.
pgrep -u agent -a node
sudo tr '\0' '\n' < /proc/$(pgrep -u agent -n node)/environ | grep -Ei 'telemetry|proxy|otel'/proc/<pid>/environ toont de variabelen die het proces had op het moment van uitvoering (exec time); hiermee achterhaalt u of uw .bashrc export ooit een service heeft bereikt die door systemd is gestart. Als een variabele die u heeft ingesteld hier ontbreekt, was deze nooit van kracht, ongeacht wat uw dotfiles aangeven.
Stap 3: met welke hosts maakt het verbinding?
Begin met open sockets, gefilterd op het account waaronder de agent draait.
sudo ss -tnpe state established-e voegt een uid:-veld toe aan elke regel, zodat u de verbindingen van de agent kunt scheiden van die van uw browser zonder procesnamen te hoeven lezen. Noteer de externe adressen en achterhaal vervolgens de namen die erachter zitten. De meest betrouwbare bron voor namen is de TLS (transport layer security) handshake, omdat elke nieuwe verbinding begint met een ClientHello die een SNI (server name indication)-veld bevat; dit is de hostnaam waar de client om heeft gevraagd.
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_nameU krijgt één regel per nieuwe verbinding, wat precies de inventarisatie is die u nodig heeft: de model-API, de updateserver, de analytics-host, de error-tracker en alles wat door een integratie is toegevoegd. Een lege kolom voor de naam betekent dat de client ECH (encrypted client hello) heeft gebruikt, waardoor de hostnaam niet zichtbaar is op het netwerk. U valt dan terug op het IP-adres van de bestemming, een reverse lookup of de proxy in stap 4.
Het DNS (domain name system)-overzicht is een nuttige controle, omdat het namen toont die de agent heeft opgezocht, zelfs voor verbindingen die niet tot stand zijn gekomen.
sudo tcpdump -ni any -l 'udp port 53'Elke queryregel eindigt met het recordtype en de naam, in de vorm A? host.example.net. (39). Voer de capture uit op any in plaats van op de externe interface, omdat de applicatie bij systemd-resolved communiceert met een lokale stub-listener op 127.0.0.53 en alleen de stub met de buitenwereld praat. Als u helemaal geen DNS-verkeer ziet terwijl de agent duidelijk actief is, voert die runtime zelf DNS over HTTPS uit en zal alleen stap 4 u de namen kunnen geven.
Voer de capture uit terwijl de agent daadwerkelijk werk verricht. Start een sessie, laat de agent een bestand lezen, laat hem een commando uitvoeren of laat hem ergens in falen. Verkeer dat slechts eenmaal bij het opstarten wordt gegenereerd, of alleen wanneer een uitzondering optreedt, verschijnt nooit in een capture van een inactief systeem. Een capture van een inactief systeem is de meest voorkomende manier waarop een audit tot een geruststellend, maar onjuist resultaat leidt.
Stap 4: wat zit er in de verzoeken?
Hostnamen vertellen u wie het is. Om te zien wat er wordt verzonden, plaatst u een proxy die u beheert voor de agent en vertrouwt u de certificaatautoriteit (CA) ervan uitsluitend voor die runtime. mitmproxy is hiervoor de gebruikelijke tool. Het project adviseert de standalone binaries van mitmproxy.org en documenteert uv tool install mitmproxy als de route via het Python-pakket.
mitmdump -w /tmp/agent-flows.mitmDe eerste uitvoering schrijft een CA naar ~/.mitmproxy/, waarbij mitmproxy-ca-cert.pem het certificaat zelf is. Wijs in de shell van waaruit u de agent start, de client naar de proxy en naar dat certificaat.
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"Veel agent-CLI's zijn Node-programma's en Node leest NODE_EXTRA_CA_CERTS wanneer het proces start. Exporteer deze variabele dus voordat u de agent start en niet achteraf in een andere terminal. Python-clients lezen REQUESTS_CA_BUNDLE of SSL_CERT_FILE, en een Go-binary die de standaardbibliotheek gebruikt, leest SSL_CERT_FILE op Linux. Controleer of het pad werkt met curl voordat u de agent de schuld geeft.
curl -sS -o /dev/null -w '%{http_code}\n' https://example.comEen werkende proxy print 200 en het verzoek verschijnt in de output van mitmdump. Een niet-vertrouwde CA geeft curl: (60) SSL certificate problem: self-signed certificate in certificate chain, en het equivalent van een Node-agent is een foutmelding met de code SELF_SIGNED_CERT_IN_CHAIN. Lees de opgeslagen flows achteraf met de console-viewer, waar u een verzoek kunt openen om de headers en de body te bekijken.
mitmproxy -r /tmp/agent-flows.mitmEr zijn vier resultaten die het benoemen waard zijn. U ziet de verzoeken; lees deze en trek uw conclusie. De agent weigert te starten met een certificaatfout; dit is een vertrouwensprobleem in die runtime en geen bevinding over de leverancier. U ziet alleen de model-API; dit betekent dat de andere categorieën uitgeschakeld zijn of dat ze worden geactiveerd door een gebeurtenis die u niet heeft getriggerd. Of u ziet helemaal niets terwijl de agent duidelijk wel werkt; dit betekent dat de client de proxy-omgevingsvariabelen negeert of de certificaten vastzet (pinning), en geen enkele applicatie-instelling kan worden vertrouwd om u de waarheid te vertellen. Dat laatste resultaat is het meest relevant en dwingt u terug naar stap 3, omdat een pakket-capture niet kan worden genegeerd bij het observeren van een verbinding.
Controles, van zwakste naar sterkste
Opt-out-instellingen. De goedkoopste en zwakste methode, omdat deze afhankelijk is van de leverancier die ze respecteert en omdat ze een categorie bestrijken die al bestond. Stel ze zo in dat ze een herstart en een nieuwe terminal overleven, in het gebruikersinstellingenbestand of in uw shell-profiel. Voeg DO_NOT_TRACK=1 toe terwijl u toch bezig bent: dit is een conventie die veel command-line-tools respecteren, inclusief sommige agents, en het kost niets. Voer stap 3 opnieuw uit na de volgende update, aangezien dat het moment is waarop de dekking verandert.
Uitgaande netwerkbeperkingen (Egress restriction). Hier stopt u met vragen en begint u met afdwingen. Laat de agent draaien onder een eigen gebruiker, sta die gebruiker alleen loopback en DNS toe en blokkeer de rest. Dit voegt een eigen tabel toe, waardoor bestaande firewallregels ongemoeid blijven.
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
}
}Pas dit toe met sudo nft -f /etc/nftables.d/agent.nft, monitor de teller met sudo nft list table inet agentegress en lees de geblokkeerde pakketten met sudo journalctl -k -g agent-egress-drop. Een stijgende teller van geblokkeerde pakketten met een hostnaam die u niet verwachtte, is precies het doel van deze oefening. Twee eerlijke beperkingen. meta skuid komt overeen met de gebruiker die de socket bezit, dus dit werkt alleen zolang dat account niet kan wisselen naar een andere gebruiker: wachtwoordloze sudo voor de agent maakt van deze regel slechts een suggestie. En het openlaten van UDP 53 naar elke server laat een kanaal open dat data kan versturen via query-namen, dus sluit dit ook af als uw dreigingsmodel dat vereist, door de resolver van de agent te laten wijzen naar een host die u zelf beheert. Allowlists voor hostnamen horen thuis in een proxy in plaats van in nftables, omdat API-endpoints zich achter content delivery networks bevinden waarvan de IP-adressen onder uw handen veranderen. De kosten van deze controle zijn onderhoud en mogelijke defecten: pakketinstallaties, git via SSH en de eigen update-check van de agent falen allemaal totdat u ze toestaat, en die lijst moet u voortaan zelf onderhouden. Als u dit op een server instelt in plaats van op een laptop, vormt dezelfde account- en firewallstructuur de basis van veilig draaien van Claude Code op een VPS.
Een wegwerp-machine. Geef de agent een virtuele machine (VM) die geen inloggegevens bevat die voor u van belang zijn en die aan het einde van de taak wordt vernietigd. Dit vermindert niet wat de agent verstuurt, maar het vermindert waar de agent toegang toe heeft om te versturen, wat meestal het risico is waar het u werkelijk om gaat. Combineer dit met de bovenstaande uitgaande regels, omdat een nieuwe VM met onbeperkte internettoegang nog steeds elke host in uw bereik kan bereiken. De methode, en de status die u telkens opnieuw moet opbouwen, worden behandeld in draaien van coding agents in een wegwerp-VM, en de vraag over de benodigde capaciteit in draaien van een coding agent op een VPS.
Het model zelf hosten. De enige controle die de inferentiestroom verwijdert, omdat de prompt uw hardware nooit verlaat. De kosten zijn reëel: u kunt geen gesloten model zelf hosten, dus dit betekent kiezen voor open gewichten en een verschil in capaciteit accepteren bij complexe taken, plus de hardware om deze te draaien. De afweging wordt besproken in of u Claude zelf kunt hosten, en de verschillen in capaciteit tussen de belangrijkste agents in hoe Claude Code, Cursor, Codex en Copilot verschillen.
Geen van deze vier controles verandert wat de agent op schijf mag lezen, en inferentieverkeer draagt alles mee wat de agent leest. Als een .env-bestand in de werkmap staat, wordt het naar het model gestuurd zodra de agent zoekt naar een variabelenaam. Het buiten bereik houden van dat materiaal is een aparte taak, behandeld in geheimen buiten de context van een AI-agent houden.
Wat u moet controleren na elke update
- Vergelijk de instellingenpagina's en het datagebruik van de leverancier met uw vorige opnames; let hierbij op nieuwe schakelaars en nieuwe benoemde services.
- Lees de procesomgeving opnieuw uit via
/proc/<pid>/environom te bevestigen dat uw opt-outs nog steeds van toepassing zijn op het actieve proces. - Print de projectconfiguratiebestanden opnieuw uit, omdat een
git pulleen configuratiebestand kan importeren dat door een collega is gewijzigd. - Voer de SNI-capture uit voor één volledige sessie van werkelijk gebruik en vergelijk de lijst met hostnamen met uw vorige lijst.
- Controleer de firewall drop-teller, aangezien een nieuwe bestemming daar meestal verschijnt voordat u deze ergens anders opmerkt.
Dit kost ongeveer tien minuten en is het enige onderdeel van het proces dat niet veroudert. Een standaardinstelling die u in augustus 2026 heeft geverifieerd, is een feit over augustus 2026. De capture is een feit over vandaag.
FAQ
Kan ik voorkomen dat mijn coding agent mijn code naar het model stuurt?
Nee, en elke instelling die beweert dit te doen, beschrijft in feite iets anders. Het versturen van uw prompt, de bestanden die de agent heeft gelezen en de uitvoer van de uitgevoerde commando's naar het model-eindpunt is hoe inferentie werkt. De enige variabele is wie deze gegevens ontvangt. U kunt de ontvanger wijzigen door de agent te laten verwijzen naar een cloudaccount van een bedrijf of naar een model dat u zelf host. U kunt de hoeveelheid verzonden data beperken door in te stellen wat de agent mag lezen. Het uitschakelen van analytics en foutrapportage heeft geen enkele invloed op dit proces.
Hoe zie ik met welke hosts mijn coding agent verbinding maakt?
Voer de agent uit als een eigen Linux-gebruiker en leg vervolgens de TLS ClientHello van elke nieuwe verbinding vast terwijl u deze gebruikt: sudo tshark -i any -f 'tcp port 443' -Y 'tls.handshake.type == 1' -T fields -e ip.dst -e tls.handshake.extensions_server_name. Er verschijnt één regel per verbinding, met het doeladres en de aangevraagde hostnaam. Controleer de namen met sudo tcpdump -ni any 'udp port 53' en voer de capture uit op any, omdat een lokale resolver-stub op 127.0.0.53 de query als eerste afhandelt. Voer de capture uit terwijl de agent daadwerkelijk werk verricht, aangezien opstartpings en crashrapporten niet zichtbaar zijn in een inactieve capture.
Mijn proxy toont geen verkeer terwijl de agent werkt. Wat is er misgegaan?
Of de client negeert HTTP_PROXY en HTTPS_PROXY, of de client gebruikt certificate pinning en weigert uw CA. Test het pad eerst met curl: als curl het internet bereikt via de proxy en de agent verschijnt niet in de lijst met stromen, dan gebruikt de agent de proxy-omgevingsvariabelen niet. Sommige runtimes vereisen dat de CA op een specifieke manier wordt aangeleverd. Node in het bijzonder leest NODE_EXTRA_CA_CERTS alleen bij het starten van het proces, dus het exporteren ervan nadat de agent is gestart, heeft geen effect. Wanneer de proxy het verkeer niet kan zien, schakel dan over op packet capture; dit kan door geen enkele applicatie-instelling worden omzeild.
Stopt het uitschakelen van telemetrie het gebruik van mijn code voor training?
Nee. Analytics en crashrapportage zijn een ander proces dan inferentie. Het uitschakelen hiervan verwijdert gebruiksstatistieken en stack traces, maar elke prompt wordt nog steeds exact zoals voorheen naar het model gestuurd. Of die prompts worden bewaard en of ze worden gebruikt om een toekomstig model te trainen, wordt bepaald door de voorwaarden van uw abonnement. Consumentenabonnementen en commerciële abonnementen verschillen hierin meestal. Dit is een contract dat u moet lezen in plaats van een pakket dat u kunt opvangen. Controleer daarom de pagina over datagebruik van uw abonnement en tref, waar van belang, een commerciële overeenkomst of een zero-retention overeenkomst voordat u de eerste sessie start.