
Утилита для аннотирования интернет-датасетов контекстными метаданными (например, AS происхождения, MaxMind GeoIP2, обратный DNS и WHOIS).
ZAnnotate — это утилита на Go, которая упрощает аннотирование больших наборов IP-адресов с метаданными сети. В настоящее время включает:
| CLI Flag | Description | Needs API Key | Needs Data Download |
|---|---|---|---|
--censys | Интернет-разведка Censys (живой API) | Да | |
--cymru | Данные об исходных/пиринговых ASN и деталях ASN от Cymru | ||
--geoasn | Данные MaxMind GeoIP ASN | Да | |
--geoip2 | Данные MaxMind GeoIP2 о городе и геолокации | Да | |
--greynoise | Данные GreyNoise Psychic об угрозах и CVE | Да (для загрузки) | Да |
--ipinfo | Данные IPInfo.io об ASN и геолокации | Да | |
--rdap | Запросы RDAP (преемник WHOIS) (живые) | ||
--rdns | Обратные DNS-запросы (живые) | ||
--routing | Данные BGP/маршрутизации из таблицы маршрутизации MRT | Да | |
--spur | Spur Intelligence (ASN, организация, классификация инфраструктуры, геолокация) | Да |
Перейти к настройке модулей: Censys · Cymru · GeoASN · GeoIP · GreyNoise · IPInfo.io · RDAP · RDNS/Reverse DNS · Routing/BGP · Spur
Вы можете использовать любую комбинацию аннотаторов, например, ниже показаны обратный DNS и аннотации IPInfo вместе:
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"]}
}
В --help приведены подробные сведения о каждом аннотаторе и доступных флагах.
zannotate --help
ZAnnotate можно установить с помощью make install
make install
или, если у вас не установлен make, вы можете использовать следующую команду:
cd cmd/zannotate && go install
В любом случае, это установит бинарный файл zannotate в ваш каталог $GOPATH/bin.
Проверьте, что он установлен правильно, с помощью:
zannotate --help
По умолчанию ZAnnotate ожидает IP-адреса, разделенные переводами строк, на стандартном вводе. Например:
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"]}}
Возможно, вы захотите аннотировать данные, которые уже находятся в формате JSON. В этом случае вам нужно использовать флаг --input-file-type=json.
Это добавит поле zannotate в существующий JSON-объект. Например:
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"]}}}
Если ваши JSON-объекты имеют другое поле для IP-адреса, отличное от стандартного ip, вы можете указать его с помощью флага --input-ip-field. Например, если ваши JSON-объекты содержат ip_address, вы можете использовать:
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"]}}}
Если ваши входные данные находятся в формате CSV, вы можете использовать флаг --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"]}}}
Как и в случае с JSON, вы можете использовать флаг --input-ip-field, чтобы указать столбец, отличный от ip, содержащий 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"}
По умолчанию ZAnnotate читает IP-адреса, разделенные переводами строк, со стандартного ввода и выводит JSON-объект на каждую строку в стандартный вывод, например:
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"]}}
Если IP-адрес не может быть аннотирован из-за ошибки или отсутствия данных, для этой аннотации будет пустое поле. Например, если IP-адрес является частным и поэтому не имеет данных RDNS или ASN, вывод будет выглядеть так:
echo "127.0.0.1" | zannotate --rdns --geoasn --geoasn-database=/path-to-geo-asn.mmdb
{"geoasn":{},"rdns":{},"ip":"127.0.0.1"}
Флаг --output-annotation-field можно использовать для указания другого имени поля для аннотаций вместо zannotate как для CSV, так и для JSON файловых входов.
Например, использование тега вывода --output-annotation-field="info" с 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] URL-адреса и инструкции могут меняться со временем. Они актуальны на май 2026 года.
Censys предоставляет данные об узлах и сети по всему интернету, включая информацию о том, какие службы работают на IP-адресе, какие TLS-сертификаты он имеет и многое другое. У них есть бесплатный тариф, который позволяет выполнять ограниченное количество запросов в месяц; его можно использовать для обогащения аннотаций IP-адресов данными Censys.
[!NOTE] Бесплатная учетная запись (по состоянию на апрель 2026 года) разрешает один одновременный запрос и 100 запросов в месяц. После использования всех кредитов API Censys будет возвращать ошибку при последующих запросах, пока ваши кредиты не сбросятся в начале следующего месяца или вы не купите дополнительные кредиты. ZAnnotate завершится с ошибкой, если это произойдет, чтобы предотвратить тихие сбои; поэтому, если у вас большой набор данных для аннотирования, следите за расходом кредитов и аннотируйте только те IP-адреса, на которые у вас хватает кредитов. Поскольку бесплатная учетная запись предлагает только один одновременный запрос, вам следует оставить
--censys-threads=1, если только вы не оплачиваете более высокий тариф.
echo "8.8.8.8" | zannotate --censys --censys-pat="CENSYS_PAT_HERE"
Результаты сокращены для краткости:
{
"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 предоставляет информацию об ASN и BGP-пиринге для IP-адресов. Вы можете использовать флаг --cymru для запроса этой информации у Cymru.
Cymru настроила DNS-сервис для предоставления этой информации, и по умолчанию ZAnnotate будет использовать системные DNS-резолверы для запроса.
Если вы обнаруживаете тайм-ауты при использовании локального DNS-резолвера, вы можете указать пользовательские резолверы с помощью флага --cymru-dns-servers.
--cymru-threads и --cymru-timeout также доступны для настройки производительности аннотаций Cymru; значения по умолчанию установлены так, чтобы обеспечить хорошую производительность и избежать тайм-аутов с большинством DNS-резолверов.
По умолчанию аннотатор Cymru извлекает исходные и пиринговые AS, а также детали AS для всех ASN. Если вам нужен поднабор, доступны следующие флаги:
--cymru-annotate-origin-as, --cymru-annotate-peer-as и --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 — это канал IP-разведки, который предоставляет метаданные, такие как классификация угроз и связанные CVE.
Их загрузки данных Psychic предоставляют канал данных в базе данных, подходящей для автономного обогащения данных.
Чтобы использовать их загрузку с zannotate, вам потребуется скачать файл в формате .mmdb, используя ваш API-ключ GreyNoise.
По состоянию на апрель 2026 года регистрация бесплатной учетной записи дает доступ к загрузке данных.
mmdb. Приведенная ниже команда загружает данные за одну дату (7 апреля 2026 года). Вы также можете загрузить данные за диапазон дней и для моделей с различным уровнем детализации — см. документацию GreyNoise Psychic для получения дополнительных сведений.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] Приведенные ниже примеры используют точную загрузку данных из приведенной выше команды
curl. Видимые результаты будут зависеть от загруженных данных.
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"}
Обратите внимание, что многих IP-адресов не будет в наборе данных GreyNoise, поэтому вы можете увидеть вывод, подобный следующему:
echo "1.1.1.1" | zannotate --greynoise --greynoise-database=/tmp/m3.mmdb
{"ip":"1.1.1.1","greynoise":{}}
IPInfo.io предоставляет бесплатный набор данных, который включает данные об ASN и геолокации, ограниченные уровнем страны. Платные тарифы предоставляют более детальные данные о геолокации.
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 предоставляет наборы данных о геолокации IP и ASN в бесплатной (GeoLite) и платной (GeoIP) версиях. Кроме того, оба набора данных GeoLite и GeoIP доступны в двух режимах доступа: загружаемый файл базы данных, который можно запрашивать локально, и веб-API. Модуль GeoIP в ZAnnotate поддерживает локальную базу данных как в версии GeoLite, так и в GeoIP.
Далее предполагается, что вы хотите использовать бесплатные наборы данных GeoLite, но процесс аналогичен для платных данных GeoIP.

.mmdb в нужное место и проверьте, используя нижеприведенные команды.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) — это протокол, используемый для доступа к регистрационным данным интернет-ресурсов, таких как IP-адреса и доменные имена, и является преемником WHOIS. ZAnnotate может запрашивать RDAP-серверы для получения регистрационных данных об IP-адресах.
echo "1.1.1.1" | zannotate --rdap
Результаты сокращены для краткости:
{
"ip":"1.1.1.1",
"whois": {
"DecodeData": {},
"Lang": "",
"Conformance": [
"history_version_0",
"nro_rdap_profile_0",
"cidr0",
"rdap_level_0"
],
"ObjectClassName": "ip network"
}
}
Это должно дать вам тот же результат, что и прямой запрос к RDAP-серверу, например:
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 может выполнять обратные DNS-запросы для каждого IP-адреса. Загрузка данных не требуется: --rdns запрашивает живые DNS-серверы напрямую.
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"]}}
Если у IP-адреса нет PTR-записи, поле rdns будет пустым:
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 предоставляет интеллектуальные данные по каждому IP-адресу, такие как ASN и организация, классификация инфраструктуры (например, дата-центр, CDN, мобильный оператор) и геолокационные метаданные. Мы можем запрашивать spur.us вместе с другими источниками, чтобы обогащать аннотации и помогать идентифицировать дата-центры/Anycast-развертывания, CDN и владельцев интернет-провайдеров.
export SPUR_API_KEY=your_api_key_here
(Если вы хотите сделать это постоянным, добавьте указанную выше строку в профиль вашей оболочки, например, ~/.bashrc или ~/.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"}}