很多人拿到一台新 VPS,第一件事是装各种环境,防火墙却一直挂着 inactive。等日志里出现几千条来自同一个 IP 的失败登录,才开始翻教程。这里不摆理论,只把三份官方文档里真正容易被忽略的细节过一遍,十分钟内能全部做完。
一、UFW 的坑不在命令,在顺序
开防火墙本身是两个命令:
sudo ufw enable
sudo ufw status verbose
打开之后默认策略就是 incoming 拒绝、outgoing 放行,它对 IPv4 和 IPv6 同时生效。
真正的坑在顺序。UFW 的规则一旦命中就不再往下评估,所以「先拒绝具体 IP,再放行整个网段」必须写在放行规则之前。官方文档给的例子正是这个形状:
sudo ufw deny from 192.168.0.1 to any port 22
sudo ufw deny from 192.168.0.7 to any port 22
sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp
反过来就不灵:你已经有一条 allow 的时候,再加一条 deny 会落在它后面,等于没加。查顺序用 sudo ufw status numbered,删除某条用 sudo ufw delete 1(后面的序号会往前挪),要插到队首用 sudo ufw insert 1 allow from <ip>。
放行的写法也要收窄到「来源 + 端口 + 协议」三件套:
sudo ufw allow from 203.0.113.6 to any port 22 proto tcp
只写 sudo ufw allow from 203.0.113.6 会把这个来源的所有端口都打开,这是最常见的手滑。
还有个反直觉的点:UFW 默认是允许 ICMP echo-request(ping)的,想禁 ping 不是一条命令的事,得去改 /etc/ufw/before.rules,把那几条 icmp 规则的 ACCEPT 改成 DROP。文档对这个操作的态度也很实在——面对现代扫描脚本,禁 ping 带来的隐蔽收益非常有限,反倒丢了排障手段,建议留着。
二、fail2ban 能做什么,不能做什么
它的工作方式很朴素:扫 /var/log/auth.log 这类日志,发现某个来源连续多次认证失败,就往防火墙里加规则把这个 IP 拒掉,封多久可配。它开箱就认 sshd 和 Apache 的常见日志格式,从 v0.10 起也匹配 IPv6 地址。配置和运行一律走 fail2ban-client(别直接调 fail2ban-server),装完可以用 fail2ban-client version 确认版本是否到位。
但官方文档里那句「边界声明」比任何安利都值得记住:fail2ban 只能降低错误认证尝试的频率,消除不了弱认证本身的风险;要真正保护服务,就得上双因素或公私密钥。换句话说,它是门锁上的猫眼,不是换锁。所以它可以让你安静一点,却不能替代下面这一步。
三、SSH 该关的这几扇门
- 把登录主体先限定住。
AllowUsers支持USER@HOST的写法,HOST 部分可以直接写 CIDR;配套还有AllowGroups、DenyUsers、DenyGroups。注意规则是「第一个拿到的值生效」,别在两处各写一条。 - 要强制两步就写 AuthenticationMethods。 比如
publickey,password publickey,keyboard-interactive意味着「先过公钥,再过口令或键盘交互」。文档特意提醒:列进来的每个方法都必须另外显式启用,否则写了也不生效。 - 转发生效范围要收,甚至全关。
DisableForwarding可以一次性关掉 X11、ssh-agent、TCP 和 Unix socket 四种转发,比逐条配AllowTcpForwarding干净得多。另外别以为 SSH 隧道已经对外敞开:默认情况下远程端口转发是绑在本机回环地址上的(GatewayPorts默认 no),外部主机连不进来。 - 别指望 SSH 自己断开卡死的会话。
ClientAliveInterval默认 0,也就是不探活;想让没响应的连接自动断掉,要配ClientAliveInterval加ClientAliveCountMax(默认 3)。
建议的执行顺序
先把自己的公钥和固定来源 IP 的放行规则配好 → 再 sudo ufw enable → 装 fail2ban 并确认它在报错 żad → 最后改 sshd,改的时候务必保留一个不断开的连接,另开一个窗口验证新会话能正常进来,确认没问题再关旧连接。整套流程十分钟,比事后救火便宜太多。
登录 后参与评论