Examples
A simple production example: you rotate between different proxy IPs, but they all sit in the same subnet. On paper you have IP rotation. In practice, the target sees traffic coming from the same neighborhood.
import ipaddress
ips = [
"192.168.10.12",
"192.168.10.44",
"192.168.11.9",
]
for ip in ips:
network = ipaddress.ip_network(f"{ip}/24", strict=False)
print(ip, "->", network)
Output:
192.168.10.12 -> 192.168.10.0/24
192.168.10.44 -> 192.168.10.0/24
192.168.11.9 -> 192.168.11.0/24
The first two IPs are different addresses in the same /24 subnet. If a site is rate-limiting or blocking by subnet, those IPs are not really independent.
You can also inspect subnets quickly from the command line:
python - <<'PY'
import ipaddress
ip = ipaddress.ip_network('203.0.113.57/24', strict=False)
print(ip)
PY
Practical tips
- Don't judge a proxy pool by raw IP count alone: check how many distinct subnets and ASNs it actually covers.
- If you keep getting blocked after rotating IPs, inspect subnet concentration: a lot of providers sell "large" pools that are really clustered into a small number of ranges.
- For tougher targets, diversity matters across multiple layers: subnet, ASN, geography, and request behavior.
- Residential and mobile pools often give you better subnet spread than cheap datacenter pools, but they cost more and can be slower.
- If you're running your own rotation logic, log the IP, subnet, ASN, status code, and block rate together. Otherwise you can't tell whether bans are tied to single IPs or whole ranges.
- This is one reason teams use a router layer instead of hardwiring one proxy source: if one provider's traffic is too concentrated in a few subnets, you need a way to shift traffic without rebuilding the whole scraper.
Example of logging subnet information in Python:
import ipaddress
ip = "198.51.100.23"
subnet = ipaddress.ip_network(f"{ip}/24", strict=False)
print({"ip": ip, "subnet": str(subnet), "status": 403})
Use cases
- Proxy pool evaluation: checking whether a provider's "10 million IPs" are actually spread across enough network ranges to be useful.
- Block investigation: figuring out why rotated requests still get 403s, captchas, or throttling.
- Rate-limit design: distributing requests across genuinely different network ranges instead of cycling through adjacent IPs.
- Geo scraping: combining subnet diversity with country or city targeting when sites apply regional and network-based filtering.
- Provider failover: moving traffic away from a source whose IPs are overused or clustered in ranges a target already distrusts.