
インターネットデータセットにコンテキストメタデータ(例: 発信元AS、MaxMind GeoIP2、リバースDNS、WHOIS)を注釈付けするためのユーティリティ。
ZAnnotateは、大規模なIPデータセットにネットワークメタデータを付与するためのGoユーティリティです。現在は以下に対応しています。
| CLIフラグ | 説明 | APIキーが必要 | データダウンロードが必要 |
|---|---|---|---|
--censys | Censys インターネットインテリジェンス(ライブAPI) | はい | |
--cymru | Cymru IP発信元/ピアASNおよびASN詳細 | ||
--geoasn | MaxMind GeoIP ASNデータ | はい | |
--geoip2 | MaxMind GeoIP2都市および地理位置情報データ | はい | |
--greynoise | GreyNoise Psychic脅威インテリジェンスおよびCVEデータ | はい(ダウンロード用) | はい |
--ipinfo | IPInfo.io ASNおよび地理位置情報データ | はい | |
--rdap | RDAP(WHOISの後継)ルックアップ(ライブ) | ||
--rdns | 逆引きDNSルックアップ(ライブ) | ||
--routing | MRTルーティングテーブルからのBGP/ルーティングデータ | はい | |
--spur | Spur Intelligence(ASN、組織、インフラ分類、地理位置情報) | はい |
モジュール設定へ移動: Censys · Cymru · GeoASN · GeoIP · GreyNoise · IPInfo.io · RDAP · RDNS/逆引きDNS · ルーティング/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 フラグを使用する必要があります。これにより、既存のJSONオブジェクトに zannotate フィールドが挿入されます。例:
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アドレスを読み取り、標準出力に1行ごとに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 フラグを使用すると、CSVおよびJSONファイル入力の両方で、アノテーションのフィールド名を zannotate の代わりに別の名前に指定できます。
例えば、JSON入力で出力タグ --output-annotation-field="info" を使用する場合:
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年5月時点のものです。
Censysは、IP上で実行されているサービス、保持しているTLS証明書などの情報を含む、インターネット全体のホストおよびネットワークデータを提供します。無料ティアでは月あたりのクエリ数が制限されていますが、CensysデータでIPアノテーションを強化するために使用できます。
[!NOTE] 無料アカウント(2026年4月時点)では、同時リクエストは1件、月間リクエストは100件までです。クレジットを使い切ると、翌月の初めにリセットされるか追加クレジットを購入するまで、以降のリクエストでCensys APIはエラーを返します。この場合、ZAnnotateはサイレントエラーを防ぐためにエラーで終了します。そのため、大規模なデータセットにアノテーションを付ける場合は、クレジット使用量に注意し、クレジットがあるIPのみにアノテーションを付けることを優先してください。無料アカウントは同時リクエストが1件のみなので、上位ティアを支払わない限り、
--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は、IPアドレスのASNおよびBGPピアリング情報を提供します。--cymru フラグを使用すると、この情報をCymruに問い合わせることができます。Cymruはこの情報を提供するためのDNSサービスを設定しており、デフォルトではZAnnotateはシステムのデフォルトDNSリゾルバーを使用してクエリを実行します。ローカルDNSリゾルバーでタイムアウトが発生する場合は、--cymru-dns-servers フラグでカスタムリゾルバーを指定できます。--cymru-threads と --cymru-timeout もCymruアノテーションのパフォーマンスを設定するために利用でき、デフォルトではほとんどのDNSリゾルバーでタイムアウトを回避しながら良好なパフォーマンスが得られるように設定されています。デフォルトでは、Cymruアノテータは発信元ASとピアAS、およびすべてのASNのAS詳細を取得します。サブセットのみが必要な場合は、次のフラグが利用可能です: --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 は、脅威分類や関連するCVEなどのメタデータを提供するIPインテリジェンスフィードです。Psychicデータダウンロードでは、オフラインでのデータエンリッチメントに適したデータベース形式でデータフィードが提供されます。zannotate でダウンロードを使用するには、GreyNoise APIキーを使用して .mmdb 形式のファイルをダウンロードします。2026年4月時点では、無料アカウントに登録するとデータダウンロードにアクセスできます。
mmdb ファイルをダウンロードします。以下のコマンドは、特定の日付(2026年4月7日)のデータをダウンロードします。複数日のデータや、さまざまな詳細レベルのモデルのデータをダウンロードすることもできます。詳細については 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データセットは、ローカルでクエリできるダウンロード可能なデータベースファイルと、Web APIの2つのアクセス方法があります。ZAnnotateのGeoIPモジュールは、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は各IPアドレスに対して逆引きDNSルックアップを実行できます。データのダウンロードは不要で、--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 は、ASNや組織、インフラ分類(例: データセンター、CDN、モバイル)、地理位置情報メタデータなど、IPごとのインテリジェンスを提供します。spur.us を他のソースと併用してクエリし、アノテーションを強化し、データセンター/Anycast配置、CDN、ISPの所有権を特定するのに役立てることができます。
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"}}