开外贸站这六七年,经手过的国外 VPS 没有一百也有八十台了。很多人刚在 Hetzner、DigitalOcean 或搬瓦工开好一台机器,装个宝塔或者 LEMP 架构就把网站扔上去跑,结果没过两天看系统日志 /var/log/auth.log,里面全是一秒几十次的登录失败记录,满屏幕都是来自世界各地的肉鸡在用脚本撞你的 root 密码。面对这种情况,做一套靠谱的 Fail2ban防御SSH暴力破解配置 绝对是每一台 Linux 服务器上线后的标配动作。
网上一堆抄来抄去的运维教程,要么参数过时,要么漏掉关键细节,照着配完直接把自己关在服务器外面的小白不在少数。今天我把我自己服务器上常年跑的一套配置拿出来,咱们不搞虚的,直接一步到位。
很多人觉得“我把 root 密码设成 20 位长,带大小写特殊字符不就行了吗?”
能防住撞库,但防不住服务器资源被消耗。成千上万次的并发扫描,会让 sshd 进程持续占用 CPU 和内存带宽。更恶心的是,有些扫描器会把你的日志文件瞬间撑到几个 G,对于小内存外贸 VPS 来说直接就是灾难。
Fail2ban 的逻辑简单粗暴:它像个巡警一样盯着你的登录日志,只要同一个 IP 在指定时间内输错密码达到上限,直接调用底层防火墙(iptables、nftables 或 UFW)把这个 IP 送进小黑屋,超时才放出来。 简单、轻量、管用。
以大家用得最多的 Debian / Ubuntu 和 CentOS / Rocky Linux 为例,别用那些杂七杂八的一键脚本,直接官方源安装最稳妥。
Debian / Ubuntu:
sudo apt update && sudo apt install fail2ban -y
CentOS 8 / 9 / Rocky Linux / AlmaLinux:
sudo dnf install epel-release -y sudo dnf install fail2ban -y
这是我见过的最多新手踩的坑。官方自带的 /etc/fail2ban/jail.conf 文件千万别直接改,因为只要 Fail2ban 一更新,这个文件就会被官方覆盖重置,你之前辛辛苦苦调的参数全白费。
正统做法是复制一份出来,新建一个 .local 文件覆盖默认参数:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
用你顺手的编辑器打开:
sudo nano /etc/fail2ban/jail.local
翻到 [DEFAULT] 模块,或者直接划到最底部新建属于你的配置。老站长直接给你一套最稳的参数组合,找个空白处贴进去或者对应修改:
[DEFAULT] # 忽略的白名单IP,千万把你的跳板机IP或者本地固定IP写在这,空格隔开 ignoreip = 127.0.0.1/8 ::1 # 统计的时间窗口(秒):在10分钟内... findtime = 600 # 失败重试次数:...输错3次密码 maxretry = 3 # 惩罚封禁时间(秒):直接封禁24小时(86400秒) # 那些只封10分钟的配置纯属扯淡,扫描脚本换个IP过会儿又来了 bantime = 86400 # 防火墙后端,Debian/Ubuntu新系统建议auto或者ufw banaction = iptables-multiport [sshd] # 是否开启,必须设为 true enabled = true # 这一步极其关键:如果你改过默认的SSH端口(比如改成了2222),这里必须写你的端口,不能只写 ssh port = 22 # 监控的日志路径,Debian/Ubuntu是 /var/log/auth.log,CentOS/RHEL是 /var/log/secure logpath = %(sshd_logpath)s # 匹配规则后端 backend = %(sshd_backend)s
配置要点大白话解析:
ignoreip: 保命参数。不管你多自信,万一哪天你键盘连击输错密码,没有白名单你就只能进服务商的 VNC 救砖了。bantime: 我个人极度厌恶那些把封禁时间设成 600 秒的教程,这对黑客的自动化脚本来说没有任何惩罚成本。建议直接设为 86400(1天)甚至更大。port: 很多做外贸建站的朋友为了安全会把 SSH 端口改掉,改了端口后如果这里还留着 port = ssh,Fail2ban 抓瞎,根本不会生效。改完配置文件保存退出,启动服务并挂上开机启动:
sudo systemctl restart fail2ban sudo systemctl enable fail2ban
配置生效后,你可以泡杯咖啡,过半个小时回来看结果。下面这几条命令是我最常敲的:
sudo fail2ban-client status sshd
屏幕上会清清楚楚输出当前监控的状态:
Currently failed: 当前正在尝试失败的次数Total banned: 历史总共封禁了多少个 IPBanned IP list: 当前躺在小黑屋里的所有恶意 IP 列表看到那密密麻麻的一串外部 IP 被关在外面,强迫症瞬间就被治愈了。
如果本地网络换了 IP,输错密码被自己封在外面了,通过控制台(如阿里云/腾讯云后台的 VNC 控制台)登录上去,敲这行命令手动释放:
sudo fail2ban-client set sshd unbanip 你的IP地址
把 Fail2ban防御SSH暴力破解配置 调得再漂亮,它本质上也只是个“事后止血”的工具——别人打过来一拳,它才去挡一下。
要想你的外贸服务器稳如老狗,几百个站安心跑,一定要打好这套组合拳:
服务器安全从来不是搞一堆花里胡哨的操作,把核心入口守死,省下来的心思多去研究怎么给独立站搞流量,比天天半夜被告警短信吵醒强得多。