Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan Now×
Skip to content
World desk8 min

Building a Real Time Attack Visualizer: SSH Honeypot and Cloudflare Workers

A practical build of a real-time SSH honeypot attack visualizer: an isolated VM sensor, batched signed summaries, a Cloudflare Worker with D1 storage, and the containment and privacy choices that keep it small.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The working pattern is a small, isolated sensor on a virtual machine that listens on SSH and HTTP, reduces raw activity to bounded summaries, and forwards them on a timer to a Cloudflare Worker. The Worker stores the summaries in D1 and serves them to a public map. The exposed listener never touches Cloudflare, and the visualization side never accepts a raw SSH connection.

This guide walks through that split, the containment choices that keep the sensor small, the write-budget arithmetic that shapes the pipeline, and the trade-offs between simple polling and live WebSocket updates. The reference design described here is a single author’s deployment, documented in F4LCON’s write-up published on DEV Community on September 29, 2026. Its figures and limits are that author’s own; they are not independent measurements.

As an Amazon Associate I earn from qualifying purchases.

How the pipeline is divided

Keeping two halves conceptually separate is the most important design decision in this project.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • The sensor (exposed): a Rust program running on a VM. It listens on ports 22 and 80, records connection and login events, keeps hourly buckets on local disk, and runs in its own isolated machine so that nothing else on the host is reachable from the internet.
  • The ingestion and display side (not exposed to SSH): a Rust program compiled to WebAssembly and deployed as a Cloudflare Worker. It accepts signed requests from the sensor, writes summaries to a D1 database, and serves two read endpoints, /stats and /recent, that the map page consumes.

The sensor initiates every connection outward. Nothing in the Cloudflare half needs to reach back into the VM, which keeps the firewall rules on the sensor simple: inbound 22 and 80 only, with the VM’s administrative access handled through a separate, restricted path.

#1 Best Overall
Yubico - YubiKey 5 NFC - Multi-Factor authentication (MFA) Security Key and passkey, Connect via USB-A or NFC, FIDO Certified - Protect Your Online Accounts
  • POWERFUL SECURITY KEY: The YubiKey 5 NFC is the most versatile physical passkey, protecting your digital life from phishing attacks. It ensures only you can access your accounts
  • WORKS WITH 1000+ ACCOUNTS: Compatible with popular accounts like Google, Microsoft, and Apple. A single YubiKey 5 NFC secures 100+ of your favorite accounts, including email, password managers, and more
  • FAST & CONVENIENT LOGIN: Plug in your YubiKey 5 NFC via USB and tap it, or tap it against your phone (NFC), to authenticate. No batteries, no internet connection, and no extra fees required
  • MOST SECURE PASSKEY: Supports FIDO2/WebAuthn, FIDO U2F, Yubico OTP, OATH-TOTP/HOTP, Smart card (PIV), and OpenPGP. That means it’s versatile, working almost anywhere you need it
  • PRIMARY & SPARE KEYS: Just like having a spare house key, we recommend buying two YubiKeys - one for daily use and one as a spare. That way you’ll never get locked out of your accounts

Step-by-step build

  1. Provision an isolated VM. Use a dedicated instance with nothing else on it. Do not run the sensor alongside other services, databases, or your own development tools.
  2. Create an unprivileged service account. The reference design runs the sensor as a user named hive. Create it with no login shell and no home-directory write access beyond the sensor’s own data path.
  3. Build the sensor and install it under systemd. The unit file should carry the hardening properties described in the reference design. A minimal sketch that uses the real systemd directive names is below; check the systemd documentation for your distribution’s version before relying on it.
  4. Give the sensor only the port-binding capability. Listening on port 22 and 80 requires CAP_NET_BIND_SERVICE. Nothing else should be granted.
  5. Deploy the Worker and create the D1 database. Bind the database to the Worker, apply your schema, and store the shared signing secret as a Worker secret rather than in source code.
  6. Point the sensor at the Worker. Configure the sensor’s forwarding interval (the reference design sends one signed request per minute) and verify that a summary row appears in D1 before you open the sensor to the internet.
  7. Publish the map. Serve the map page from its own static host or Worker route, and have it poll /stats and /recent.
[Service]
User=hive
Group=hive
NoNewPrivileges=yes
ProtectSystem=strict
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
SystemCallFilter=@system-service

The directives above mirror the containment the reference author describes: an unprivileged user, a read-only filesystem, no privilege escalation, a syscall filter, and a single bounding capability. The author reports these as implementation facts rather than the output of an independent audit, so test them on your own host before treating the sensor as contained.

Bounding what the sensor records and sends

The sensor does not forward one database row per event. It applies limits at the point of capture and aggregates before anything leaves the VM.

Interaction and containment limits

  • SSH logins are rejected. There is no shell and no command execution.
  • The HTTP side returns a static page and does not read request bodies.
  • Open connections are capped at 256 in total and 10 per IP address.
  • Sessions are limited to 30 to 60 seconds.
  • Captured strings are truncated to a fixed maximum length, and an internal queue is bounded.

These limits keep the attack surface small and the event volume predictable. They also mean the sensor cannot tell you what an attacker would have done after a successful login, because it never grants one.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Yubico - Security Key NFC - Basic Compatibility - Multi-Factor Authentication (MFA) Key, Connect via USB-A or NFC, FIDO Certified
  • POWERFUL SECURITY KEY: The Security Key NFC is the essential physical passkey for protecting your digital life from phishing attacks. It ensures only you can access your accounts.
  • WORKS WITH 1000+ ACCOUNTS: Compatible with Google, Microsoft, and Apple. A single Security Key NFC secures 100 of your favorite accounts, including email, password managers, and more.
  • FAST & CONVENIENT LOGIN: Plug in your Security Key NFC via USB-A and tap it, or tap it against your phone (NFC) to authenticate. No batteries, no internet connection, and no extra fees required.
  • TRUSTED PASSKEY TECHNOLOGY: Uses the latest passkey standards (FIDO2/WebAuthn & FIDO U2F) but does not support One-Time Passwords. For complex needs, check out the YubiKey 5 Series.
  • BUILT TO LAST: Made from tough, waterproof, and crush-resistant materials. Manufactured in Sweden and programmed in the USA with the highest security standards.

Hourly buckets and minute snapshots

Raw events are counted into hourly buckets on disk. Once a minute, the sensor sends a signed summary to the Worker. The Worker stores that summary, and the public endpoints are edge-cached for 30 seconds, so the map updates at most every half minute and the database is queried far less often than the sensor sends.

Why aggregation is a database-budget decision

The reason for batching is concrete. The author’s Cloudflare account runs on the free plan, and in the September 2026 write-up, D1 was cited at 100,000 row writes per day for that plan. Writing one row per SSH attempt would consume that budget quickly on a busy sensor.

The author’s estimate for the summarized flow is about 21 writes per minute, or roughly 30,000 per day (21 × 60 × 24 = 30,240). Those are project-level calculations based on the author’s own event volume. Cloudflare’s plan limits change over time, so confirm the current D1 free-tier quotas on Cloudflare’s pricing and limits pages before you size your own deployment. If your sensor sees more traffic than the author’s, the same arithmetic tells you how much more aggregation you need.

Public map and privacy

The map shows where activity is coming from, not who is behind it. The reference design makes two choices that are worth copying deliberately:

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • IP addresses are masked to network prefixes on the public map, and only countries are shown.
  • Full addresses are retained for a separately authenticated blocklist export rather than being exposed through the public endpoints.

Decide before launch which fields the public endpoints return. Anything you expose on /recent is effectively public and cached at the edge.

Polling or WebSockets for live updates

The reference design does not use WebSockets. Its dashboard refreshes from HTTP endpoints, and the 30-second edge cache is the main control over freshness. For a map that summarizes minute-level data, polling at that cadence is usually enough, and it is the simplest thing to operate.

If you want the browser to receive pushed updates, Cloudflare’s Durable Objects documentation describes WebSockets as a fit for this use. Cloudflare’s documentation for Durable Objects WebSockets states: “WebSockets are long-lived TCP connections that enable bi-directional, real-time communication between client and server.” Cloudflare’s WebSocket server example also warns that an ordinary connected WebSocket keeps its Durable Object in memory and accrues duration charges while the connection stays open. WebSocket Hibernation is the documented way to let idle connections stay open without that cost. Check the current Durable Objects pricing page before choosing this route, because billing terms are the part most likely to have changed.

A Durable Object is a coordination point, not a substitute for the sensor. It can fan updates out to connected browsers, but it does not replace the Worker’s ingestion path, and it does not accept raw SSH traffic.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Low interaction or Cowrie

The reference design is deliberately low-interaction. The alternative most builders consider is Cowrie, an open-source SSH and Telnet honeypot that records login attempts and shell interaction. The two choices answer different questions.

Best Value
Yubico - YubiKey 5Ci - Multi-Factor authentication (MFA) Security Key and passkey for iPhone/Android/PC, Dual connectors for Lighting/USB-C, FIDO Certified
  • POWERFUL SECURITY KEY: The YubiKey 5 is a versatile physical passkey that protects your digital life from phishing attacks. It ensures only you can access your accounts.
  • WORKS WITH 1000+ ACCOUNTS: Compatible with popular accounts like Google, Microsoft, and Apple. A single YubiKey 5 secures 100+ of your favorite accounts, including email, password managers, and more.
  • FAST & CONVENIENT LOGIN: Plug in your YubiKey 5 via USB and tap it to authenticate. No batteries, no internet connection, and no extra fees required.
  • MOST SECURE PASSKEY: Supports FIDO2/WebAuthn, FIDO U2F, Yubico OTP, OATH-TOTP/HOTP, Smart card (PIV), and OpenPGP. That means it’s versatile, working almost anywhere you need it.
  • BUILT TO LAST: Made from tough, waterproof, and crush-resistant materials. Manufactured in Sweden and programmed in the USA with the highest security standards.
Dimension Reference design (low interaction) Cowrie
Interaction depth Rejects logins; no shell or command execution Emulated UNIX shell, and a proxy mode that forwards sessions to a backend
Data collected Connection and login metadata, plus HTTP request metadata Brute-force attempts plus shell interaction, including commands entered
Event volume Kept small by design and aggregated before forwarding Not stated in the project description; sessions that enter commands generate more data
Installation Custom Rust sensor built from the author’s code Installable via pip, Docker, or Git, per the Cowrie project
Containment profile No shell to escape into; strict systemd hardening Shell emulation and proxying widen what must be contained and monitored
Maintenance burden Single small codebase the builder owns Upstream project to track; not stated in the project description beyond its installation options
Best fit Public visualization of connection and credential-guessing activity Analysis of what attackers do after access

Neither choice is universally safer. A shell-emulating honeypot gives richer observations and a larger surface to contain. A login-rejecting sensor is easier to bound and to explain, but it cannot show post-login behavior. Pick the one that matches the question you want the map to answer.

Figures and their limits

The figures below come from one deployment, reported by its author in 2026. They describe that sensor during the period the author measured, and they are not population-wide SSH statistics. No independent worldwide attack-volume figure was established for this article.

Figure Value as reported Who reported it and under what conditions
Attempts per day Around 7,000 F4LCON, 2026, for the author’s single sensor
Unique IPs Around 130 F4LCON, 2026, for the author’s single sensor
Most-tried password 123456 F4LCON, 2026, for the author’s single sensor
D1 row writes, free plan 100,000 per day Plan figure quoted in F4LCON’s September 2026 write-up; confirm against current Cloudflare limits
Summarized write rate About 21 per minute, roughly 30,000 per day Author’s own system-volume estimate, not a Cloudflare benchmark

Your own numbers will depend on where the sensor is hosted, how long it has been online, and whether it is indexed or listed in scanning datasets. Measure your own sensor for at least a week before publishing any rate.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Troubleshooting before you go public

  • No rows in D1: confirm the signed request is reaching the Worker and that the signing secret matches on both sides. Rejected requests are the most common cause of an empty map.
  • Map shows stale data: the edge cache holds responses for 30 seconds. A longer delay usually means the sensor has stopped forwarding, so check the systemd unit’s status and logs on the VM.
  • Write quota warnings: reduce the forwarding frequency or increase aggregation before adding more sensors. Do not raise the rate of row-level writes to compensate.
  • Sensor cannot bind port 22 or 80: check that CAP_NET_BIND_SERVICE is in the unit’s capability settings and that another process is not already listening on the port.

Who should build this, and what it can show

This project suits builders who want a defensible, public picture of unsolicited SSH and HTTP activity, and who can keep a single sensor isolated and under watch. It is a poor fit for anyone who needs to study attacker behavior after login without expanding the containment work, and for anyone who expects the map to represent global threat activity. The value is in the bounded design: small sensor, batched writes, masked public data, and a plain polling dashboard that you can explain end to end.

Before you deploy, verify the current Cloudflare free-tier limits and Durable Objects pricing, read the systemd and Cowrie documentation for the versions you install, and keep the sensor on a host that has no other role.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.