Corrigir a geolocalização IPv4 após uma transferência

Corrigir a geolocalização IPv4 após uma transferência

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
Google 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

  1. Reúna provas. O registo que o mostra como titular, a lista de CIDR e a prova de onde funcionam os servidores.
  2. Corrija o seu lado. Retifique a linha geofeed:, publique o ficheiro, execute o script.
  3. 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.
  4. Mantenha um registo. Identificador do ticket, data, fornecedor, prefixo, resposta.
  5. 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

Fluxograma: cinco verificações por ordem para um país errado num bloco IPv4, com a ação de cada uma

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.

Escrow IPv4: calendário de pagamentos e checklist final
ipv4brokertransfer

Escrow IPv4: calendário de pagamentos e checklist final

Escrow de IPv4: marcos de pagamento, quem confirma o quê, condições para libertar os fundos e casos de falha para compradores e vendedores, com exemplo.

Corrigir a geolocalização IPv4 após uma transferência
ipv4networkingtransfer

Corrigir a geolocalização IPv4 após uma transferência

O seu bloco IPv4 transferido ainda mostra o país anterior? Verifique WHOIS, BGP e GeoIP, publique um geofeed e peça correções a cada fornecedor, passo a passo.

Transferência IPv4 no RIPE: PA, PI, LIR patrocinador
ipv4ripe-ncctransferbrokernetworking

Transferência IPv4 no RIPE: PA, PI, LIR patrocinador

Guia prático das transferências IPv4 no RIPE: recursos PA e PI, LIR patrocinador, documentos, escrow e passos. Política revista em 2026-10 com o RIPE-807.

Como comprar endereços IPv4: custos, regras e riscos
ipv4brokerpricingtransferripe-ncc

Como comprar endereços IPv4: custos, regras e riscos

Compre IPv4 com segurança: compra, aluguel ou BYOIP, custo total, verificação do bloco, caução e requisitos de RIPE NCC, ARIN e APNIC para o destinatário.

Broker IPv4, marketplace ou venda direta: a mais segura?
ipv4brokertransfer

Broker IPv4, marketplace ou venda direta: a mais segura?

Compare broker IPv4, marketplace e venda direta por rapidez, privacidade, verificação do comprador, escrow, taxas e apoio à transferência, com sinais de alerta.