外贸站宝塔面板服务器fail2ban自动拉黑爆破IP
为什么外贸站服务器容易挨SSH爆破?
外贸站的服务器通常暴露在公网,SSH端口(默认22)长期开着,很容易被机器人扫描并尝试暴力破解密码。
如果密码简单或者没限制,用不了多久就会中招。
传统做法是改端口、用密钥登录,但改端口不能完全杜绝扫描,密钥登录也只解决了密码问题。
更好的办法是用 fail2ban 自动拉黑那些反复尝试登录的IP。
本文适合正在使用 宝塔面板 做外贸网站的站长,系统环境为 CentOS 7 或 Ubuntu 20.04+,操作过程全部可在SSH命令行完成,不需要额外安装图形软件。
读完就能自己配置好 fail2ban,并且验证效果。
准备工作:安装 fail2ban
先通过SSH连接你的服务器。
如果还没装fail2ban,用下面的命令一键安装。
CentOS / Alibaba Cloud Linux
yum install -y epel-release
yum install -y fail2ban
Ubuntu / Debian
apt update
apt install fail2ban -y
安装完成后先别急着启动,我们要先做配置。
核心配置:告诉 fail2ban 监控什么
fail2ban 的核心配置文件放在 /etc/fail2ban/jail.local。
默认没这个文件,需要手动创建。
执行这条命令创建并编辑:
vim /etc/fail2ban/jail.local
如果不会用 vim,也可以用 nano /etc/fail2ban/jail.local。
粘贴下面内容(注意修改 logpath 和 port 为你自己的):
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
action = iptables[name=SSH, port=22, protocol=tcp]
参数说明:
bantime:封禁时间(秒),3600 表示 1 小时。findtime:统计窗口(秒),600 表示 10 分钟内。maxretry:在窗口内失败次数,达到 3 次就封。ignoreip:白名单,建议把你自己的本机IP加进去,避免自己误封。logpath:SSH 登录日志文件路径(CentOS 是/var/log/secure,Ubuntu 是/var/log/auth.log)。
如果你的SSH端口不是22,记得把 port 改成你实际的端口号。
启动并设置开机自启
配置好之后,执行:
systemctl start fail2ban
systemctl enable fail2ban
systemctl status fail2ban
看到绿色 active (running) 就说明启动成功了。
如果启动失败,检查日志 journalctl -u fail2ban -n 50 看报错。
避坑指南:这些最容易翻车
- 宝塔面板内置防火墙与 fail2ban 冲突:宝塔面板的“安全”模块里默认带了一个系统防火墙(firewalld 或 ufw)。fail2ban 默认用 iptables 操作规则,如果两者同时存在,可能会出现规则重复或冲突。建议在宝塔面板里关掉“SSH安全防护”的自动拉黑功能,或者统一只用 fail2ban。
- 误封自己IP:一定要在
ignoreip里加上你的本地公网IP。如果不小心把自己封了,只能通过VNC或面板的“SSH管理”进入服务器,执行fail2ban-client set sshd unbanip 你的IP解封。 - 日志路径错误:Ubuntu 和 CentOS 的 auth 日志路径不同,写错了 fail2ban 无法读取日志,就没法拉黑。确认路径:
ls -l /var/log/secure或ls -l /var/log/auth.log。 - 端口修改后没同步:如果你的SSH端口改了,除了改
port参数,还要确保 firewalld/fail2ban 都放过这个端口。可以用fail2ban-client status sshd查看当前规则。
效果验证:怎样确认IP被自动拉黑了
执行下面命令查看 fail2ban 的 jail 状态:
fail2ban-client status sshd
输出类似:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 23
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 2
|- Total banned: 5
`- Banned IP list: 114.xxx.xxx.xxx 203.xxx.xxx.xxx
看到 Currently banned 不为0,就表示已经有IP被自动拉黑了。
你也可以用 iptables 验证:
iptables -n -L INPUT | grep fail2ban
如果出现了 fail2ban-SSH 的 chain,并且有DROP规则,那就是生效了。
如果想手动测试,可以另开一个终端,故意输错几次SSH密码,然后立刻查看 fail2ban-client status sshd,应该会看到失败次数增加。
等达到阈值后,尝试登录会被拒绝。
常见问题FAQ
问:fail2ban 能不能用来保护宝塔面板后台登录?
答:可以。
宝塔面板的后台登录接口 /login 也会被爆破。
你可以给 fail2ban 添加一个针对 nginx 或 apache 的 jail,监控 /www/wwwlogs/ 下的面板访问日志,匹配 403 或 404 状态码。
但这相对复杂,建议先用本文的SSH防护,再考虑面板保护。
问:我已经加了密钥登录,还需要 fail2ban 吗?
答:建议加上。
密钥登录虽然安全,但攻击者仍然会大量尝试连接,消耗服务器资源。
fail2ban 可以提前阻断,减少日志量和CPU负担。
问:重启服务器后 fail2ban 的封禁记录还在吗?
答:默认情况下 iptables 规则是临时的,重启后清空。
fail2ban 会把封禁信息保存在 /var/lib/fail2ban/ 下,重启服务后会自动重新加载之前被封的IP。
但如果是系统重启后 iptables 完全重置,可能导致规则丢失。
可以配合 iptables-persistent 或 firewalld 来持久化,但对新手来说,平时注意别轻易重启服务器就好。
如果你正在为自己的外贸站配置 fail2ban,建议先按本文步骤执行一次,再根据实际环境微调日志路径和规则。
遇到异常时优先回看避坑部分,多数问题都出在路径和端口配置上。