● LIVE · Zeek + osquery · SEE · LEARN · LIVE

เห็นทุก process ในเครื่องคุณ
ว่ากำลังคุยกับ ที่ไหนในโลก

SRAN Netwatch agent ตอบคำถามเดียวที่สำคัญที่สุดด้านความปลอดภัย — “โปรแกรมในเครื่องของฉันกำลังติดต่อเครือข่ายที่ใดบ้าง?” ด้วยการ join ระหว่าง network capture (Zeek) กับ process attribution (osquery) แล้วแสดงผลแบบ live เป็นลูกโลก 3 มิติ

SRAN Netwatch 3D globe view
1.5spush ข้อมูลสดผ่าน WebSocket
3 มุมมองGlobe · Graph · Classic tabs
7 แหล่งconn · dns · ssl · http · listeners · process · anomaly
PID → 🌍map ทุก connection กลับไปยัง process เจ้าของ
มุมมองหลัก · หน้า /

🌐 3D Globe — ลากเส้นจากเครื่องคุณไปทั่วโลก

แต่ละ arc คือการเชื่อมต่อจริงจากเครื่องของคุณ (จุด YOU ตามเมืองของ public IP) ไปยังปลายทางในแต่ละประเทศ/เมือง พร้อมบอกว่าเป็น process ใด คุยกับโดเมนอะไร ผ่าน ISP ไหน

3D globe with connection arcs and country sidebar

SIDEBAR จัดกลุ่มตามประเทศ

แถบด้านขวาแสดงปลายทางทั้งหมดจัดกลุ่มตามประเทศ พร้อมธงและรายชื่อโดเมน คลิกประเทศใดก็ได้แล้วกล้องจะ “บินไป” ยังจุดนั้นบนลูกโลกทันที

  • Hover ที่ arc หรือจุด เพื่อดู process + domain + ISP ของปลายทาง
  • โหมด auto-spin หมุนลูกโลกอัตโนมัติ และ focus-on-you ดึงกลับมาที่ตำแหน่งคุณ
  • แสดง public IP ของคุณ เมือง จังหวัด ISP และ ASN ที่มุมล่าง

GEO ระบุพิกัดอัตโนมัติ

IP ปลายทางถูกค้นพิกัด lat/lon ผ่าน ipwho.is (HTTPS ไม่ต้องใช้ key) แล้ว cache ลงดิสก์ถาวร — ครั้งต่อไปไม่ต้องยิงซ้ำ

  • Private IP (10.x, 192.168.x, lo) ถูกข้ามไม่ส่งออกภายนอก
  • แถบล่างแสดงอัตรา LIVE / RAW และ throughput รวม (KB/s)
  • ทุกอย่างอัปเดตสดต่อเนื่องโดยไม่ต้องรีเฟรชหน้า
หน้า /graph

🕸️ 3D Force-Graph
Process ▸ Endpoint ▸ Domain

มองความสัมพันธ์ทั้งระบบเป็นกราฟแรงดึงดูด 3 มิติ — โหนดสีม่วงคือ process, สีฟ้าคือ endpoint (IP:port), สีเขียวคือ domain เส้นเชื่อมบอกว่าใครคุยกับใคร

  • คลิกโหนดเพื่อดูรายละเอียดในแผง SELECTED ด้านขวา
  • ช่อง filter กรองตามชื่อ process / IP / domain ได้ทันที
  • ลากหมุน · scroll ซูม · ปุ่ม recenter / pause / live view
  • มุมล่างบอกสถานะ WebSocket, interface และจำนวน socket ที่ track
3D force graph of process to endpoint to domain
หน้า /classic

มุมมองข้อมูลเชิงลึก 7 แบบ

เมื่อต้องการตารางข้อมูลดิบเพื่อสืบสวน — แต่ละแท็บดึงจากแหล่งของมันโดยตรง และ join เข้ากับ process เจ้าของผ่าน PID

By Process tab

👤 By Process osquery + zeek

หัวใจของระบบ — รวมทุกการเชื่อมต่อจัดกลุ่มตาม process (ชื่อ + PID + path + user) แล้วบอกว่าแต่ละตัวคุยกับโดเมน/IP ไหนบ้าง โดยมี SNI กำกับโดเมนปลายทางจริง

Connections tab

🔌 Connections zeek conn.log + PID

รายการ connection ทุกเส้นพร้อมคอลัมน์ Process — เห็น local/remote, โปรโตคอล, state, ไบต์เข้า-ออก และเจ้าของ connection ในตารางเดียว

DNS tab

🔎 DNS zeek dns.log

ทุก DNS query ที่ออกจากเครื่อง พร้อม answer และ rcode — เห็นว่าโปรแกรม พยายาม resolve โดเมนอะไรบ้าง แม้การเชื่อมต่อจริงจะยังไม่เกิด

SSL/TLS tab

🔐 SSL/TLS zeek ssl.log

ดึง SNI (โดเมนปลายทางจริงแม้ทราฟฟิกจะเข้ารหัส) พร้อม cipher และเวอร์ชัน TLS — รู้ว่าคุยกับใครโดยไม่ต้องถอดรหัสเนื้อหา

HTTP tab

🌐 HTTP zeek http.log

ทราฟฟิก HTTP แบบ plaintext — host, URI, method และ status code เห็น path ที่เรียกจริงสำหรับบริการที่ไม่ได้เข้ารหัส

Listeners tab

📡 Listeners osquery listening_ports

process ที่เปิดฟัง inbound port — ตรวจว่ามีบริการใดเปิดรับการเชื่อมต่อ เข้ามา พร้อมชื่อ process, PID, port และ path

Anomalies tab

⚠️ Anomalies anomaly_detector

เครื่องยนต์ตรวจจับพฤติกรรมผิดปกติ — เช่น rare_destination “first contact” กับปลายทางที่ไม่เคยคุยมาก่อน จัดระดับความรุนแรง (HIGH / MEDIUM / LOW) พร้อม process, host, service และปริมาณข้อมูล เพื่อชี้เป้าให้สืบสวนได้ทันที

กลไกภายใน

Join network กับ process ได้อย่างไร

Zeek รู้ว่ามี connection อะไร แต่ไม่รู้ว่าใครเปิด · osquery รู้ว่า process ไหนถือ socket ไหน — Netwatch เชื่อมสองโลกนี้เข้าด้วยกันด้วย 4-tuple

# zeek conn.log row osquery snapshot id.orig_p=45412 sockets[(_, 45412, 142.x, 443)] id.resp_h=142.251.151.119 ───▶ → pid=4521 name=chrome id.resp_p=443 → user=nontawatt # zeek ssl.log row (same uid) server_name="www.google.com" ──┐ ▼ result: chrome (PID 4521)www.google.com (142.251.151.119:443)
01 · CAPTURE

Zeek อ่านทุก packet

sniff interface แล้วเขียน conn / dns / ssl / http log — รู้ทุก flow ที่เกิดขึ้น และ SNI ปลายทางแม้ทราฟฟิกเข้ารหัส

02 · ATTRIBUTE

osquery poll ทุก 1 วินาที

อ่าน process_open_sockets พร้อมเก็บ history 90 วินาที ทำให้ connection สั้น ๆ ยังหาเจ้าของได้แม้ Zeek flush log ไปแล้ว

03 · JOIN

match ด้วย 4-tuple + uid

join key คือ (local_port, remote_addr, remote_port) ส่วน SNI/HTTP host เชื่อมข้าม log ผ่าน Zeek connection uid

เริ่มต้นใช้งาน

ติดตั้งและรันใน 3 บรรทัด

# รัน agent (ต้องเป็น root)
cd /opt/netwatch
sudo .venv/bin/python app.py

# เปิดเบราว์เซอร์
open http://localhost:8765

# ตัวเลือก
  --host   (default 0.0.0.0)
  --port   (default 8765)
  --iface  (default any)

หน้าเว็บ: / = 3D globe · /graph = force-graph · /classic = ตาราง 7 แท็บ · API: /api/snapshot, /api/graph, /api/globe, WS /ws

rootเพื่อให้ zeek -i any และ osquery อ่าน /proc ของทุก process ได้
Zeek 8.xnetwork capture engine ที่ /opt/zeek-8/bin/zeek
osquery 5.xprocess / socket attribution ผ่าน apt repo pkg.osquery.io
Python venvFastAPI + uvicorn + websockets (อยู่ใน .venv แล้ว)