
أداة لتوضيح مجموعات بيانات الإنترنت ببيانات وصفية سياقية (مثل: origin AS، MaxMind GeoIP2، reverse DNS، وWHOIS)
ZAnnotate هي أداة مكتوبة بلغة Go تُسهّل تعليق مجموعات كبيرة من عناوين IP ببيانات وصفية للشبكة. حاليًا، يتضمن ذلك:
| CLI Flag | الوصف | يحتاج إلى مفتاح API | يحتاج إلى تحميل بيانات |
|---|---|---|---|
--censys | معلومات Censys للاستخبارات على الإنترنت (API مباشر) | نعم | |
--cymru | تفاصيل ASN المنشأ/النظير وعناوين ASN من Cymru | ||
--geoasn | بيانات ASN من MaxMind GeoIP | نعم | |
--geoip2 | بيانات المدينة والموقع الجغرافي من MaxMind GeoIP2 | نعم | |
--greynoise | بيانات استخبارات التهديدات النفسية (Psychic) وبيانات CVE من GreyNoise | نعم (للتحميل) | نعم |
--ipinfo | بيانات ASN والموقع الجغرافي من IPInfo.io | نعم | |
--rdap | استعلامات RDAP (خليفة WHOIS) (مباشر) | ||
--rdns | استعلامات DNS عكسي (مباشر) | ||
--routing | بيانات BGP/التوجيه من جدول توجيه MRT | نعم | |
--spur | معلومات Spur الذكية (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 بجلب ASNs المنشأ والنظير بالإضافة إلى تفاصيل ASN لجميع ASNs. إذا كنت ترغب في مجموعة فرعية، تتوفر العلامات التالية:
--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 يوفر بيانات وصفية مثل تصنيف التهديدات و CVEs المرتبطة.
توفر تنزيلات بيانات Psychic الخاصة بهم مصدر بياناتهم في قاعدة بيانات مناسبة للإثراء دون اتصال.
لاستخدام تنزيلهم مع zannotate، ستحتاج إلى تنزيل ملف بصيغة .mmdb باستخدام مفتاح API الخاص بـ GreyNoise.
اعتبارًا من أبريل 2026، يتيح التسجيل بحساب مجاني الوصول إلى تنزيلات البيانات.
mmdb. الأمر أدناه يقوم بتنزيل بيانات لتاريخ واحد (7 أبريل 2026). يمكنك أيضًا تنزيل بيانات لنطاق من الأيام ولنماذج بمستويات مختلفة من التفاصيل — راجع توثيق GreyNoise's 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 مجموعات بيانات للموقع الجغرافي وبيانات ASN لعناوين IP في كل من الإصدار المجاني (GeoLite) والمدفوع (GeoIP). بالإضافة إلى ذلك، تأتي كل من مجموعات بيانات GeoLite و GeoIP بنمطي وصول - ملف قاعدة بيانات قابل للتنزيل يمكن الاستعلام عنه محليًا وواجهة برمجة تطبيقات ويب. تدعم وحدة 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 (بروتوكول الوصول إلى بيانات التسجيل) هو بروتوكول يُستخدم للوصول إلى بيانات التسجيل لموارد الإنترنت مثل عناوين 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
...<تم تقليص الإخراج الإضافي للاختصار>
يمكن لـ 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، وملكية ISPs.
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"}}