Corregir la geolocalización IPv4 tras una transferencia
Respuesta rápida: tras una transferencia, la geolocalización IPv4 puede seguir mostrando el país equivocado (el anterior) porque el registro, el anuncio BGP y cada base de datos GeoIP comercial son sistemas separados. Cambiar el registro no reescribe las bases. Lo que funciona es publicar su propio archivo de ubicación (un geofeed según RFC 8805), referenciarlo desde su objeto de la RIPE Database y enviar una corrección a cada proveedor, guardando los identificadores de ticket. Ningún proveedor garantiza una fecha. Comprobado el 2026-10-14. Los pasos de registro están en nuestra guía de transferencias de RIPE NCC; este artículo empieza cuando el bloque ya es suyo.
Cuatro registros, cuatro preguntas distintas
| Registro | Responde a | Quién lo fija | Qué puede afectar |
|---|---|---|---|
| Registro RIR (WHOIS) | Quién posee el bloque | El titular, en el registro | La identidad del titular. country: no es una ubicación |
| Origen BGP y ROA | Quién lo anuncia y si está autorizado | Usted, en sus routers y en RPKI | Alcanzabilidad y validez de la ruta, no el país |
| Geofeed (RFC 8805) | Dónde dice el operador que se usa cada prefijo | Usted, en un archivo propio | Una pista para los proveedores que lo leen |
| Base GeoIP comercial | Dónde cree el proveedor que está la dirección | El proveedor, con sus fuentes | Lo que ven los sitios web y las apps |
Lo quinto, dónde están realmente sus servidores, es lo que las otras cuatro intentan modelar. La documentación de la RIPE Database dice que nunca se ha especificado qué representa country:, así que no puede usarse de forma fiable para asignar direcciones IP a países, y RIPE NCC declara que no es un proveedor de geolocalización. Un bloque puede estar registrado a una empresa de un país y funcionar en otro, y ambos registros son correctos.
Diagnóstico con una lista y un script
| Comprobación | Comando | Afecta a |
|---|---|---|
| CIDR y registro | whois -h whois.ripe.net -r -T inetnum 192.0.2.0/24 |
Titular, country:, la línea geofeed: |
| Archivo geofeed | curl -s <url de geofeed:> |
La pista de ubicación para los proveedores que lo leen |
| AS de origen y ROA | RIPEstat prefix-overview, rpki-validation |
Enrutamiento y validez de la ruta, no el país |
| Registros de proveedores | La página pública de consulta del proveedor | El país que ven sus usuarios y socios |
| DNS inverso | dig -x 192.0.2.1 |
Comprobaciones de correo y legibilidad de logs; ninguna fuente revisada lo usa para el país |
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 y 2001:db8::/32 son prefijos de documentación: úselos solo para la sintaxis, porque no se anuncian y la consulta a RIPE devuelve para ellos el bloque padre ajeno a RIPE. Para la salida real usamos el prefijo propio de DCXV y AS204057 (ejecutado el 2026-10-14; Linux, whois 5.6, jq 1.8; en un sistema sin archivo services añada -p 43 a whois):
$ whois -h whois.ripe.net -r -T inetnum 178.23.189.0/24 | grep -E '^(inetnum|netname|country|geofeed)'
inetnum: 178.23.189.0 - 178.23.189.255
netname: CY-DCXV-20210903
country: CY
geofeed: https://dcxv.com/geofeed.csv
$ curl -s 'https://stat.ripe.net/data/prefix-overview/data.json?resource=178.23.189.0/24' | jq -c '.data.asns'
[{"asn":204057,"holder":"DCXV-AS DCXV INTERNATIONAL LTD"}]
$ curl -s 'https://stat.ripe.net/data/rpki-validation/data.json?resource=204057&prefix=178.23.189.0/24' | jq -r '.data.status'
valid
El registro dice CY porque el titular es una empresa chipriota, mientras que los servidores están en otro sitio. El AS de origen y la ROA son válidos y hay un atributo geofeed:. Esa mezcla es normal y por eso un proveedor puede mostrar un país que el registro no indica. DCXV publica aquí los datos de su red. Si tiene un bloque con este problema, puede enviarnos una consulta sobre la transferencia IPv4.
El script siguiente (Python 3.8+, solo biblioteca estándar, probado en 3.14, solo recursos de la región RIPE) imprime el objeto de registro, el AS de origen, el estado RPKI y la línea de geofeed más específica para un prefijo, con la RIPE Database y RIPEstat. Lo ejecutamos con prefijos de DCXV, prefijos de documentación y casos de error; la coincidencia con el feed se comprobó además sin conexión con un archivo de ejemplo.
#!/usr/bin/env python3
"""geocheck.py PREFIX - registry country, origin ASN, RPKI status and geofeed line for a prefix.
Python 3.8+, standard library only. Data: RIPE Database REST API and RIPEstat (RIPE region only)."""
import csv, io, ipaddress, json, sys, time, urllib.error, urllib.parse, urllib.request
def get(url):
req = urllib.request.Request(url, headers={'Accept': 'application/json', 'User-Agent': 'geocheck/1.0'})
for attempt in range(4):
try:
with urllib.request.urlopen(req, timeout=20) as r:
return r.read(5_000_000).decode('utf-8-sig', 'replace') # cap the read at 5 MB
except OSError as e: # includes HTTP 429 and connection resets
if isinstance(e, urllib.error.HTTPError) and 400 <= e.code < 500 and e.code != 429:
sys.exit('request refused for %s: %s' % (url, e)) # retrying a 4xx will not help
if attempt == 3:
sys.exit('network error for %s: %s' % (url, e))
time.sleep(2 ** attempt)
def stat(call, **q):
return json.loads(get('https://stat.ripe.net/data/%s/data.json?%s' % (call, urllib.parse.urlencode(q))))['data']
def registry(net):
# best match: the most specific inetnum / inet6num that covers the prefix
t = 'inet6num' if net.version == 6 else 'inetnum'
q = urllib.parse.urlencode([('query-string', str(net)), ('source', 'ripe'), ('type-filter', t),
('flags', 'no-referenced'), ('flags', 'no-irt')])
try:
obj = json.loads(get('https://rest.db.ripe.net/search.json?' + q))['objects']['object'][0]
except (ValueError, KeyError, IndexError):
return None
return {a['name']: a['value'] for a in obj['attributes']['attribute']}
def feed_match(url, net):
# most specific feed entry that covers the prefix; RFC 8805 columns: prefix,country,region,city
best = None
for row in csv.reader(io.StringIO(get(url))):
if not row or row[0].lstrip().startswith('#'):
continue
try:
p = ipaddress.ip_network(row[0].strip(), strict=False)
except ValueError:
continue
if p.version == net.version and net.subnet_of(p) and (best is None or p.prefixlen > best[0].prefixlen):
best = (p, row)
return best[1] if best else None
def main(arg):
try:
net = ipaddress.ip_network(arg, strict=False)
except ValueError:
sys.exit('usage: geocheck.py PREFIX (for example 192.0.2.0/24)')
if net.prefixlen == net.max_prefixlen:
sys.exit('give the prefix, not a single address: a /32 or /128 gives a misleading RPKI result')
if net.prefixlen == 0:
sys.exit('give a real prefix, not the default route')
print('prefix ', net)
reg = registry(net)
top = reg and ((reg.get('netname') or '').startswith('NON-RIPE-NCC-MANAGED')
or (reg.get('inetnum') or '').startswith('0.0.0.0 -') or reg.get('inet6num') == '::/0')
if not reg or top:
print('registry object outside the RIPE NCC: query that RIR instead')
else:
print('registry object ', reg.get('inetnum') or reg.get('inet6num'), '| netname', reg.get('netname'), '| status', reg.get('status'))
print('registry country ', reg.get('country'), '(country: is not a location)')
ov = stat('prefix-overview', resource=str(net))
asns = [str(a['asn']) for a in ov.get('asns', [])]
print('origin ASN ', ', '.join('AS' + a for a in asns) or 'not announced (no origin in RIPEstat)')
for a in asns:
print('RPKI AS%-9s' % a, stat('rpki-validation', resource=a, prefix=str(net))['status'])
url = None if top else (reg or {}).get('geofeed')
if not url:
print('geofeed none (no geofeed: attribute on the best-match object)')
return
print('geofeed URL ', url)
if not url.startswith('https://'):
sys.exit('geofeed URL is not https://, not fetched')
row = feed_match(url, net)
print('geofeed line ', ','.join(row[:4]) if row else 'NO entry covers this prefix')
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit('usage: geocheck.py PREFIX')
main(sys.argv[1])
Lo que busca es valid y una línea del feed para su prefijo. "NO entry covers this prefix" significa que los proveedores que leen su feed omitirán el bloque.
Dónde enviar las correcciones
Use el canal actual de cada proveedor; corregir uno no corrige los demás. Documentación comprobada el 2026-10-14.
| Proveedor | Canal | Qué dice su documentación |
|---|---|---|
| MaxMind | Formularios puntuales; GeoIP Exchange para operadores | Acepta geofeeds RFC 8805 y RFC 9632, revisados una vez por día hábil; sin fecha de publicación |
| IPinfo | Página de correcciones; geofeeds | Publicación en la comunidad (2026-02-05): primero la medición, geofeeds de forma selectiva |
| DB-IP | Enlace de reporte en el resultado; lotes por formulario de contacto | Un cambio en el WHOIS del RIR suele activar la actualización; un geofeed es otra vía |
| IP2Location | Contacto e informe de precisión de datos | Fechas de publicación por licencia; sin procedimiento público de corrección ni de geofeed |
| Formulario de reporte de IP en la Ayuda de Search | Las actualizaciones pueden tardar más de un mes ("may take more than a month"); sin respuesta individual |
Publique un geofeed y enlácelo
Un geofeed es un archivo CSV definido por el RFC 8805: ip_prefix,alpha2code,region,city. Se permiten prefijos anidados y gana el más específico. El RFC pide UTF-8 y saltos de línea CRLF, declara obsoleto el código postal (omítalo) y permite a los consumidores tratar los datos solo como una pista. Un archivo mínimo con prefijos de documentación:
# prefix,country,region,city
192.0.2.0/24,CZ,CZ-10,Prague
2001:db8::/32,CZ,CZ-10,Prague
Aloje el archivo en HTTPS y añada una línea geofeed: https://example.net/geofeed.csv a su inetnum o inet6num; el atributo es opcional y único. El RFC 9632 indica a los consumidores usar el objeto más específico que tenga geofeed e ignorar entonces otras pistas como country:. También define una firma RPKI opcional para el archivo; no verificamos qué proveedores la comprueban. Tras una transferencia, lea el objeto: una línea geofeed: dejada por el vendedor apunta a un archivo que usted no controla.
Plan de pasos para el nuevo titular
- Reúna pruebas. El registro que lo muestra como titular, la lista de CIDR y la prueba de dónde funcionan los servidores.
- Corrija su parte. Rectifique la línea
geofeed:, publique el archivo, ejecute el script. - Envíe a cada proveedor. Una solicitud por proveedor, con la URL del feed. Indique solo la ubicación real: los proveedores pueden contrastarla con sus propias mediciones.
- Lleve un registro. Identificador de ticket, fecha, proveedor, prefijo, respuesta.
- Compruebe más adelante. Nadie promete una fecha, así que no planifique un lanzamiento sobre ella.
Síntoma, causa, comprobación, acción
| Síntoma | Causa posible | Verificar | Acción |
|---|---|---|---|
| Varios proveedores muestran el país anterior | Sin geofeed, o aún no leído | El script: ¿línea geofeed: y fila coincidente? |
Publicar el feed y una corrección por proveedor |
| Un proveedor sigue el registro, no su feed | Ese proveedor no usa feeds | Su documentación y una consulta | Enviar una corrección con la URL del feed |
| El feed está activo y siguen los datos antiguos | Retraso de publicación, fallo de descarga o la medición discrepa | HTTPS accesible, prefijo cubierto, sin fila anidada conflictiva | Preguntar al proveedor, guardar el ticket, comprobar más tarde |
| Solo un CDN, banco o servicio de pagos se equivoca | Usa datos propios: Cloudflare, por ejemplo, actualiza su base varias veces por semana y no puede garantizar que coincida con otros proveedores; los motores de riesgo pueden ponderar otras señales | Preguntar qué fuente usa | Corregir esa fuente y avisar al servicio |
| País correcto, ciudad errónea | El feed no tiene ciudad o la medición difiere | La columna city del feed | Añadir región y ciudad y volver a pedir |

Estime el riesgo antes de comprar
Las listas negras y el abuso están en la checklist de due diligence; aquí solo la geolocalización. Consulte el prefijo en varios proveedores ahora, lea su inetnum (country: y cualquier URL geofeed:) y averigüe quién controla ese archivo. Acuerde en el contrato que el vendedor entregue o elimine la referencia al feed en el cierre.
Siguiente paso
¿No sabe dónde está el fallo? Envíenos una consulta sobre la transferencia IPv4 o escriba a ipv4@dcxv.com con el prefijo y el síntoma. No prometemos cuándo actualizará un proveedor.
