文章

新 VPS 上线第一小时:UFW 规则顺序、fail2ban 的能力边界、SSH 要关的门

静水流深 17小时前 · 1,769 字 · 约 6 分钟 · 25 次阅读
我发布了文章:《新 VPS 上线第一小时:UFW 规则顺序、fail2ban 的能力边界、SSH 要关的门》

很多人拿到一台新 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;配套还有 AllowGroupsDenyUsersDenyGroups。注意规则是「第一个拿到的值生效」,别在两处各写一条。
  • 要强制两步就写 AuthenticationMethods。 比如 publickey,password publickey,keyboard-interactive 意味着「先过公钥,再过口令或键盘交互」。文档特意提醒:列进来的每个方法都必须另外显式启用,否则写了也不生效。
  • 转发生效范围要收,甚至全关。 DisableForwarding 可以一次性关掉 X11、ssh-agent、TCP 和 Unix socket 四种转发,比逐条配 AllowTcpForwarding 干净得多。另外别以为 SSH 隧道已经对外敞开:默认情况下远程端口转发是绑在本机回环地址上的(GatewayPorts 默认 no),外部主机连不进来。
  • 别指望 SSH 自己断开卡死的会话。 ClientAliveInterval 默认 0,也就是不探活;想让没响应的连接自动断掉,要配 ClientAliveIntervalClientAliveCountMax(默认 3)。

建议的执行顺序

先把自己的公钥和固定来源 IP 的放行规则配好 → 再 sudo ufw enable → 装 fail2ban 并确认它在报错 żad → 最后改 sshd,改的时候务必保留一个不断开的连接,另开一个窗口验证新会话能正常进来,确认没问题再关旧连接。整套流程十分钟,比事后救火便宜太多。

登录 后参与评论

还没有人评论,来抢沙发