LogBus as a fail2ban replacement
Ever wish you could take your logs, slice them like a chef, and use them to firewall off internet goblins automatically?
Let me introduce you to one of my favorite parts of LogBus: the fail2ban plugin. It's like duct-taping iptables, ipset, and intelligent pattern recognition onto your log stream, except instead of regex soup and cron jobs, it's clean, structured, and fast.
TL;DR - Automatic Blacklisting, Powered by Logs
With just a few lines of logic in the fail2ban plugin, I can:
- Detect brute-force SSH attacks, sketchy
.envcrawlers, or broken SMTP EHLOs - Count repeated failures over time (per IP + service)
- Auto-ban with
ipsetwhen a threshold is crossed
No need for Fail2Ban daemons, custom log regexes, or a thousand jail.conf files.
How It Works: A Quick Peek
At the core is a function called failed(event) which inspects logs to figure out:
- Which service was targeted (SSH, web, mail, firewall)
- Who's the perp? (by IP)
- How many times has this IP failed?
- Is it time to ban them yet?
Here's a taste:
if (event.process === 'sshd') {
match = event.message.match(/invalid user (?<user>\S+) (?<ip>\S+) port (?<port>\d+)/ui)
if (match) {
const {user, ip, port} = match.groups
this.set(event, 'client.ip', ip)
key = `ssh~${ip}`
limit = 1
}
}
That logic maps log lines to failure keys like ssh~1.2.3.4. It also tags metadata onto the event for later use. Other examples from the plugin:
iptablesprobing =iptables~<ip>with a limit of 10- Web traffic scanning for
.envor bad status codes? →web~<ip> - Mail relays with invalid EHLOs? →
mail~<ip>
When the threshold is crossed, this ban logic runs - simple, fast, and it logs the action for visibility.
this.ipset(['add', '-!', `blacklist-${service}`, ip], ...)
The Blacklist Keys: Service-Based Granularity
By structuring keys like web~<ip> or ssh~<ip>, I can:
- Create per-service ipsets (e.g.,
blacklist-web,blacklist-ssh) - Track failure behavior per service, not just globally
- Avoid banning SMTP clients for web traffic or vice versa
The plugin holds a short-lived memory of recent failures in this.config.failures, keyed by that service~ip string. This allows me to run LogBus continuously over system logs and let the plugin take care of:
- Tracking thresholds
- Applying the bans
- Logging what happened
- Tagging banned events
Web Traffic Gotchas
LogBus isn't just sniffing firewall logs and auth attempts. It even watches web traffic:
if (path.endsWith('.env') || path.includes('\\x')) {
key = `web~${event.client.ip}`
limit = 1
} else if (status >= 400 && status < 500) {
key = `web~${event.client.ip}`
limit = 5
}
This catches bad behavior like:
- Requests to sensitive files (
.env,/.git, etc.) - Obfuscated payloads
- High volumes of 4xx status codes
Because who really needs 27 "GET /wp-login.php" attempts in a row from a Ukrainian IP at 3am?
Bonus: Mail Filtering, Too
The plugin even catches garbage SMTP handshakes so I can ban misconfigured relays & password brute-forcers without touching Postfix configs.
match = event.message.match(/(smtp.invalid-ehlo|smtp.auth-not-allowed).* remoteip = (?<ip>[0-9.]+)/ui)
Final Thoughts
This fail2ban plugin is one of many tools in LogBus that lets me turn logs into real-time action. Instead of just archiving logs for postmortem, I'm using them to:
- Actively defend infrastructure
- Annotate malicious behavior
- Maintain clean
iptables/ipsetstate automatically
Like any good Swiss Army knife, LogBus has a blade for every situation - and this one slices deep.