<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mak Atomic</title>
    <description>The latest articles on DEV Community by Mak Atomic (@marupxyyz01).</description>
    <link>https://dev.to/marupxyyz01</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4188828%2F72c2b7a2-5ba0-4fd4-ac1a-02178c0c36f4.jpg</url>
      <title>DEV Community: Mak Atomic</title>
      <link>https://dev.to/marupxyyz01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marupxyyz01"/>
    <language>en</language>
    <item>
      <title>What Your Laptop Tells Every Server: A 10-Minute Leak Audit with curl, dig and DevTools</title>
      <dc:creator>Mak Atomic</dc:creator>
      <pubDate>Fri, 16 Oct 2026 12:58:35 +0000</pubDate>
      <link>https://dev.to/marupxyyz01/what-your-laptop-tells-every-server-a-10-minute-leak-audit-with-curl-dig-and-devtools-1j18</link>
      <guid>https://dev.to/marupxyyz01/what-your-laptop-tells-every-server-a-10-minute-leak-audit-with-curl-dig-and-devtools-1j18</guid>
      <description>&lt;p&gt;Open a terminal and run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -s https://www.cloudflare.com/cdn-cgi/trace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You get a dozen lines back:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip=203.0.113.7

loc=LV

colo=RIX

sni=plaintext
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;ip=&lt;/code&gt; is your public address. &lt;code&gt;loc=&lt;/code&gt; is the country Cloudflare maps it to. &lt;code&gt;colo=&lt;/code&gt; is the data center that answered. &lt;code&gt;sni=plaintext&lt;/code&gt; means the hostname you asked for travelled unencrypted in the TLS handshake.&lt;/p&gt;

&lt;p&gt;That is one request to one server. Every site, API and package registry you touch gets the same data and more. Below is a small audit you can run in ten minutes: three tests, what each one shows, and a second run behind a VPN to see what changes and what does not.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

   &lt;strong&gt;TL;DR&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;our public IP, your DNS resolver and your WebRTC candidates are three separate exposure points. Fixing one does not fix the others.&lt;/li&gt;
&lt;li&gt;A VPN changes who sees your IP and your DNS queries. It does not change cookies, logins or browser fingerprint.&lt;/li&gt;
&lt;li&gt;Geolocation from an IP is a guess. Two services can disagree about the same address by a whole continent.

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Test 1: What the server sees (public IP)
&lt;/h2&gt;

&lt;p&gt;Start with the request above. Then ask a second service about the same address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -s https://ifconfig.co/json | head -n 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I ran both from the same machine, Cloudflare reported Latvia and the second service reported Tokyo. Same IP, same minute. IP geolocation databases are built from registry data, routing hints and guesses, and they lag behind when blocks of addresses move.&lt;/p&gt;

&lt;p&gt;Two things follow from this:&lt;/p&gt;

&lt;p&gt;"My location leaked through my IP" is usually true only at country or region level.&lt;br&gt;
A service that blocks or allows you by country is working from a database that can be wrong. If a site ever blocked you while you sat in the "right" country, this is why.&lt;/p&gt;
&lt;h2&gt;
  
  
  Test 2: Who answers your DNS questions
&lt;/h2&gt;

&lt;p&gt;Your browser knows the IP of a site because something resolved the name. That something is a DNS resolver, usually your router or your ISP, and it sees every hostname you look up, even when the page itself is HTTPS.&lt;/p&gt;

&lt;p&gt;Check which resolver the world sees when you ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig +short whoami.akamai.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer is the IP of the recursive resolver that reached Akamai's authoritative server on your behalf. If it belongs to your ISP, your ISP is reading your lookups. If it belongs to a public resolver you chose, that operator is.&lt;/p&gt;

&lt;p&gt;Encrypted DNS closes the path between you and the resolver. &lt;a href="https://datatracker.ietf.org/doc/html/rfc8484" rel="noopener noreferrer"&gt;DNS over HTTPS is defined in RFC 8484&lt;/a&gt;. It does not hide your lookups from the resolver itself, only from the network in between. The IETF's position on why this matters is blunt: R&lt;a href="https://datatracker.ietf.org/doc/html/rfc7258" rel="noopener noreferrer"&gt;FC 7258 is titled "Pervasive Monitoring Is an Attack"&lt;/a&gt; and asks protocol designers to make mass surveillance harder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 3: What the browser hands out via WebRTC
&lt;/h2&gt;

&lt;p&gt;WebRTC lets two browsers connect directly. To do that, a browser gathers "ICE candidates", which are possible network addresses, and some of them come from a STUN server that reports your public address back. MDN documents the candidate types: &lt;code&gt;host&lt;/code&gt; for local addresses, &lt;code&gt;srflx&lt;/code&gt; for the address a STUN server saw.&lt;/p&gt;

&lt;p&gt;Paste this into the DevTools console on any page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const pc = new RTCPeerConnection({

  iceServers: [{ urls: "stun:stun.l.google.com:19302" }],

});

pc.createDataChannel("probe");

pc.onicecandidate = (e) =&amp;gt; {

  if (e.candidate) console.log(e.candidate.candidate);

};

pc.createOffer().then((offer) =&amp;gt; pc.setLocalDescription(offer));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at the lines that contain &lt;code&gt;typ srflx&lt;/code&gt;. The address in that line is the public IP the STUN server saw. Modern browsers hide local &lt;code&gt;host&lt;/code&gt; addresses behind random &lt;code&gt;.local&lt;/code&gt; names, but the &lt;code&gt;srflx&lt;/code&gt; candidate is the one that matters here. If it differs from the IP in Test 1, something in your setup routes WebRTC outside your tunnel or proxy. That mismatch is the classic "WebRTC leak".&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it again behind a VPN
&lt;/h2&gt;

&lt;p&gt;Write down three results: public IP, resolver IP, &lt;code&gt;srflx&lt;/code&gt; address. Connect to a VPN, then repeat all three tests.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwwmnrat5cwup3n0lies.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwwmnrat5cwup3n0lies.png" alt="Table: expected results of IP, DNS and WebRTC tests behind a VPN" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want a visual version of the same data, the homepage of &lt;a href="https://atomicvpn.io" rel="noopener noreferrer"&gt;Atomic VPN&lt;/a&gt; has an "exposure" panel that lists the IP, city, ISP, device, browser and DNS a site can read from a single visit. I use it as a quick before-and-after check, but the three commands above are the real test because you can script them.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a VPN does not change
&lt;/h2&gt;

&lt;p&gt;Be clear about the limits, because "VPN" is sold as a stronger promise than it is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cookies and logins. If you are signed in, the site knows who you are regardless of IP.&lt;/li&gt;
&lt;li&gt;Browser fingerprint. Fonts, canvas, screen size and extensions identify a browser without any IP at all.&lt;/li&gt;
&lt;li&gt;What the VPN provider sees. You move trust from your ISP to the VPN operator. Read the logging policy and decide whether you accept it.&lt;/li&gt;
&lt;li&gt;Plain HTTP pages. The tunnel protects the path to the VPN server, not the path from there to the site.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  A small script to keep
&lt;/h2&gt;

&lt;p&gt;Save it as &lt;code&gt;leakcheck.sh&lt;/code&gt; and run it before and after you connect.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/env bash

echo "== public IP / country / colo =="

curl -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc|colo)='

echo "== resolver seen by Akamai =="

dig +short whoami.akamai.net

{% enddetails %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diff the output of the two runs. If the IP changed but the resolver did not, you have found a leak in about two seconds.&lt;/p&gt;

</description>
      <category>security</category>
      <category>privacy</category>
      <category>networking</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
