Most people think brute force attacks are “just noise” that fail anyway. That is how you end up with a rooted box, an IP on abuse lists, and an inbox full of alerts that arrived 12 hours too late.
The short version: you block brute force attacks by reducing exposed services, enforcing sane auth (keys, MFA, rate limits), and putting automated lockout in front of anything that speaks login. Combine network controls (firewall, VPN, port knocking) with application-level throttling (Fail2ban, CrowdSec, WAF, LDAP/IdP policies). If a service does not need the public internet, put it behind a VPN. If a login accepts passwords from the public internet, rate limit it and log it aggressively.
Understanding what “blocking brute force” actually means
Most admins say “I block brute force” when they really mean “I installed Fail2ban once and forgot about it.” That is not blocking. That is reducing the noise.
A brute force attack is any repeated login attempt where the attacker does not know the credential and is trying to guess it. That includes:
- Classic password spraying against SSH, FTP, SMTP, IMAP.
- Web login guessing against WordPress, cPanel, custom apps, APIs.
- Key guessing against SSH when weak keys or known keys are reused.
- Token or code guessing against MFA endpoints with weak rate limits.
A realistic security hardening plan treats brute force as a background condition, not an incident. Your server will be probed. Your logs will fill with junk. The question is whether those attempts convert into real auth failures, resource drain, or access.
Brute force protection is not one feature; it is the side effect of a sane overall access model.
Step 1: Shrink the attack surface before you “block” anything
Most brute force traffic never needs to reach a login prompt. If you expose fewer doors, you do less blocking.
Audit what is exposed
Start with a simple rule: every open port must have a clear reason to exist. If you cannot explain in one line why a port is public, close it.
Typical internet-facing ports on a hosting or community server:
| Port | Service | Public? | Notes |
|---|---|---|---|
| 22 | SSH | Usually no | Prefer VPN or jump host |
| 80 / 443 | HTTP / HTTPS | Yes | Protect via WAF / app-level throttling |
| 25 / 465 / 587 | SMTP | Maybe | Mail servers invite brute force on SMTP AUTH and submission |
| 143 / 993 | IMAP / IMAPS | Maybe | Heavily attacked, needs strong auth + lockout |
| 3306 | MySQL / MariaDB | No | Should be local or VPN-only |
| 3389 | RDP (Windows) | Usually no | Brute force magnet |
Run `ss -tulpen` or `netstat -tulpen` and compare with what you meant to expose. Anything extra is an unexpected attack surface.
If you expose SSH or RDP directly to the public internet, you are volunteering to be a brute force target.
Use network controls to hide admin interfaces
For server management:
- Put SSH and RDP behind a WireGuard or OpenVPN tunnel.
- If VPN is impossible, restrict by IP using firewall rules and your provider’s security groups.
- For control panels (cPanel, Plesk, Proxmox, Cloud management UIs), use IP restrictions or reverse proxy with HTTP auth plus MFA.
Every service you hide behind VPN or IP allow-list is one less brute force vector that even reaches your box.
Step 2: Fix SSH before attackers do it for you
SSH is the oldest brute force punching bag on internet servers. Luckily, it is also one of the easiest to harden.
Core SSH hardening changes
Edit `/etc/ssh/sshd_config`:
PasswordAuthentication noso only keys are allowed.PermitRootLogin noorprohibit-passwordif you want key-only for root.PermitEmptyPasswords no(should already be the default).MaxAuthTries 3or fewer.LoginGraceTime 20seconds or similar.AllowUsers user1 user2to limit who can log in via SSH.
Then restart SSH carefully (with an existing session open) using `systemctl reload sshd` or `service ssh reload`.
If you cannot disable password auth yet because of legacy workflows, you are taking a risk. In that case, strict rate limiting via Fail2ban or equivalent is mandatory, and you should schedule a migration to key-only access.
Change the SSH port (but do not trust that alone)
Running SSH on a non-standard port, for example `2222`, does not “secure” SSH, but it does lower noise. Your logs go from constant junk to occasional junk.
In `sshd_config`:
Port 2222
Update firewall rules and any management scripts. This does not replace keys, lockout, or firewall controls. It is just a minor filter in front of them.
Use key pairs and protect the private key properly
Brute forcing a properly sized SSH key is not realistic for attackers today. They will target password logins or bad keys instead.
Basic sanity for keys:
- Use ed25519 or at least 4096-bit RSA if you must stay with RSA.
- Protect private keys with a strong passphrase.
- Store keys in a secure password manager or hardware token environment.
- Rotate keys when staff or contractors leave.
Centralized key management with something like HashiCorp Vault, Teleport, or strong IdP integration is worth the overhead on larger teams.
If password auth is off and every key is tied to a real person, SSH brute force goes from “constant” to “log noise you can safely ignore.”
Step 3: Implement rate limiting and lockout with Fail2ban / CrowdSec
Once the basic network and SSH posture is sane, you handle the rest of the brute force traffic with automated blocking.
How Fail2ban works
Fail2ban watches log files, matches failed login patterns using regex, and then inserts temporary firewall rules to block the source IP.
Typical failure thresholds:
- SSH: 3 to 5 failures per 10 minutes, ban for 1 hour or longer.
- Mail (Postfix, Dovecot): 5 to 10 failures per 5 minutes, ban for 1 to 4 hours.
- Web login: 5 to 10 failures per 10 minutes, with IP and username based rules.
Configuration is per “jail”, each jail watching a specific log with specific match filters.
Example `jail.local` snippet for SSH:
[sshd] enabled = true port = 2222 logpath = /var/log/auth.log maxretry = 4 findtime = 600 bantime = 3600
Tune those numbers based on real user behavior, but do not be too forgiving. Attack scripts are dumb and do not care if they are blocked for an hour.
CrowdSec vs Fail2ban
Fail2ban is simple and local. It does not share data. CrowdSec adds a community reputation feed and supports more integrators (Web, reverse proxies, containers).
Basic comparison:
| Feature | Fail2ban | CrowdSec |
|---|---|---|
| Log parsing | Yes | Yes |
| Firewall integration | iptables, nftables, others | iptables, nftables, cloud firewalls, proxies |
| Threat intelligence feed | No | Yes (crowdsourced) |
| Ease of start | Very simple | More moving parts |
If you run a single VPS with minimal services, Fail2ban is often enough. If you run a hosting cluster or a busy community with many entry points, CrowdSec or a commercial equivalent can reduce repeated hits from the same offenders across nodes.
Avoid brute force on web control panels and login forms
For web-based logins (WordPress, forums, control panels, custom apps), Fail2ban can still help. You parse the web server log for status codes or patterns that indicate login failure, then block the IP.
Example idea:
- Apache or Nginx logs show repeated 200 responses with “/wp-login.php” and “log=admin”.
- Fail2ban regex matches those lines and bans IP after N attempts per window.
That approach is brittle if your app changes its log patterns. Many apps now support plugin-level lockout and captcha. Use those, but keep in mind:
Captcha and login throttling inside the app are not substitutes for network blocks. They protect the app; they do not stop the traffic.
For heavy traffic sites, a WAF with rate limiting per IP, per user, and per endpoint is more reliable than do-it-yourself regex hacking in Fail2ban.
Step 4: Harden application-level authentication
Brute force is only one failure mode. Weak auth design multiplies its impact.
Choose what attackers can brute force carefully
You do not have to present a static username/password field to the internet. Options:
- SSO with an external IdP that has proper lockout, captchas, device checks, and MFA.
- Magic link login (email link), which removes password guessing but adds email security requirements.
- Social login (GitHub, Google, etc.) for community sites, again pushing brute force risk to providers that invest far more in defense.
For admin logins and hosting panels, SSO with MFA is usually the most sane approach. Local passwords with no MFA and no lockout on a panel that can destroy VM disks is asking for trouble.
Password policies that do not sabotage users
The goal is not to torture users with constant changes and arbitrary character sets. You want:
- Minimum length: 12 characters or more for regular accounts, 16 plus for admins.
- No composition gimmicks that push users into bad patterns like “Summer2025!”.
- No expiration policy that forces resets every 30 or 60 days, which leads to predictable sequences.
- Server-side checks against known compromised passwords (HIBP, internal breach lists).
If your system uses short, weak passwords, brute force plus password reuse from leaks gives attackers a large advantage. Length and uniqueness matter more than complexity theater.
MFA where it actually counts
MFA does not stop every form of attack, but against simple brute force of passwords, it raises the bar significantly.
Sensible use:
- Mandatory for staff, admins, and moderators.
- Optional but strongly recommended for regular users, especially on communities with financial or sensitive data.
- Use TOTP or hardware keys before SMS-based MFA, which carries its own risk profile.
On servers, integrate SSH with hardware keys or U2F if your environment allows it. For web panels and dashboards, at least TOTP via an authenticator app.
Step 5: Use firewall and network-level throttling properly
Firewalls are the last non-application gate before packets hit your services.
Base firewall policy: default deny
The classic pattern:
- Allow: 80, 443, VPN port, maybe mail ports.
- Deny: everything else from public addresses.
- Allow SSH or RDP only from VPN network or trusted management IPs.
On Linux:
- Use `ufw` or `firewalld` for simple setups.
- Use `nftables` or raw `iptables` if you need precise control or high scale.
On cloud providers, combine OS firewall with security groups or ACLs. Treat any forgotten rule as a possible brute force vector.
Connection limits and rate control at the firewall
Lightweight protection can live inside your firewall rules. Examples:
- Use `connlimit` to stop single IPs from opening hundreds of parallel SMTP or HTTP connections.
- Use recent or hashlimit modules to limit new connection rates.
This does not replace application-level logic, but it slows down simple scripts that rely on raw speed.
Good brute force protection uses both network and application throttles. Each layer handles what it is good at.
Step 6: Secure common brute force magnets (Mail, FTP, Panels, CMS)
Some services are attacked so often that leaving them too open is almost negligent.
Mail services (SMTP, IMAP, POP3)
Mail servers are prime targets because a compromised mailbox is valuable.
Basic steps:
- Enforce TLS everywhere (submission ports, IMAP, POP3).
- Disable SSLv3 and weak ciphers; keep modern TLS config.
- Use strong password policies and encourage MFA where supported (for webmail or SSO).
- Configure Fail2ban or CrowdSec jails for Postfix, Dovecot, Exim, etc.
- Limit authenticated SMTP by country or IP where possible.
Watch for:
- Sudden spikes in SMTP AUTH failures.
- Accounts that log in from impossible geography sequences (e.g., Europe then Asia within minutes).
Many mass-mailing abuse cases start as successful brute force on a forgotten mailbox with a weak password.
FTP and SFTP
Plain FTP should be dead in 2025, but hosting environments still carry it as baggage.
If you must keep FTP:
- Use FTP over TLS only; disable clear text logins.
- Enforce strong passwords and short session lifetimes.
- Restrict per-IP or by geography if traffic patterns are predictable.
- Apply Fail2ban or CrowdSec for repeated failed logins.
Better:
- Migrate users to SFTP or rsync over SSH, with key-based auth.
- Chroot or jail SFTP users to limit damage if a single account is compromised.
Control panels (cPanel, Plesk, DirectAdmin, Proxmox, etc.)
Panels handle privileged operations. Brute forcing their logins is worth the effort for attackers.
Hardening basics:
- Do not expose panel ports directly unless there is no alternative.
- Restrict access by IP and/or VPN.
- Enable built-in brute force protection and captcha features.
- Require MFA for admin accounts.
- Keep the panel patched; old versions often have auth bypass bugs.
If a vendor ships a panel with no meaningful brute force protection, that is a red flag. Reconsider whether it belongs on public-facing infrastructure.
CMS and web forums
WordPress, phpBB, Discourse, XenForo, and similar platforms are popular targets on community servers.
Common-sense measures:
- Use security plugins that add login rate limits and optional captchas.
- Hide or move default admin URLs where the platform supports it, for example a non-standard admin endpoint.
- Disable direct account registration where the community model does not require it, or move registration behind invites.
- Force MFA for moderators and admins.
On high-traffic communities, put a WAF like Nginx with modsecurity, Traefik with security middleware, or a cloud WAF in front of the app. Configure per-IP and per-account throttling, especially on login and password reset routes.
Step 7: Logging and monitoring that actually helps
You cannot react to brute force patterns you do not see.
Centralize and retain logs
Local logs on each host are fine until something serious happens, then they are scattered and partially rotated away.
Better pattern:
- Ship logs to a central system (Elastic stack, Loki, Graylog, commercial SIEM, or even a self-hosted syslog server).
- Tag logs per host and per service for querying.
- Retain at least several months of auth logs for incident analysis.
If your retention is only a week, long-running low-and-slow brute force activity will vanish before you review patterns.
Alert on patterns, not just single events
One failed login is normal. Hundreds from one IP over 5 minutes are not. Set alerts for:
- Unusual spikes in SSH or panel login failures.
- New geographic locations for admin logins.
- Accounts with a sudden high number of login failures followed by success.
Integrate notifications with your preferred channel (email, Slack, Matrix, etc.) but be careful to avoid alert fatigue. If your system floods you every night, you will ignore the one notification that matters.
Attackers count on fatigue. If your alert volume is constant background noise, one real incident blends into the mess.
Step 8: Dealing with modern brute force tactics
Attackers are not always hammering from a single IP against a single account anymore. They adapt.
Distributed low-rate brute force
Modern bots use:
- Large IP pools (home proxies, compromised routers, VPN exit nodes).
- Small numbers of attempts per IP to avoid simple rate limits.
They spread attempts across many user accounts to look like normal mistakes. Defense strategies:
- Per-account lockout thresholds, not just per-IP.
- Detection of unusual login failure ratios per account over time.
- Behavioral checks during auth (known device, browser fingerprint, etc.), especially on critical apps.
For hosting panels and community admin logins, you want to know if an account that never failed logins suddenly racks up 20 failures in an hour, even from seemingly “clean” IPs.
Password stuffing and credential reuse
This is more targeted than blind brute force: attackers use leaked credential pairs and replay them on other services.
Defenses:
- Check new and changed passwords against breach corpuses.
- Encourage or enforce unique passwords via password managers.
- Detect logins from known bad IP ranges or previously abusive IPs using threat intel feeds.
- Apply step-up verification (MFA challenge) when behavior deviates from the account norm.
For community platforms and shared hosting, this is extremely common because users tend to reuse passwords across forums, panels, email, and social sites.
Step 9: Hardening mindset: assume keys leak and passwords are guessed
No combination of settings gives you perfect immunity. What you can do is make brute force so slow, noisy, and expensive that attackers go elsewhere or are contained quickly.
Practical mindset shifts:
- Assume any login reachable from the public internet is under attack even if logs are quiet; logs can be incomplete.
- Assume at least some user credentials are already in public leaks.
- Assume staff devices can be compromised, therefore keys and sessions might leak someday.
Then design around those assumptions:
- Limit blast radius: roles, least privilege, and separate accounts for admin tasks.
- Short session tokens for high-privilege areas; require re-auth or MFA for critical actions.
- Regular reviews of who has access to what, and revocation when people change roles.
Blocking brute force is not about perfect walls; it is about forcing attackers into noisy, high-effort paths that your monitoring can actually catch.
Step 10: Practical baseline checklist for a hardened server
This is what a “seen it all” baseline looks like on a typical web or community server that cares about brute force.
Network & access
- SSH/RDP only via VPN or strict IP allow-list.
- SSH using key-only auth, with root login disabled.
- Control panels behind VPN, IP filter, or reverse proxy with MFA.
- Databases not exposed to the public internet.
- Default deny firewall with only required ports open.
Rate limits & blocking
- Fail2ban or CrowdSec deployed with jails for SSH, mail, and web auth endpoints.
- Per-IP limits on login routes at WAF or application level.
- Per-account limits with lockout or increasing delay after repeated failures.
Auth quality
- Strong password policy focused on length and uniqueness, not “must include symbol.”
- MFA for admins, moderators, and panel users.
- SSO for internal tools and staff, backed by an IdP with strong security controls.
- Regular pruning of stale accounts, especially privileged ones.
Monitoring & response
- Centralized logging for auth events.
- Alerts on spikes in failure rates, strange geo access, and lockout events for high-value accounts.
- Documented process to investigate suspected brute force and account compromise.
If your environment falls short in several of these areas, then “blocking brute force” is more aspirational than real. Tweak one piece at a time: start with SSH and panel access, move through mail and web apps, then refine monitoring.
The end goal is not a perfectly clean auth log. It is a server where brute force is boring to attackers, predictable and manageable to you, and rarely, if ever, the reason you wake up to a compromised system.

