Corrigir a geolocalização IPv4 após uma transferência
Resposta rápida: após uma transferência, a geolocalização IPv4 pode continuar a mostrar o país errado (o anterior), porque o registo, o anúncio BGP e cada base de dados GeoIP comercial são sistemas separados. Alterar o registo não reescreve as bases. O que funciona é publicar o seu próprio ficheiro de localização (um geofeed conforme a RFC 8805), referenciá-lo no seu objeto da RIPE Database e enviar uma correção a cada fornecedor, guardando os identificadores dos tickets. Nenhum fornecedor garante uma data. Verificado em 2026-10-14. Os passos de registo estão no nosso guia de transferências RIPE NCC; este artigo começa quando o bloco já é seu.
Quatro registos, quatro perguntas diferentes
| Registo | Responde a | Quem o define | O que pode afetar |
|---|---|---|---|
| Registo RIR (WHOIS) | Quem detém o bloco | O titular, no registo | A identidade do titular. country: não é uma localização |
| Origem BGP e ROA | Quem o anuncia e se está autorizado | Você, nos seus routers e no RPKI | Alcançabilidade e validade da rota, não o país |
| Geofeed (RFC 8805) | Onde o operador diz usar cada prefixo | Você, num ficheiro alojado por si | Uma pista para os fornecedores que o leem |
| Base GeoIP comercial | Onde o fornecedor acredita que está o endereço | O fornecedor, com as suas fontes | O que veem os sites e as aplicações |
O quinto elemento, onde os seus servidores realmente estão, é o que os outros quatro tentam modelar. A documentação da RIPE Database diz que nunca foi especificado o que country: representa, pelo que não pode ser usado de forma fiável para associar endereços IP a países, e o RIPE NCC declara que não é um fornecedor de geolocalização. Um bloco pode estar registado numa empresa de um país e operar noutro, e ambos os registos estão corretos.
Diagnóstico com uma lista e um script
| Verificação | Comando | Afeta |
|---|---|---|
| CIDR e registo | whois -h whois.ripe.net -r -T inetnum 192.0.2.0/24 |
Titular, country:, a linha geofeed: |
| Ficheiro geofeed | curl -s <URL de geofeed:> |
A pista de localização para os fornecedores que o leem |
| AS de origem e ROA | RIPEstat prefix-overview, rpki-validation |
Encaminhamento e validade da rota, não o país |
| Registos dos fornecedores | A página pública de consulta do fornecedor | O país que os seus utilizadores e parceiros veem |
| DNS inverso | dig -x 192.0.2.1 |
Verificações de correio e legibilidade dos logs; nenhuma fonte verificada o usa para o país |
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 e 2001:db8::/32 são prefixos de documentação: use-os só para a sintaxe, porque não são anunciados e a consulta ao RIPE devolve para eles o bloco-pai fora do RIPE. Para a saída real usamos o prefixo próprio da DCXV e o AS204057 (executado em 2026-10-14; Linux, whois 5.6, jq 1.8; num sistema sem ficheiro services acrescente -p 43 ao 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
O registo diz CY porque o titular é uma empresa cipriota, enquanto os servidores estão noutro local. O AS de origem e a ROA são válidos e existe um atributo geofeed:. Esta combinação é normal e é por isso que um fornecedor pode mostrar um país que o registo não indica. A DCXV publica aqui os dados da sua rede. Se detém um bloco com este problema, pode enviar-nos um pedido sobre a transferência IPv4.
O script abaixo (Python 3.8+, só biblioteca padrão, testado em 3.14, apenas recursos da região RIPE) imprime o objeto de registo, o AS de origem, o estado RPKI e a linha de geofeed mais específica para um prefixo, com a RIPE Database e o RIPEstat. Executámo-lo com prefixos da DCXV, prefixos de documentação e casos de erro; a correspondência com o feed foi ainda verificada offline num ficheiro de exemplo.
#!/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])
O que quer ver é valid e uma linha do feed para o seu prefixo. "NO entry covers this prefix" significa que os fornecedores que leem o seu feed vão ignorar o bloco.
Onde enviar as correções
Use o canal atual de cada fornecedor; corrigir um não corrige os outros. Documentação verificada em 2026-10-14.
| Fornecedor | Canal | O que diz a documentação |
|---|---|---|
| MaxMind | Formulários pontuais; GeoIP Exchange para operadores | Aceita geofeeds RFC 8805 e RFC 9632, revistos uma vez por dia útil; sem data de lançamento |
| IPinfo | Página de correções; geofeeds | Publicação na comunidade (2026-02-05): primeiro a medição, geofeeds seletivamente |
| DB-IP | Ligação de reporte no resultado; lotes pelo formulário de contacto | Uma alteração no WHOIS do RIR costuma desencadear a atualização; um geofeed é outra via |
| IP2Location | Contacto e relatório de precisão dos dados | Datas de lançamento por licença; sem procedimento público de correção nem de geofeed |
| Formulário de reporte de IP na Ajuda do Search | As atualizações podem demorar mais de um mês ("may take more than a month"); sem resposta individual |
Publique um geofeed e ligue-o
Um geofeed é um ficheiro CSV definido pela RFC 8805: ip_prefix,alpha2code,region,city. São permitidos prefixos aninhados e prevalece o mais específico. A RFC pede UTF-8 e quebras de linha CRLF, considera o código postal obsoleto (omita-o) e permite aos consumidores tratar os dados apenas como uma pista. Um ficheiro mínimo com prefixos de documentação:
# prefix,country,region,city
192.0.2.0/24,CZ,CZ-10,Prague
2001:db8::/32,CZ,CZ-10,Prague
Aloje-o em HTTPS e acrescente uma linha geofeed: https://example.net/geofeed.csv ao seu inetnum ou inet6num; o atributo é opcional e único. A RFC 9632 manda os consumidores usar o objeto mais específico que tenha geofeed e depois ignorar outras pistas, como country:. Define também uma assinatura RPKI opcional para o ficheiro; não verificámos que fornecedores a validam. Após uma transferência, leia o objeto: uma linha geofeed: deixada pelo vendedor aponta para um ficheiro que não controla.
Um plano de passos para o novo titular
- Reúna provas. O registo que o mostra como titular, a lista de CIDR e a prova de onde funcionam os servidores.
- Corrija o seu lado. Retifique a linha
geofeed:, publique o ficheiro, execute o script. - Submeta a cada fornecedor. Um pedido cada, com o URL do feed. Indique apenas a localização real: os fornecedores podem cruzá-la com as suas próprias medições.
- Mantenha um registo. Identificador do ticket, data, fornecedor, prefixo, resposta.
- Reverifique mais tarde. Ninguém promete uma data, por isso não planeie um lançamento em função dela.
Sintoma, causa, verificação, ação
| Sintoma | Causa possível | Verificar | Ação |
|---|---|---|---|
| Vários fornecedores mostram o país anterior | Sem geofeed, ou ainda não lido | O script: linha geofeed: e entrada correspondente? |
Publicar o feed e uma correção por fornecedor |
| Um fornecedor segue o registo, não o seu feed | Esse fornecedor não usa feeds | A sua documentação e uma consulta | Enviar uma correção com o URL do feed |
| O feed está ativo e os dados antigos persistem | Atraso de lançamento, falha de obtenção ou a medição diverge | HTTPS acessível, prefixo coberto, sem linha aninhada em conflito | Perguntar ao fornecedor, guardar o ticket, reverificar mais tarde |
| Só uma CDN, banco ou serviço de pagamentos erra | Usa dados próprios: a Cloudflare, por exemplo, atualiza a sua base várias vezes por semana e não pode garantir que coincide com outros fornecedores; os motores de risco podem ponderar outros sinais | Perguntar que fonte usa | Corrigir essa fonte e depois avisar o serviço |
| País certo, cidade errada | O feed não tem cidade ou a medição difere | A coluna city do feed | Acrescentar região e cidade e voltar a pedir |

Estime o risco antes de comprar
As listas negras e o abuso estão na checklist de due diligence; aqui só a geolocalização. Consulte o prefixo em dois ou três fornecedores agora, leia o seu inetnum (country: e qualquer URL geofeed:) e apure quem controla esse ficheiro. Acorde no contrato que o vendedor entrega ou remove a referência ao feed no fecho.
Próximo passo
Não sabe onde está a falha? Envie-nos um pedido sobre a transferência IPv4 ou escreva para ipv4@dcxv.com com o prefixo e o sintoma. Não prometemos quando um fornecedor irá atualizar.
