ipasis
Blog/Security Engineering

Real-Time IP Intelligence vs Static Blocklists: A Technical Analysis

December 21, 20255 min read

The Latency vs. Accuracy Trade-off

Security engineers implementing IP filtering strategies are often torn between two architectural approaches: maintaining local, static blocklists (DB-based) or querying external real-time APIs. While static lists offer microsecond lookup speeds, they suffer from inherent data staleness. Real-time intelligence offers precision but introduces network latency.

This article analyzes the technical viability of both approaches in the context of modern threat landscapes, specifically regarding residential proxies and ephemeral VPN endpoints.

The Architecture of Static Blocklists

Static blocklists rely on periodically downloading datasets (CSV, MMDB) containing CIDR ranges associated with known threats. These are loaded into memory or a local database (Redis, Postgres) for O(1) lookups.

Limitations

  1. The Stale Data Problem: Threat actors utilize residential proxy networks (RPNs) where IP rotation occurs every 5 to 10 minutes. A blocklist updated every 24 hours is effectively useless against sophisticated botnets rotating through legitimate ISP ranges.
  2. False Positives: Static lists often block entire ASNs or large subnets to compensate for lack of granularity. This results in high collateral damage, blocking legitimate users sharing an ISP node with a bad actor.
  3. Maintenance Overhead: Engineering teams must build pipelines to ingest, parse, validate, and rotate these lists to prevent application downtime during updates.

Real-Time IP Intelligence

Real-time APIs, like IPASIS, query a live intelligence engine at the moment of the request. This engine aggregates data from honeypots, BGP routing tables, and behavioral analysis to return a risk score based on the IP's current state.

Advantages

  • Granularity: Distinguishes between a VPN concentrator, a TOR exit node, and a compromised residential IoT device.
  • Zero-Day Detection: Identifies new proxy nodes minutes after they become active.
  • Contextual Metadata: Returns connection type (mobile vs. broadband), ISP, and location, allowing for granular logic (e.g., "Block if VPN AND High Risk, but CAPTCHA if Residential AND High Risk").

Implementation Strategy: The Hybrid Approach

For high-throughput systems, querying an API for every request is inefficient. The optimal pattern utilizes a high-performance local cache (Redis) with a short TTL to store API responses.

Code Example: Go

Below is a production-ready pattern using Go to implement a cached IP intelligence lookup. This minimizes API latency overhead while ensuring data freshness.

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/go-redis/redis/v8"
)

// IPASISResponse structure for unmarshalling
type IPASISResponse struct {
	IP          string  `json:"ip"`
	IsProxy     bool    `json:"is_proxy"`
	ProxyType   string  `json:"proxy_type"`
	RiskScore   float64 `json:"risk_score"`
}

var ctx = context.Background()

func CheckIP(rdb *redis.Client, ip string) (*IPASISResponse, error) {
	// 1. Check Local Cache (Redis)
	val, err := rdb.Get(ctx, "ip_risk:"+ip).Result()
	if err == nil {
		// Cache Hit
		var cachedResp IPASISResponse
		json.Unmarshal([]byte(val), &cachedResp)
		return &cachedResp, nil
	}

	// 2. Cache Miss: Query IPASIS API
	client := &http.Client{Timeout: 2 * time.Second}
	req, _ := http.NewRequest("GET", fmt.Sprintf("https://api.ipasis.com/v1/lookup?ip=%s", ip), nil)
	req.Header.Add("X-API-Key", "YOUR_API_KEY")

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	var apiData IPASISResponse
	if err := json.NewDecoder(resp.Body).Decode(&apiData); err != nil {
		return nil, err
	}

	// 3. Set Cache with short TTL (e.g., 10 minutes) to balance freshness vs performance
	jsonBytes, _ := json.Marshal(apiData)
	rdb.Set(ctx, "ip_risk:"+ip, jsonBytes, 10*time.Minute)

	return &apiData, nil
}

Code Example: Node.js (Middleware)

An Express middleware implementation focusing on non-blocking checks.

const axios = require('axios');
const NodeCache = require('node-cache');
const ipCache = new NodeCache({ stdTTL: 600 }); // 10 min TTL

const ipFilterMiddleware = async (req, res, next) => {
  const clientIp = req.ip;

  // 1. Check In-Memory Cache
  const cachedData = ipCache.get(clientIp);
  if (cachedData) {
    if (cachedData.is_proxy && cachedData.risk_score > 80) {
      return res.status(403).json({ error: 'Access Denied' });
    }
    return next();
  }

  try {
    // 2. Query Real-Time API
    const response = await axios.get(`https://api.ipasis.com/v1/lookup`, {
      params: { ip: clientIp, key: process.env.IPASIS_KEY }
    });
    
    const data = response.data;
    ipCache.set(clientIp, data);

    // 3. Enforce Policy
    if (data.is_proxy && data.risk_score > 80) {
      return res.status(403).json({ error: 'Access Denied' });
    }
    
    next();
  } catch (error) {
    // Fail open or closed depending on security posture
    console.error('IP Intelligence Failure', error);
    next(); 
  }
};

Comparison Matrix

| Feature | Static Blocklists | Real-Time API (IPASIS) | | :--- | :--- | :--- | | Data Freshness | 24h - 1 week | < 1 second | | Residential Proxy Detection | Poor | Excellent | | Implementation | Database/File I/O | HTTP/REST | | Latency | ~0ms | Network RTT (20-100ms) | | False Positive Rate | High (Subnet blocking) | Low (IP specific) |

FAQ

Q: Does querying an API introduce too much latency?

A: For blocking synchronous requests, latency is a factor. We recommend performing IP lookups asynchronously for non-critical paths (e.g., logging) or using a caching layer (as shown in the code snippets) to reduce the RTT impact to only the first request per session.

Q: Can I just block all Data Center IPs?

A: Historically, yes. However, modern attackers route traffic through compromised residential devices. Blocking only Data Centers misses the majority of sophisticated bot traffic.

Q: What happens if the API is down?

A: Production integrations should implement a "Fail Open" (allow traffic) or "Fail Closed" (block traffic) logic based on your risk tolerance, combined with circuit breaker patterns.

Integrate IPASIS Today

Static lists cannot keep pace with the rotation speed of modern residential proxies. IPASIS provides enterprise-grade, real-time detection of VPNs, proxies, and tor nodes with industry-leading accuracy.

Get your free API key and start filtering bad traffic in minutes.

Start detecting VPNs and Bots today.

Identify anonymized traffic instantly with IPASIS.

Get API Key