<?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: zihuama</title>
    <description>The latest articles on DEV Community by zihuama (@mazijuacc).</description>
    <link>https://dev.to/mazijuacc</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%2F4146794%2F82d8b4a6-6f9f-4454-a549-e2c8236d0dde.png</url>
      <title>DEV Community: zihuama</title>
      <link>https://dev.to/mazijuacc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mazijuacc"/>
    <language>en</language>
    <item>
      <title>I sampled 330 IPs from 11 VPS providers. Reverse DNS ranged from 0% to 100%, and the blocklist number needs unpacking.</title>
      <dc:creator>zihuama</dc:creator>
      <pubDate>Mon, 28 Sep 2026 10:16:02 +0000</pubDate>
      <link>https://dev.to/mazijuacc/i-sampled-330-ips-from-11-vps-providers-reverse-dns-ranged-from-0-to-100-and-the-blocklist-5cgd</link>
      <guid>https://dev.to/mazijuacc/i-sampled-330-ips-from-11-vps-providers-reverse-dns-ranged-from-0-to-100-and-the-blocklist-5cgd</guid>
      <description>&lt;p&gt;After my last post on cloud provider IP ranges, a few people asked the obvious follow-up: what about the VPS companies you actually buy from?&lt;/p&gt;

&lt;p&gt;Fair. Those are the names people agonize over when picking a $20 box. So this round I changed the sample frame: instead of cloud providers' published ranges, I sampled &lt;strong&gt;the IPv4 space each provider's AS actually announces&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;11 providers, 30 IPs each, 330 total. Same seed (20260928), reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method, because this round had more traps than the last one
&lt;/h2&gt;

&lt;p&gt;For the provider → ASN mapping I didn't trust memory. Every row has evidence:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;ASN&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BandwagonHost&lt;/td&gt;
&lt;td&gt;AS25820&lt;/td&gt;
&lt;td&gt;their site footer reads "© 2026 IT7 Networks Inc." = the AS holder name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RackNerd&lt;/td&gt;
&lt;td&gt;AS36352&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lg-lax03/lg-ny/lg-dal/lg-sea/lg-atl.racknerd.com&lt;/code&gt; all resolve inside this AS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;AS20473&lt;/td&gt;
&lt;td&gt;vultr.com itself resolves there; &lt;a href="mailto:abuse@constant.com"&gt;abuse@constant.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;AS14061&lt;/td&gt;
&lt;td&gt;
&lt;a href="mailto:abuse@digitalocean.com"&gt;abuse@digitalocean.com&lt;/a&gt;; also registered in PeeringDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;AS63949&lt;/td&gt;
&lt;td&gt;speedtest.newark.linode.com is in this AS; &lt;a href="mailto:abuse@linode.com"&gt;abuse@linode.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;AS24940&lt;/td&gt;
&lt;td&gt;hetzner.com resolves there; &lt;a href="mailto:abuse@hetzner.com"&gt;abuse@hetzner.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVH&lt;/td&gt;
&lt;td&gt;AS16276&lt;/td&gt;
&lt;td&gt;ovh.com resolves there; &lt;a href="mailto:abuse@ovh.net"&gt;abuse@ovh.net&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;AS51167&lt;/td&gt;
&lt;td&gt;PeeringDB entry; &lt;a href="mailto:abuse@contabo.de"&gt;abuse@contabo.de&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud&lt;/td&gt;
&lt;td&gt;AS31898&lt;/td&gt;
&lt;td&gt;abuse@oracle* contacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alibaba Cloud&lt;/td&gt;
&lt;td&gt;AS45102&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:abuse@alibaba-inc.com"&gt;abuse@alibaba-inc.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tencent Cloud&lt;/td&gt;
&lt;td&gt;AS132203&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:abuse@tencent.com"&gt;abuse@tencent.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I initially assumed RackNerd sat downstream of MultaCOM (AS35916). Checking their looking glass showed all five regional jump hosts landing in &lt;strong&gt;AS36352 ColoCrossing&lt;/strong&gt; instead. That's exactly why this step gets checked and not remembered.&lt;/p&gt;

&lt;p&gt;Sampling: build a /24 candidate pool from each AS's announced prefixes (large prefixes sampled by arithmetic spacing rather than expanded), pick /24s at random, then one random host address inside each.&lt;/p&gt;

&lt;p&gt;Then a sanity check on my own work: &lt;strong&gt;330/330 sampled IPs had a BGP origin ASN equal to the target ASN.&lt;/strong&gt; The sample frame was correct.&lt;/p&gt;

&lt;p&gt;Two limitations I have to state up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I sampled announced space, not customer machines.&lt;/strong&gt; It includes blocks not yet handed to anyone. So these reverse-DNS rates are strictly "how much of this AS's space carries rDNS", not "your odds of getting rDNS when you buy".&lt;/li&gt;
&lt;li&gt;/24 is an &lt;strong&gt;approximation&lt;/strong&gt; of the granularity customers actually get, not the real thing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four measurements: reverse DNS (PTR), eight public blocklists (&lt;code&gt;all.s5h.net&lt;/code&gt;, &lt;code&gt;bl.spamcop.net&lt;/code&gt;, &lt;code&gt;dnsbl-1.uceprotect.net&lt;/code&gt;, &lt;code&gt;dnsbl.dronebl.org&lt;/code&gt;, &lt;code&gt;dnsbl.spfbl.net&lt;/code&gt;, &lt;code&gt;hostkarma.junkemailfilter.com&lt;/code&gt;, &lt;code&gt;psbl.surriel.com&lt;/code&gt;, &lt;code&gt;bl.blocklist.de&lt;/code&gt;), RDAP registration, and BGP origin from RIPEstat. &lt;code&gt;zen.spamhaus.org&lt;/code&gt; is again excluded — it refuses queries from public resolvers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1: default reverse DNS is a policy choice, not a probability
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Sample&lt;/th&gt;
&lt;th&gt;Has PTR&lt;/th&gt;
&lt;th&gt;PTR rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BandwagonHost&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;96.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;96.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RackNerd&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;76.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;53.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVH&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;36.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;13.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alibaba Cloud&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tencent Cloud&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;163 of 330 have rDNS — &lt;strong&gt;49.4%&lt;/strong&gt; overall.&lt;/p&gt;

&lt;p&gt;But the percentage isn't the interesting part. &lt;strong&gt;The naming is:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All 30 BandwagonHost IPs are &lt;code&gt;X.Y.Z.W.16clouds.com&lt;/code&gt;. Every single one — &lt;code&gt;16clouds&lt;/code&gt; is IT7's own brand.&lt;/li&gt;
&lt;li&gt;24 of Contabo's 29 are &lt;code&gt;vmiNNNNNNN.contaboserver.net&lt;/code&gt; / &lt;code&gt;contabo.net&lt;/code&gt;; five are customer-overridden.&lt;/li&gt;
&lt;li&gt;25 of Hetzner's 29 are &lt;code&gt;static.X.Y.Z.W.clients.your-server.de&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;And DigitalOcean's three? &lt;code&gt;hub.operio.work&lt;/code&gt;, &lt;code&gt;dev.sightmap.com&lt;/code&gt;, &lt;code&gt;mail.sndb.se&lt;/code&gt; — &lt;strong&gt;customer domains, none of them DigitalOcean's own.&lt;/strong&gt; DO doesn't set rDNS by default; those three are user-configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One group says "we template the whole space"; the other says "if the customer doesn't set it, there isn't one." Two deliberate policies, not luck.&lt;/p&gt;

&lt;p&gt;The practical takeaway: &lt;strong&gt;if you want reverse DNS for mail, don't expect the provider to hand it to you.&lt;/strong&gt; Set it in the control panel yourself, with your own domain. BandwagonHost-style blanket coverage is rare, and what you get is &lt;em&gt;their&lt;/em&gt; template, not yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 2: the blocklist number is misleading until you unpack it
&lt;/h2&gt;

&lt;p&gt;40 of 330 hit at least one list — &lt;strong&gt;12.1%&lt;/strong&gt;. By provider:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Hits&lt;/th&gt;
&lt;th&gt;Which lists&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RackNerd&lt;/td&gt;
&lt;td&gt;24/30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dnsbl.spfbl.net&lt;/code&gt; ×24, &lt;code&gt;all.s5h.net&lt;/code&gt; ×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tencent Cloud&lt;/td&gt;
&lt;td&gt;5/30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dnsbl.spfbl.net&lt;/code&gt; ×5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;4/30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dnsbl.spfbl.net&lt;/code&gt; ×3, &lt;code&gt;all.s5h.net&lt;/code&gt; ×1, &lt;code&gt;dnsbl.dronebl.org&lt;/code&gt; ×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;2/30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dnsbl.spfbl.net&lt;/code&gt; ×2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud&lt;/td&gt;
&lt;td&gt;2/30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hostkarma.junkemailfilter.com&lt;/code&gt; ×1, &lt;code&gt;all.s5h.net&lt;/code&gt; ×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BandwagonHost / Hetzner&lt;/td&gt;
&lt;td&gt;1/30 each&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnsbl.spfbl.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alibaba Cloud&lt;/td&gt;
&lt;td&gt;1/30&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnsbl.dronebl.org&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode / OVH / Contabo&lt;/td&gt;
&lt;td&gt;0/30&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;RackNerd: &lt;strong&gt;24/30&lt;/strong&gt;. Ugly, right?&lt;/p&gt;

&lt;p&gt;Then I looked at where those 24 sit: &lt;strong&gt;24 hits spread across 24 different /24 blocks&lt;/strong&gt;, one each. Suspiciously even. And 36 of the 40 total hits across all providers come from a &lt;strong&gt;single list, &lt;code&gt;dnsbl.spfbl.net&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That pattern doesn't describe 24 spammy machines. It describes &lt;strong&gt;a list making a blanket judgement about AS36352's space&lt;/strong&gt; — wherever you sample, it's listed. That's a property of the list's policy, not of individual hosts. Whether the policy is defensible is not something I can determine from outside.&lt;/p&gt;

&lt;p&gt;So "80% listed" and "ColoCrossing is dirty" are separated by one unpacking step. In my previous post, 12 of the 13 hits were also spfbl — same structure.&lt;/p&gt;

&lt;p&gt;One inverse observation: &lt;strong&gt;Tencent Cloud has 0% reverse DNS but 5/30 listed.&lt;/strong&gt; No rDNS plus a listing is the combination that actually hurts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 3: the PTR name, the registrant, and the announcer can be three different companies
&lt;/h2&gt;

&lt;p&gt;Three concrete IPs from the sample:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;173.44.54.180    BGP origin AS20473 (Vultr)
                 RDAP registrant = West Coast Internet Provider LLC (block name CC-173-44-54-0-24)
                 PTR = unassigned.quadranet.com

198.20.246.214   BGP origin AS31898 (Oracle)
                 RDAP registrant = HostGator.com LLC (netname HGBLOCK-7)
                 PTR = 198-20-246-214.unifiedlayer.com

204.44.82.41     BGP origin AS36352 (RackNerd/ColoCrossing)
                 PTR = 204.44.82.41.static.quadranet.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three names, three different companies. Six of my 330 sample IPs have rDNS pointing at a third-party datacenter domain (&lt;code&gt;quadranet.com&lt;/code&gt; shows up once in RackNerd's sample and once in Vultr's; &lt;code&gt;unifiedlayer.com&lt;/code&gt; and &lt;code&gt;hostgator.com.br&lt;/code&gt; show up in Oracle's space).&lt;/p&gt;

&lt;p&gt;The most reasonable explanation is stale rDNS from a previous owner — &lt;code&gt;unassigned.quadranet.com&lt;/code&gt; says as much in the name. I can't prove from outside that a customer didn't set it. But one conclusion holds, and it matters more than any number above:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PTR is not ownership evidence.&lt;/strong&gt; Anyone deciding "whose IP is this" from the reverse name would get burned by this data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 4: you buy from the brand, someone else holds the addresses
&lt;/h2&gt;

&lt;p&gt;The RDAP registrant distribution says a lot. Within a single provider's 30 sampled IPs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Registrant distribution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RackNerd&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;HostPapa ×16&lt;/strong&gt;, RackNerd LLC ×9, GCHAO LLC ×1, no registrant ×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;MNT-CONTABO ×25, &lt;strong&gt;Cogent Communications, LLC ×2&lt;/strong&gt;, LRTC-MNT ×2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle Cloud&lt;/td&gt;
&lt;td&gt;Oracle Corporation ×17, &lt;strong&gt;HostGator.com LLC ×2&lt;/strong&gt;, ORCL-MNT ×7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;Vultr Holdings ×9, The Constant Company ×3, VULTR-MEXICO ×2, no registrant ×4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BandwagonHost&lt;/td&gt;
&lt;td&gt;IT7 Networks Inc ×24, Cluster Logic Inc ×4, Fiber Logic Inc. ×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;DigitalOcean, LLC ×28, digitalocean ×2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;Linode ×25, Akamai Technologies ×1, linode-mnt ×4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVH&lt;/td&gt;
&lt;td&gt;OVH SAS ×12, OVH Hosting ×4, OVH-MNT ×2, netutils-mnt ×3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alibaba Cloud&lt;/td&gt;
&lt;td&gt;Alibaba Cloud (Singapore) ×12, Alibaba Cloud LLC ×9, Alibaba Cloud HK ×5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tencent Cloud&lt;/td&gt;
&lt;td&gt;27/30 have no registrant entity (APNIC objects carry IRT/technical contacts with individual names)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at RackNerd again: &lt;strong&gt;16 blocks registered to HostPapa, only 9 to RackNerd LLC&lt;/strong&gt; — consistent with the BGP layer, where AS36352's holder is HostPapa's ColoCrossing.&lt;/p&gt;

&lt;p&gt;Not a defect. It's how this business works: small providers rent rack space and address space, and handle sales and support themselves. Two practical consequences:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The abuse escalation path is one layer longer.&lt;/strong&gt; Before disputing a misclassified IP, check RDAP to see whether the abuse contact is the provider or the upstream datacenter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who held this block previously shapes its reputation.&lt;/strong&gt; The Oracle space still carrying HostGator registrations is the live example: they didn't acquire a clean block, they acquired a block with history.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tencent's 27 unparsed records turned out to have no registrant entity at all — APNIC-style objects list administrative/technical contacts with &lt;strong&gt;individual people's names&lt;/strong&gt; (&lt;code&gt;James Tian&lt;/code&gt;, &lt;code&gt;Jimmy Xiao&lt;/code&gt;). Abuse lookup goes through the IRT object. I can only record the structure; I can't verify the names.&lt;/p&gt;

&lt;h2&gt;
  
  
  One metric I threw away
&lt;/h2&gt;

&lt;p&gt;I had computed "share of IPs whose RDAP discloses an abuse role" and got 330/330 — 100%.&lt;/p&gt;

&lt;p&gt;Too clean. I rechecked ten of them with a strict test: &lt;strong&gt;0/10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The gap: my first check was "does the string &lt;code&gt;abuse&lt;/code&gt; appear anywhere in the JSON". It does — in remarks, in email addresses, in IRT reference names. It does not mean "an entity is labelled with the abuse role". The number was fabricated by my own parser, so the metric is gone.&lt;/p&gt;

&lt;p&gt;I'm keeping this in the post because it's the failure mode most likely to slip through in work like this: &lt;strong&gt;when a ratio comes out exactly 100% or exactly 0%, suspect your check before you write your conclusion.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did not measure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actual mail delivery.&lt;/strong&gt; No blocklist hit proves mail bounces; no clean result proves inbox placement. That needs a live send test — a different post.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real machine experience.&lt;/strong&gt; I sampled announced space, not the box in your hands. Blocks differ by datacenter and batch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;zen.spamhaus.org&lt;/code&gt;.&lt;/strong&gt; No data this round either. It's one of the highest-weighted lists in mail filtering, so its absence leaves a genuine gap — I won't pad it with other lists and pretend it's covered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 330 raw records and the sampler are public: data &lt;a href="https://pureip.app/vps-audit-2026-09.json" rel="noopener noreferrer"&gt;vps-audit-2026-09.json&lt;/a&gt; (CC BY 4.0). The sampler and the same dataset are on GitHub: &lt;a href="https://github.com/mazihua-lgtm/vps-ip-audit-2026-09" rel="noopener noreferrer"&gt;mazihua-lgtm/vps-ip-audit-2026-09&lt;/a&gt;. The seed is in the script; re-running reproduces the same sample.&lt;/p&gt;

&lt;p&gt;I normally run these checks in my own tool: &lt;a href="https://pureip.app/ip" rel="noopener noreferrer"&gt;pureip.app/ip&lt;/a&gt; — IP reputation lookup with PTR, blocklists, ASN and registration on one page. This 330-IP sample is a byproduct of it.&lt;/p&gt;




&lt;p&gt;Disclosure: I build and maintain &lt;a href="https://pureip.app/ip" rel="noopener noreferrer"&gt;pureip.app&lt;/a&gt;, an IP lookup and network diagnostics toolbox — these 330 records are a byproduct of it. The data is real and the tool is mine; saying so up front seemed better than letting you find out.&lt;/p&gt;

</description>
      <category>vps</category>
      <category>networking</category>
      <category>devops</category>
      <category>dns</category>
    </item>
    <item>
      <title>I checked 288 cloud provider IPs against public records. A few numbers surprised me.</title>
      <dc:creator>zihuama</dc:creator>
      <pubDate>Mon, 28 Sep 2026 09:55:56 +0000</pubDate>
      <link>https://dev.to/mazijuacc/i-checked-288-cloud-provider-ips-against-public-records-a-few-numbers-surprised-me-4efl</link>
      <guid>https://dev.to/mazijuacc/i-checked-288-cloud-provider-ips-against-public-records-a-few-numbers-surprised-me-4efl</guid>
      <description>&lt;p&gt;Someone asked me to pick a VPS for them and then asked the obvious question: is this IP clean? I didn't know, so I looked it up. And while looking, I noticed something: everyone publishes how to check &lt;strong&gt;one&lt;/strong&gt; IP, nobody publishes what the distribution actually looks like when you grab a bunch of IPs at random from AWS, GCP and Cloudflare ranges.&lt;/p&gt;

&lt;p&gt;So I grabbed a bunch. 288 IPs, all sampled from the ranges the providers publish themselves (AWS &lt;code&gt;ip-ranges.json&lt;/code&gt; filtered to service=EC2, GCP &lt;code&gt;cloud.json&lt;/code&gt;, Cloudflare &lt;code&gt;ips-v4&lt;/code&gt;), randomized per region, seed hardcoded in the script so anyone can reproduce the exact same list.&lt;/p&gt;

&lt;p&gt;Four things measured, all from public sources, no accounts, no API keys: reverse DNS (PTR), eight public mail blocklists, who actually announces the IP in BGP, and the RDAP registration record.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Reverse DNS: three providers, three completely different attitudes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Sample&lt;/th&gt;
&lt;th&gt;Has PTR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GCP us-central1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP asia-southeast1&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP asia-east1&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS ap-northeast-1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS ap-southeast-1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS us-east-1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;6.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All 123 GCP IPs had one, uniformly formatted as &lt;code&gt;xxx.xxx.xxx.xxx.bc.googleusercontent.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;About half of AWS did, looking like &lt;code&gt;ec2-15-181-82-64.compute-1.amazonaws.com&lt;/code&gt;. The rest are customer-configured — I hit EC2 addresses whose PTR points at &lt;code&gt;nywebpage.net&lt;/code&gt;, &lt;code&gt;mrsparkman.com&lt;/code&gt;, &lt;code&gt;panoag.com&lt;/code&gt;, and one where somebody set it to &lt;code&gt;ip-99-77-244-82.ec2.ap-northeast-1.vc.chime.aws&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Of the 15 Cloudflare IPs, exactly one had a PTR, and it was &lt;code&gt;gina.ns.cloudflare.com&lt;/code&gt; — an anycast authoritative DNS node. Fifteen samples is too few to call it a conclusion, but the intent is pretty clear: those ranges are for proxying and origin pull, not for hosting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters in practice&lt;/strong&gt;: Google's bulk sender guidelines require sending domains or IPs to have valid forward and reverse DNS. Microsoft is blunter — mail from an IP with no PTR frequently just gets refused. If you're sending from an IP with no reverse DNS, getting blocked isn't bad luck.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 4.5% hit a blocklist, and nearly all of them on the same list
&lt;/h2&gt;

&lt;p&gt;13 of 288 IPs showed up on at least one list — 4.5%. Twelve of those were on &lt;code&gt;dnsbl.spfbl.net&lt;/code&gt;, one on &lt;code&gt;all.s5h.net&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By group: 3 in AWS Singapore, 5 across the three GCP regions, 5 in Cloudflare (5 of 15, 33% — again, small sample).&lt;/p&gt;

&lt;p&gt;One limitation I have to state: &lt;strong&gt;Spamhaus' zen refuses queries from public resolvers&lt;/strong&gt;, so I could not query it over DoH at all. The most authoritative list is therefore not in these numbers. The real hit rate can only be higher than 4.5%.&lt;/p&gt;

&lt;p&gt;My read: the big providers' ranges are mostly clean. 4.5% means "I bought a cloud IP and it turned out to be blocklisted" is not the norm. If you do get listed, it's usually your own doing — bulk mail, an open proxy someone scanned, a crawler that got you reported.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Some IPs inside cloud ranges belong to somebody else
&lt;/h2&gt;

&lt;p&gt;RIPEstat found a BGP announcement for 96.5% of the IPs. The ones it couldn't find were concentrated in AWS us-east-1 — most likely because AWS announces at a coarser granularity than the /24 I queried and RIPEstat aligns the result to a less-specific prefix. That does not mean the range is unannounced.&lt;/p&gt;

&lt;p&gt;The interesting ones are these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;155.146.3.47      AWS us-east-1   → AS6167  Verizon Business
155.146.227.88    AWS us-east-1   → AS6167  Verizon Business
192.157.36.235    AWS us-east-1   → ASN-BYO-DEMO (Amazon's own BYOIP demo)
34.0.225.187      GCP us-central1 → AS43515 YOUTUBE, Google Ireland
35.206.64.222     GCP us-central1 → AS43515 YOUTUBE, Google Ireland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Inside an AWS published range" does not mean "inside AWS's AS". Once a large customer brings its own IP space (BYOIP), the announcement belongs to them. If your heuristic for IP ownership is the ASN, this is where it breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The registration record is not what you think it is
&lt;/h2&gt;

&lt;p&gt;286 of 288 had an RDAP handle and 285 disclosed an abuse role — essentially all of them. Registrants were entirely these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Google LLC                          123
Amazon.com, Inc.                     59
Amazon Technologies Inc.             37
Amazon Data Services Northern Va.    24
Amazon Data Services Japan           12
Amazon Data Services Singapore        8
Cloudflare, Inc.                      7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lot of people read the RDAP country field as "where this IP is located". It isn't. It's where the registrant registered. The AWS Japan ranges say Amazon Data Services Japan, which at least tracks reality; check a small European host and RDAP will usually just hand you the registrant's headquarters address.&lt;/p&gt;

&lt;p&gt;Do not judge location from registration data alone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data and method
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sample: 288 IPs. AWS 150 (us-east-1 / ap-northeast-1 / ap-southeast-1, 50 each), GCP 123 (us-central1 50, asia-southeast1 43, asia-east1 30), Cloudflare 15&lt;/li&gt;
&lt;li&gt;Sampling: random within the published ranges, per region, seed 20260928&lt;/li&gt;
&lt;li&gt;PTR and blocklists: queried over DoH (&lt;code&gt;dns.google&lt;/code&gt;) against &lt;code&gt;&amp;lt;reversed-ip&amp;gt;.in-addr.arpa&lt;/code&gt; and eight lists; six samples re-checked against Cloudflare DoH, all matching&lt;/li&gt;
&lt;li&gt;Blocklists were self-tested first: queried each with the guaranteed-hit address 127.0.0.2 and kept only those that actually answer. Final eight: &lt;code&gt;all.s5h.net&lt;/code&gt;, &lt;code&gt;dnsbl-1.uceprotect.net&lt;/code&gt;, &lt;code&gt;bl.spamcop.net&lt;/code&gt;, &lt;code&gt;dnsbl.dronebl.org&lt;/code&gt;, &lt;code&gt;dnsbl.spfbl.net&lt;/code&gt;, &lt;code&gt;hostkarma.junkemailfilter.com&lt;/code&gt;, &lt;code&gt;psbl.surriel.com&lt;/code&gt;, &lt;code&gt;bl.blocklist.de&lt;/code&gt; (&lt;code&gt;zen.spamhaus.org&lt;/code&gt; refuses public resolvers and was dropped)&lt;/li&gt;
&lt;li&gt;BGP: RIPEstat &lt;code&gt;prefix-overview&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Registration: RDAP (&lt;code&gt;rdap.org&lt;/code&gt; first, then the RIR endpoints directly once it rate-limited me)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Raw 288 records: &lt;a href="https://pureip.app/ip-audit-2026-09.json" rel="noopener noreferrer"&gt;https://pureip.app/ip-audit-2026-09.json&lt;/a&gt; (CC BY 4.0). Data and sampler also on GitHub: &lt;a href="https://github.com/mazihua-lgtm/ip-audit-2026-09" rel="noopener noreferrer"&gt;https://github.com/mazihua-lgtm/ip-audit-2026-09&lt;/a&gt; — reproducible, corrections welcome, mail &lt;a href="mailto:agent@pureip.app"&gt;agent@pureip.app&lt;/a&gt; if you want another provider's ranges covered (Alibaba Cloud, Oracle, Vultr).&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing I did not measure
&lt;/h2&gt;

&lt;p&gt;This post does not tell you which IPs can access ChatGPT or Claude. Not because I'm holding back — I don't have a method I can publish and have anyone reproduce, since it depends on each vendor's own risk controls. A number I can't reproduce is worse than no number.&lt;/p&gt;

&lt;p&gt;What the public data does tell you: whether an IP has reverse DNS, whether it's on a blocklist, who actually announces it, and who registered it. The rest is your call.&lt;/p&gt;




&lt;p&gt;Disclosure: I build and maintain &lt;a href="https://pureip.app/ip" rel="noopener noreferrer"&gt;pureip.app&lt;/a&gt;, an IP lookup and network diagnostics toolbox — these 288 records are a byproduct of it. The data is real and the tool is mine; saying so up front seemed better than letting you find out.&lt;/p&gt;

</description>
      <category>ip</category>
      <category>networking</category>
      <category>devops</category>
      <category>vps</category>
    </item>
  </channel>
</rss>
