Scans the listening sockets on a host, diffs against the last run, alerts when something opens that shouldn’t. Useful for the boxes you don’t have full HostAtlas on; useful for the audit story when you do.
Source on GitHub. Drop into cron or a systemd timer; no long-running daemon.
External scanners see the perimeter. Portwatch sees the host. Both views matter — and the inside view catches changes the outside view never will.
0.0.0.0:6379 mistake the outside scanner can't reach.ss -tlnp + a netns walk. No external network calls; nothing leaks while scanning.Single binary. Daily / hourly / on-demand — whatever your fleet rhythm is. No daemon, no port of its own.
Single binary, signed. Drops a sample YAML config to /etc/portwatch.yml on first run.
Run from cron or a systemd timer. Daily at 03:12 is a good default; hourly when you’re testing.
No — local-only. For external scanning use a dedicated network-scanner role. Portwatch sees the host from the inside, which is the angle attackers don't have.
Both v4 and v6. Each bind family is diffed separately so a v6-only regression doesn't hide under a v4 unchanged-state.
Walks Docker / Podman netns when run as root. Without root, only the host netns. Per-container binds attributed to the container ID + name.
MIT. Use commercially, modify, redistribute, fork.
MIT-licensed. Cron-friendly, single binary, no daemon.