
Utilidad para anotar conjuntos de datos de Internet con metadatos contextuales (p. ej., AS de origen, MaxMind GeoIP2, DNS inverso y WHOIS)
ZAnnotate es una utilidad en Go que facilita anotar grandes conjuntos de datos de IP con metadatos de red. Actualmente esto incluye:
| CLI Flag | Descripción | Requiere API Key | Requiere descarga de datos |
|---|---|---|---|
--censys | Inteligencia de internet de Censys (API en vivo) | Sí | |
--cymru | ASN de origen/par y detalles de ASN de Cymru | ||
--geoasn | Datos de ASN de MaxMind GeoIP | Sí | |
--geoip2 | Datos de ciudad y geolocalización de MaxMind GeoIP2 | Sí | |
--greynoise | Inteligencia de amenazas y datos de CVE de GreyNoise Psychic | Sí (para descargar) | Sí |
--ipinfo | Datos de ASN y geolocalización de IPInfo.io | Sí | |
--rdap | Consultas RDAP (sucesor de WHOIS) (en vivo) | ||
--rdns | Consultas de DNS inverso (en vivo) | ||
--routing | Datos de BGP/enrutamiento de una tabla de enrutamiento MRT | Sí | |
--spur | Spur Intelligence (ASN, organización, clasificación de infraestructura, geolocalización) | Sí |
Ir a la configuración de los módulos: Censys · Cymru · GeoASN · GeoIP · GreyNoise · IPInfo.io · RDAP · RDNS/DNS inverso · Enrutamiento/BGP · Spur
Puedes usar cualquier combinación de anotadores; por ejemplo, aquí tienes anotaciones de DNS inverso e IPInfo juntas:
echo "1.1.1.1" | zannotate --rdns --ipinfo --ipinfo-database=./data-snapshots/ipinfo_lite.mmdb
{
"ip":"1.1.1.1",
"ipinfo":{"country":"Australia","country_code":"AU","continent":"Oceania","continent_code":"OC","asn":"AS13335","as_name":"Cloudflare, Inc.","as_domain":"cloudflare.com"},
"rdns":{"domain_names":["one.one.one.one"]}
}
El --help tiene más detalles sobre cada anotador y sus flags disponibles.
zannotate --help
ZAnnotate puede instalarse usando make install
make install
o, si no tienes make instalado, puedes usar el siguiente comando:
cd cmd/zannotate && go install
En cualquier caso, esto instalará el binario zannotate en tu directorio $GOPATH/bin.
Comprueba que se instaló correctamente con:
zannotate --help
Por defecto, ZAnnotate espera direcciones IP delimitadas por nueva línea en la entrada estándar. Por ejemplo:
printf "1.1.1.1\n8.8.8.8" | zannotate --rdns
{"ip":"1.1.1.1","rdns":{"domain_names":["one.one.one.one"]}}
{"ip":"8.8.8.8","rdns":{"domain_names":["dns.google"]}}
Puede que quieras anotar datos que ya están en formato JSON. En ese caso, tendrás que usar el flag --input-file-type=json.
Esto insertará un campo zannotate en el objeto JSON existente. Por ejemplo:
echo '{"ip": "1.1.1.1"}' | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb --input-file-type=json
{"ip":"1.1.1.1","zannotate":{"geoasn":{"asn":13335,"org":"CLOUDFLARENET"},"rdns":{"domain_names":["one.one.one.one"]}}}
Si tus objetos JSON tienen un campo distinto al ip por defecto para la dirección IP, puedes especificarlo con el flag --input-ip-field. Por ejemplo, si tus objetos JSON tienen un campo ip_address, puedes usar:
echo '{"ip_address": "1.1.1.1"}' | zannotate --rdns --input-file-type=json --input-ip-field=ip_address
{"ip_address":"1.1.1.1","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}}}
Si tus datos de entrada están en formato CSV, puedes usar el flag --input-file-type=csv.
printf "name,ip,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv
{"name":" cloudflare","ip":"1.1.1.1","date":"04-04-26","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}}}
{"name":" google","ip":"8.8.8.8","date":"04-04-26","zannotate":{"rdns":{"domain_names":["dns.google"]}}}
Al igual que con JSON, puedes usar el flag --input-ip-field para especificar una columna distinta de ip que contenga la dirección IP.
printf "name,ip_address,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv --input-ip-field=ip_address
{"date":"04-04-26","zannotate":{"rdns":{"domain_names":["dns.google"]}},"name":" google","ip_address":"8.8.8.8"}
{"date":"04-04-26","zannotate":{"rdns":{"domain_names":["one.one.one.one"]}},"name":" cloudflare","ip_address":"1.1.1.1"}
Por defecto, ZAnnotate lee direcciones IP delimitadas por nueva línea desde la entrada estándar y genera un objeto JSON por línea en la salida estándar, como:
echo "1.1.1.1" | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb
{"ip":"1.1.1.1","geoasn":{"asn":13335,"org":"CLOUDFLARENET"},"rdns":{"domain_names":["one.one.one.one"]}}
Si una dirección IP no puede ser anotada, ya sea por un error o por falta de datos, habrá un campo vacío para esa anotación. Por ejemplo, si una dirección IP es privada y, por lo tanto, no tiene datos de RDNS ni de ASN, la salida tendrá este aspecto:
echo "127.0.0.1" | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb
{"geoasn":{},"rdns":{},"ip":"127.0.0.1"}
El flag --output-annotation-field se puede usar para especificar un nombre de campo distinto para las anotaciones, en lugar de zannotate, tanto para entradas de archivos CSV como JSON.
Por ejemplo, usando la etiqueta de salida --output-annotation-field="info" con entrada JSON:
printf "name,ip_address,date\n cloudflare,1.1.1.1,04-04-26\n google,8.8.8.8,04-04-26" | zannotate --rdns --input-file-type=csv --input-ip-field=ip_address --output-annotation-field="info"
{"name":" cloudflare","ip_address":"1.1.1.1","date":"04-04-26","info":{"rdns":{"domain_names":["one.one.one.one"]}}}
{"ip_address":"8.8.8.8","date":"04-04-26","info":{"rdns":{"domain_names":["dns.google"]}},"name":" google"}
[!NOTE] Las URLs y las instrucciones pueden cambiar con el tiempo. Estas están actualizadas a fecha de mayo de 2026.
Censys proporciona datos de hosts y redes a nivel de internet, incluida información sobre qué servicios se están ejecutando en una IP, qué certificados TLS tiene y más. Ofrecen un plan gratuito que permite un número limitado de consultas al mes, que puede usarse para enriquecer las anotaciones de IP con datos de Censys.
[!NOTE] La cuenta gratuita (a fecha de abril de 2026) permite una única solicitud concurrente y 100 solicitudes al mes. Una vez que hayas usado todos tus créditos, la API de Censys devolverá un error en solicitudes posteriores hasta que tus créditos se restablezcan a principios del mes siguiente o compres créditos adicionales. ZAnnotate terminará con un error si esto ocurre, para evitar fallos silenciosos; por lo tanto, si tienes un conjunto de datos grande que anotar, ten en cuenta el uso de tus créditos y prioriza anotar solo las IP para las que tengas créditos. Como la cuenta gratuita solo permite una solicitud concurrente, querrás dejar
--censys-threads=1a menos que pagues por un plan superior.
echo "8.8.8.8" | zannotate --censys --censys-pat="CENSYS_PAT_HERE"
Resultados truncados por brevedad:
{
"ip":"8.8.8.8",
"censys": {
"whois":{
"network":{ "name":"Google LLC","cidrs":["8.8.8.0/24"],"created":"2023-12-28T00:00:00Z","updated":"2023-12-28T00:00:00Z","allocation_type":"ALLOCATION","handle":"GOGL"},
"organization":{"state":"CA","postal_code":"94043","country":"US","tech_contacts":[{"handle":"ZG39-ARIN","name":"Google LLC","email":"[email protected]"}],
"handle":"GOGL","street":"1600 Amphitheatre Parkway","abuse_contacts":[{"handle":"ABUSE5250-ARIN","name":"Abuse","email":"[email protected]"}],
"admin_contacts":[{"handle":"ZG39-ARIN","name":"Google LLC","email":"[email protected]"}],
"name":"Google LLC",
"city":"Mountain View"}},
"services":[{
"port":53,"protocol":"DNS","transport_protocol":"udp","ip":"8.8.8.8","scan_time":"2026-04-10T02:55:53Z"}]}}
Cymru proporciona información de ASN y de peering BGP para direcciones IP. Puedes usar el flag --cymru para consultar esta información a Cymru.
Cymru ha configurado un servicio DNS para proporcionar esta información y, por defecto, ZAnnotate usará los resolutores DNS predeterminados de tu sistema para consultar.
Si ves que se producen tiempos de espera con tu resolutor DNS local, puedes especificar resolutores personalizados con el flag --cymru-dns-servers.
--cymru-threads y --cymru-timeout también están disponibles para configurar el rendimiento de las anotaciones de Cymru; los valores predeterminados están establecidos para obtener un buen rendimiento evitando tiempos de espera con la mayoría de resolutores DNS.
Por defecto, el anotador de Cymru obtiene los AS de origen y pares, así como los detalles de AS de todos los ASN. Si deseas un subconjunto, están disponibles los siguientes flags:
--cymru-annotate-origin-as, --cymru-annotate-peer-as y --cymru-annotate-as-details
printf "1.1.1.1" | ./zannotate --cymru --cymru-dns-servers=1.1.1.1,1.0.0.1
{"ip":"207.243.195.103","cymru":{"origin_asns":[7018],"peer_asns":[6939,1299,2914,3257,6461,6762],"asn_details":{"7018":{"asn":7018,"country_code":"US","registry":"arin","asn_allocation_date":"1996-07-30","asn_description":"ATT-INTERNET4 - AT&T Enterprises, LLC, US"},"6939":{"asn":6939,"country_code":"US","registry":"arin","asn_allocation_date":"1996-06-28","asn_description":"HURRICANE - Hurricane Electric LLC, US"},"1299":{"asn":1299,"country_code":"SE","registry":"ripencc","asn_allocation_date":"1993-09-01","asn_description":"TWELVE99 Arelion, fka Telia Carrier, SE"},"2914":{"asn":2914,"country_code":"US","registry":"arin","asn_allocation_date":"1998-12-07","asn_description":"NTT-DATA-2914 - NTT America, Inc., US"},"3257":{"asn":3257,"country_code":"US","registry":"ripencc","asn_allocation_date":"1994-09-30","asn_description""GTT-BACKBONE GTT, US"},"6461":{"asn":6461,"country_code":"US","registry":"arin","asn_allocation_date":"1996-04-22","asn_description":"ZAYO-6461 - Zayo Bandwidth, US"},"6762":{"asn":6762,"country_code":"IT","registry":"ripencc","asn_allocation_date":"1996-09-12","asn_description":"SEABONE-NET TELECOM ITALIA SPARKLE S.p.A., IT"}},"prefix_details":{"207.242.0.0/15":{"prefix":"207.242.0.0/15","origin_asns":[7018],"peer_asns":[1299,2914,3257,6461,6762,6939],"country_code":"US","registry":"arin","allocation_date":"1996-11-01" }}}}
GreyNoise es una fuente de inteligencia de IP que proporciona metadatos como la clasificación de amenazas y los CVE asociados.
Sus descargas de datos Psychic proporcionan su feed de datos en una base de datos adecuada para el enriquecimiento de datos sin conexión.
Para usar su descarga con zannotate, tendrás que descargar un archivo con formato .mmdb usando tu clave de API de GreyNoise.
A fecha de abril de 2026, registrarse con una cuenta gratuita da acceso a las descargas de datos.
mmdb. El siguiente comando descarga datos de una fecha concreta (7 de abril de 2026). También puedes descargar datos de un rango de días y para modelos con distintos niveles de detalle; consulta la documentación de Psychic de GreyNoise para más detalles.curl -H "key: GREYNOISE_API_KEY_HERE" \
https://psychic.labs.greynoise.io/v1/psychic/download/2026-04-07/3/mmdb \
-o /tmp/m3.mmdb
[!NOTE] Los siguientes ejemplos usan exactamente la descarga de datos del comando
curlanterior. Los resultados que veas dependerán de los datos descargados.
echo "14.1.105.157" | zannotate --greynoise --greynoise-database=/tmp/m3.mmdb
{"greynoise":{"classification":"malicious","cves":["CVE-2015-2051","CVE-2016-20016","CVE-2018-10561","CVE-2018-10562","CVE-2016-6277","CVE-2024-12847"],"date":"2026-04-07","handshake_complete":true,"last_seen":"2026-04-07T00:00:00Z","seen":true,"tags":["Mirai TCP Scanner","Mirai","Telnet Protocol","Generic IoT Default Password Attempt","Web Crawler","Generic Suspicious Linux Command in Request","HNAP Crawler","Telnet Login Attempt","D-Link Devices HNAP SOAPAction Header RCE Attempt","MVPower CCTV DVR RCE CVE-2016-20016 Attempt","JAWS Webserver RCE","GPON CVE-2018-10561 Router Worm","Generic ${IFS} Use in RCE Attempt","CCTV-DVR RCE","NETGEAR Command Injection CVE-2016-6277","NETGEAR DGN setup.cgi CVE-2024-12847 Command Execution Attempt","CGI Script Scanner"],"actor":"unknown"},"ip":"14.1.105.157"}
Ten en cuenta que muchas IP no estarán en el conjunto de datos de GreyNoise, por lo que puedes ver una salida como la siguiente:
echo "1.1.1.1" | zannotate --greynoise --greynoise-database=/tmp/m3.mmdb
{"ip":"1.1.1.1","greynoise":{}}
IPInfo.io ofrece un conjunto de datos gratuito que incluye datos de ASN y geolocalización, limitados al nivel de país. Los planes de pago ofrecen datos de geolocalización más granulares.
mmdb

echo "1.1.1.1" | zannotate --ipinfo --ipinfo-database=./path-to-ipinfo-db.mmdb
{"ip":"1.1.1.1","ipinfo":{"country":"Australia","country_code":"AU","continent":"Oceania","continent_code":"OC","asn":"AS13335","as_name":"Cloudflare, Inc.","as_domain":"cloudflare.com"}}
MaxMind proporciona conjuntos de datos de geolocalización de IP y de ASN tanto en versión gratuita (GeoLite) como de pago (GeoIP). Además, tanto los conjuntos de datos GeoLite como GeoIP tienen dos modos de acceso: un archivo de base de datos descargable que puede consultarse localmente y una API web. El módulo GeoIP de ZAnnotate es compatible con la base de datos local tanto en versiones GeoLite como GeoIP.
Lo siguiente asume que quieres usar los conjuntos de datos gratuitos de GeoLite, pero el proceso es similar para los datos de pago de GeoIP.

.mmdb en algún lugar y prueba con lo siguiente.echo "171.67.71.209" | zannotate --geoip2 --geoip2-database=./path-to-geolite2.mmdb
{
"ip":"171.67.71.209",
"geoip2":{
"city":{"name":"Vallejo","id":5405380},
"country":{"name":"United States","code":"US","id":6252001},
"continent":{"name":"North America","code":"NA","id":6255149},
"postal":{"code":"94590"},
"latlong":{"accuracy_radius":50,"latitude":38.1043,"longitude":-122.2442,"metro_code":807,"time_zone":"America/Los_Angeles"},
"represented_country":{},
"registered_country":{"name":"United States","code":"US","id":6252001},
"metadata":{}}
}
echo "171.67.71.209" | zannotate --geoasn --geoasn-database=/path-to-asn-file.mmdb
{"ip":"171.67.71.209","geoasn":{"asn":32,"org":"STANFORD"}}
RDAP (Registration Data Access Protocol) es un protocolo utilizado para acceder a los datos de registro de recursos de internet, como direcciones IP y nombres de dominio, y es el sucesor de WHOIS. ZAnnotate puede consultar servidores RDAP para obtener datos de registro de IPs.
echo "1.1.1.1" | zannotate --rdap
Resultados truncados por brevedad:
{
"ip":"1.1.1.1",
"whois": {
"DecodeData": {},
"Lang": "",
"Conformance": [
"history_version_0",
"nro_rdap_profile_0",
"cidr0",
"rdap_level_0"
],
"ObjectClassName": "ip network"
}
}
Esto debería darte la misma salida que una consulta directa a un servidor RDAP, por ejemplo:
rdap 1.1.1.1
IP Network:
Handle: 1.1.1.0 - 1.1.1.255
Start Address: 1.1.1.0
End Address: 1.1.1.255
IP Version: v4
Name: APNIC-LABS
Type: ASSIGNED PORTABLE
...<further output truncated for brevity>
ZAnnotate puede realizar consultas de DNS inverso para cada dirección IP. No se requiere descarga de datos; --rdns consulta directamente servidores DNS en vivo.
printf "1.1.1.1\n8.8.8.8" | zannotate --rdns
{"ip":"1.1.1.1","rdns":{"domain_names":["one.one.one.one"]}}
{"ip":"8.8.8.8","rdns":{"domain_names":["dns.google"]}}
Si una IP no tiene un registro PTR, el campo rdns estará vacío:
echo "127.0.0.1" | zannotate --rdns
{"ip":"127.0.0.1","rdns":{}}
2025.09)RIBS/rib.20250923.1200.bz2)bzip2 -d ./path-to-downloaded-file/rib.20250923.1200.bz2
echo "1.1.1.1" | zannotate --routing --routing-mrt-file=/tmp/rib.20250923.1200
{"ip":"1.1.1.1","routing":{"prefix":"1.1.1.0/24","asn":13335,"path":[3561,209,3356,13335]}}
spur.us proporciona inteligencia por IP, como ASN y organización, clasificación de infraestructura (p. ej., centro de datos, CDN, móvil) y metadatos de geolocalización. Podemos consultar spur.us junto con otras fuentes para enriquecer las anotaciones y ayudar a identificar despliegues de centros de datos/Anycast, CDN y la titularidad de los ISP.
export SPUR_API_KEY=your_api_key_here
(Si quieres que sea permanente, añade la línea anterior a tu perfil de shell, p. ej. ~/.bashrc o ~/.zshrc)
echo "1.1.1.1" | zannotate --spur
{"ip":"1.1.1.1","spur":{"as":{"number":13335,"organization":"Cloudflare, Inc."},"infrastructure":"DATACENTER","ip":"1.1.1.1","location":{"city":"Anycast","country":"ZZ","state":"Anycast"},"organization":"Taguchi Digital Marketing System"}}