上期回顾:你的门锁升级了,但还不够
还记得上期我们做了什么吗?
- 用SSH密钥替代密码登录(换了把"指纹锁")
- 修改了SSH默认端口(换了个"门牌号")
这两招已经能挡住99%的自动化扫描机器人。但问题是,还有那1%怎么办?
小王按照上期教程配置好服务器后,过了一周又看了看日志,发现虽然攻击尝试少多了,但还是有:
Failed password from 45.x.x.x port 23456
Failed password from 103.x.x.x port 23456
Failed password from 185.x.x.x port 23456
有些"聪明"的攻击者会扫描全端口,有些针对性的攻击会直接找到你的新端口号。
你需要的,是一个24小时不睡觉的"自动门卫"。
什么是fail2ban?
一个永不休息的智能保安
想象一下:
传统方式:你每天盯着监控录像,发现有人鬼鬼祟祟试了5次密码,你赶紧手动报警把他拉黑。
fail2ban:雇了个AI保安,自动监控、自动识别、自动拉黑,24小时不眨眼。
工作原理很简单
fail2ban就像一个尽职的门卫,它的工作流程是:
- 实时监控日志 - 盯着SSH、Web等服务的登录记录
- 识别异常行为 - 发现有人短时间内多次失败登录
- 自动采取行动 - 立即把攻击者的IP加入防火墙黑名单
- 定时解除封禁 - 过一段时间自动解封(或者永久拉黑)
用一张流程图说明:
攻击者连续失败5次 → fail2ban检测到 → 自动添加防火墙规则
→ IP被封禁 → 攻击者彻底连不上服务器
为什么你需要fail2ban?
场景1:防止万一
即使你用了SSH密钥,可能还有其他账户用密码登录,或者哪天你临时开启了密码认证调试问题。多一层防护,多一份安心。
场景2:减少资源消耗
大量的登录尝试会消耗服务器CPU和内存。有了fail2ban,攻击者的请求直接被防火墙挡在门外,根本到不了SSH服务。
场景3:日志清爽
不用再看密密麻麻的失败登录记录,出问题时更容易找到真正的异常。
场景4:抵御分布式攻击
攻击者可能用多个IP轮流尝试。fail2ban能持续识别和封禁新出现的攻击IP,让他们无处遁形。
5分钟安装配置fail2ban
第一步:安装fail2ban
Ubuntu/Debian系统:
sudo apt update
sudo apt install fail2ban -y
CentOS/RHEL系统:
sudo yum install epel-release -y
sudo yum install fail2ban -y
启动并设置开机自启:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
看到 Created symlink... 之类的提示就说明成功了。
第二步:配置fail2ban(重点)
理解配置文件
fail2ban有两个配置文件:
/etc/fail2ban/jail.conf- 默认配置(不要动它)/etc/fail2ban/jail.local- 你的自定义配置(在这里改)
为什么要分两个文件?因为软件升级时会覆盖 jail.conf,但不会动 jail.local。
创建自定义配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
核心配置项(用人话解释)
找到 [DEFAULT] 部分,修改这几个参数:
[DEFAULT]
# 封禁时长(秒):这里设10分钟
bantime = 600
# 检测时间窗口:10分钟内的失败尝试会被统计
findtime = 600
# 失败次数阈值:10分钟内失败5次就封
maxretry = 5
# 白名单IP:这些IP永远不会被封
ignoreip = 127.0.0.1/8 ::1
小贴士:把你自己的家庭IP或办公室IP加到 ignoreip 里,避免误伤自己。
配置SSH保护
找到 [sshd] 部分,修改成:
[sshd]
enabled = true
port = 23456 # 改成你实际的SSH端口
filter = sshd
logpath = /var/log/auth.log # Debian/Ubuntu用这个
# logpath = /var/log/secure # CentOS/RHEL用这个
maxretry = 3 # 改成3次,更严格
bantime = 3600 # 封禁1小时
解释一下:
enabled = true- 启用SSH保护port- 你的SSH端口(如果改过默认端口,这里要写对)maxretry = 3- 3次机会,比默认的5次更严格bantime = 3600- 封禁1小时(3600秒)
第三步:重启fail2ban
sudo systemctl restart fail2ban
第四步:验证是否生效
# 查看fail2ban运行状态
sudo systemctl status fail2ban
# 查看SSH监狱状态
sudo fail2ban-client status sshd
如果看到类似这样的输出,就说明成功了:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
进阶配置:让fail2ban更强大
配置1:永久封禁重复犯罪者
有些攻击者被封后会换个IP继续攻击。我们可以设置"累犯"规则:被抓3次,直接永久拉黑。
在 jail.local 里找到或添加:
[recidive]
enabled = true
bantime = -1 # -1表示永久封禁
findtime = 86400 # 24小时内
maxretry = 3 # 被封3次就永久拉黑
解释:如果一个IP在24小时内被封禁3次,第三次就是永久封禁,再也别想连上你的服务器。
配置2:保护其他服务
fail2ban不仅能保护SSH,还能保护Web服务器、数据库等。
比如保护Nginx:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
配置3:白名单设置
如果你有固定的办公室IP或家庭IP,强烈建议加到白名单:
ignoreip = 127.0.0.1/8 ::1 你的家庭IP 你公司的IP段
比如:
ignoreip = 127.0.0.1/8 ::1 123.45.67.89 192.168.1.0/24
查看fail2ban的工作成果
查看当前封禁了多少IP
sudo fail2ban-client status sshd
输出示例:
|- Number of banned IPs: 15
`- Banned IP list: 103.x.x.x 185.x.x.x 45.x.x.x ...
看到这个数字,你就知道fail2ban帮你挡住了多少攻击。
查看详细日志
sudo tail -f /var/log/fail2ban.log
你会实时看到fail2ban的工作记录:
2024-12-23 10:15:23 [sshd] BAN 103.x.x.x
2024-12-23 11:15:23 [sshd] UNBAN 185.x.x.x
每一条BAN记录,都是一个被拦在门外的攻击者。
手动操作
有时候你可能需要手动封禁或解封某个IP:
# 手动封禁某个IP
sudo fail2ban-client set sshd banip 1.2.3.4
# 手动解封某个IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
常见问题Q&A
Q:我会不会把自己封了?
A:只要把你的IP加到 ignoreip 白名单里就不会。另外,云服务商通常提供VNC控制台,可以绕过网络直接登录。
Q:封禁时间设多久合适?
A:建议先设10分钟到1小时,观察效果后再调整。太短了攻击者会继续尝试,太长了可能误伤正常用户。
Q:如何判断是攻击还是用户忘记密码?
A:看IP来源和频率。正常用户偶尔输错1-2次,攻击者是短时间内大量连续尝试。
Q:fail2ban会影响服务器性能吗?
A:几乎没有影响。它只是读日志和操作防火墙,反而因为拦截了攻击,减轻了SSH服务的压力。
Q:万一fail2ban出问题怎么办?
A:云服务商都有VNC/控制台可以直接登录。或者临时停止fail2ban:sudo systemctl stop fail2ban
安装前后对比
安装前:
- 每天上千次攻击尝试
- 日志被刷屏,看不清真实问题
- 服务器资源被消耗
安装后:
- 攻击者尝试几次就被拦在门外
- 日志清爽,只看到被封禁的记录
- 服务器更稳定,资源占用更低
一个真实案例:某用户配置fail2ban前,每天有1000+次失败登录。配置后,第一天就封禁了50多个IP,现在每天只有零星几次尝试,而且都是新IP,试几次就被封了。
三道防线:你的服务器已经很安全了
回顾一下,现在你有了:
- 第一道防线:SSH密钥认证 - 黑客进不来
- 第二道防线:修改默认端口 - 黑客找不到
- 第三道防线:fail2ban自动封禁 - 黑客试几次就被拉黑
就像给家里装了:
- 指纹锁(密钥)
- 隐蔽的门(改端口)
- 24小时智能保安(fail2ban)
小偷想进你家?难度系数:地狱级。
总结:5分钟,让服务器更安全
fail2ban的核心价值,就是把"被动防御"变成"主动防御":
- 不用你盯着日志手动拉黑
- 不用担心忘记封禁某个IP
- 24小时自动工作,永不疲倦
今天就去配置fail2ban,让那些攻击者撞个头破血流!
下期预告:我们将继续讲解Linux服务器安全的其他重要措施:防火墙精细化配置、禁用root直接登录、定期更新系统等。
你的fail2ban封禁了多少IP?评论区晒晒战果!遇到问题也欢迎留言,我来帮你解决。