Linux 防止暴力破解的策略与工具

1次阅读

fail2ban启动报connectionrefusederror是因为默认尝试连接未启用的8080 socket;需检查systemctl status fail2ban、禁用systemd backend、改用auto或polling,并确认日志路径与后端匹配。

Linux 防止暴力破解的策略与工具

fail2ban 为什么一装就报 ConnectionRefusedError

因为默认配置里 fail2ban-server 尝试连 127.0.0.1:8080 的 socket,但实际没开 Web API。这不是 bug,是它默认启用 systemd socket 激活,而你没启动对应服务。

  • 先确认是否真在跑:systemctl status fail2ban,不是 fail2ban-server
  • 删掉 /etc/fail2ban/jail.local 里所有带 backend = systemdsocket 的行
  • 改用 backend = auto 或明确写 backend = polling(尤其日志在 NFS 或容器里时)
  • journalctl -u fail2ban -n 50 看真实报错,别只信启动失败提示

sshd 日志路径不对导致 fail2ban 不拉黑

新版 OpenSSH 默认把日志发给 journald,而 fail2ban 默认只扫 /var/log/auth.log/var/log/secure —— 这俩文件可能根本没 ssh 登录记录。

  • 查 ssh 实际输出位置:sudo journalctl _COMM=sshd --no-pager -n 20
  • 如果确实走 journald,就别配 logpath = /var/log/secure,改用 backend = systemd 并确保 Filter = sshd 对应的 journalmatch 正确
  • 或者强制 ssh 写文件:在 /etc/ssh/sshd_configSyslogFacility AUTH,再改 /etc/rsyslog.conf 确保 auth.* 落盘
  • 验证日志是否可读:sudo -u root tail -n 20 /var/log/secure,fail2ban 是以 rootfail2ban 用户身份读的

fail2ban 拉黑了但 iptables 规则不生效

常见原因是系统用了 nftables 后向兼容层没开,或 iptables 命令被 alias 成 nft,导致 fail2ban 调用失败却静默忽略。

  • 运行 sudo iptables -L -n | head -5,如果报 command not found 或输出是 nft 格式,说明底层已切到 nftables
  • 检查 /etc/fail2ban/jail.local 是否设了 banaction = iptables —— 在 nftables 系统上得换成 banaction = nftables
  • 确认 nft list ruleset 里有没有 fail2ban- 开头的 chain;没有的话可能是 action.d/nftables.conf 里的 chain = input 写错了,应为 chain = inputchain = forward,取决于你的 ssh 端口监听方式
  • 临时测试:手动加一条 sudo nft add rule ip filter input tcp dport 22 ip saddr 192.168.1.100 drop,看是否立刻断连

用 ufw 配合 fail2ban 容易漏掉 IPv6 或状态连接

ufw 默认只管 IPv4,且对 RELATED,ESTABLISHED 放行太宽,fail2ban 拉黑后旧连接仍通,攻击者能靠长连接绕过。

  • 开 IPv6:sudo ufw enable 之前先确认 /etc/default/ufwIPV6=yes
  • fail2ban 的 banaction 别直接设成 ufw,它不支持动态端口和自定义链,建议用 nftables + 手动同步规则
  • ufw 的默认策略是 deny incoming,但 fail2ban 的 ban 规则优先级低于 ufw 的 allow 规则 —— 所以必须让 fail2ban 插入到 ufw chain 的最前面,靠 before.rulesnft 实现
  • 真正要防暴力破解,MaxAuthTries 3LoginGraceTime 30 这类 sshd 内置限制比外挂工具更早生效、更省资源

真正的难点不在装工具,而在确认每层日志流向、每条规则实际生效位置、每个用户权限是否匹配 —— 少查一步 journalctl,就可能以为“拉黑了”,其实什么都没发生。

text=ZqhQzanResources