在 DigitalOcean droplet 上配置 Fail2ban 防止 SSH 暴力破解,首先需通过包管理器安装 fail2ban 服务,接着创建/etc/fail2ban/jail.local 配置文件而非直接修改默认配置。在配置中启用 [sshd] 监狱,设置合适的 maxretry(如 3 次)、findtime(如 10 分钟)和 bantime(如 1 小时),并指定正确的日志路径(Ubuntu 为/var/log/auth.log,CentOS 为/var/log/secure)。最后启动服务并设置开机自启,即可实现自动监控日志并封禁恶意 IP,有效保护 SSH 安全。
防暴力破解,不止靠 2FA——fail2ban 自动封禁恶意 IP
一、为什么需要 fail2ban? 日志不会说谎——公网的 SSH/服务每天都会遭到大量脚本式的爆破尝试。即便启用了 2FA,日志里的“失败尝试”依旧会占用带宽、日志容量,甚至触发监控噪声。fail2ban 的作用:实时扫描日志,识别重复失败的登录尝试后,自动向防火墙 (如 iptables、firewalld、nftables) 下发规则临时封禁恶意 IP,从而:降低暴力破解成功率 (把攻击者“踢出”很重要); 减少日志/告警噪声; 减轻服务器负载与带宽浪费。二、工作原理 (简明) fail2ban 监控指定日志文件 (/var/log/auth.log、/var/log/secure 等); 根据 filter(正则规则) 匹配失败记录; 达到设定阈值 (maxretry) 与时间窗口 (findtime) 后触发 action,如添加 iptables 规则封禁 IP(ban); 在 bantime 到期后自动解除封禁 (或永久封禁,视配置而定)。
使用 Fail2ban 防止 ssh 暴力破解攻击
起因 我在使用 journalctl -xe --full 查日志时,发现大量的类似下面的日志:代码语言:javascript AI 代码解释 sshd[13352]:pam_unix(sshd:auth):check pass;user unknown sshd[13352]:pam_unix(sshd:auth):authentication failure;logname=uid=0euid=0tty=ssh ruser=rhost=182.61.161.121sshd[13352]:Failed password forinvalid user chase from 182.61.161.121port 58172ssh2 sshd[13352]:Received disconnect from 182.61.161.121port 58172:11:Bye Bye [preauth]sshd[13352]:Disconnected from 182.61.161.121port 58172[preauth]sshd[13354]:reverse mapping checking getaddrinfo fordynamic-ip-1868417225.cable.net.co [186.84.172.25]failed -POSSIBLEBREAK-INATTEMsshd[13354]:Invalid user survey from 186.84.172.25port 38058sshd[13354]:input_userauth_request:invalid user survey [preauth] 可以发现是有陌生 IP 的用户在尝试破解 SSH 登录。通过这条命令可以看到的确有大量失败登录的记录:代码语言:javascript AI 代码解释 73426 Failed password。因此我采取了一些措施,首先修改了 ssh 的默认端口。
如何在 CentOS 7 上使用 Fail2Ban 保护 SSH
配置本地设置 Fail2ban 服务将其配置文件保留在/etc/fail2ban 目录中。在那里,您可以找到一个名为默认值 jail.conf 的文件。由于包升级可能会覆盖此文件,因此我们不应该就地编辑它。相反,我们将编写一个名为 jail.local 的新文件。定义的任何 jail.local 值都将覆盖其中的 jail.conf 值。jail.conf 包含一个 [DEFAULT] 部分,后面是各个服务的部分。jail.local 可以覆盖任何这些值。此外,/etc/fail2ban/jail.d/中的文件可用于覆盖这两个文件中的设置。文件按以下顺序应用:/etc/fail2ban/jail.conf /etc/fail2ban/jail.d/*.conf 按字母顺序排列 /etc/fail2ban/jail.local /etc/fail2ban/jail.d/*.local 按字母顺序排列 任何文件都可以包含一个 [DEFAULT] 部分,首先执行,也可以包含各个 jails 的部分。为给定参数设置的最后一个 vavalue 优先。
服务器被暴力破解?这个神器让黑客哭着回家!
基础配置 我习惯先备份一下原始配置文件,虽然大部分时候用不上,但养成这个习惯总是好的:代码语言:javascript AI 代码解释 cp/etc/fail2ban/jail.conf/etc/fail2ban/jail.conf.bak 然后创建我们自己的配置文件:代码语言:javascript AI 代码解释 vim/etc/fail2ban/jail.local 最基本的配置大概是这样的:代码语言:javascript AI 代码解释 [DEFAULT]# 封禁时间,单位是秒 bantime=3600# 在多长时间内 findtime=600# 失败多少次就封禁 maxretry=3# 忽略的 IP 地址,一般把自己的 IP 加进去 ignoreip=127.0.0.1/8::1192.168.1.0/24[sshd]enabled=trueport=ssh filter=sshd logpath=/var/log/auth.log maxretry=3bantime=3600 安装完成后,fail2ban 的配置文件主要在/etc/fail2ban/目录下。这里有个小坑需要注意,不要直接修改 jail.conf 文件,因为软件更新的时候会覆盖掉你的配置。
FAQ
问:DigitalOcean 上日志路径是什么?
答:Ubuntu/Debian 通常是/var/log/auth.log,CentOS/RHEL 是/var/log/secure。
问:封禁时间设置多久合适?
答:建议至少 1 小时 (3600 秒),可根据攻击频率调整为 24 小时或更长。
问:如何查看被封禁的 IP?
答:使用命令 fail2ban-client status sshd 可以查看当前被封禁的 IP 列表。
问:误封了怎么办?
答:可以将自己的 IP 加入 ignoreip 白名单,或使用 fail2ban-client set sshd unbanip 解封。