为什么必须立刻加固?
公网 VPS 平均在上线后 5-10 分钟就会被自动化扫描器探测。Shodan、Censys 这类搜索引擎 24 小时不间断抓取全网开放端口,如果你的 SSH 仍用 22 端口 + 密码登录,等于把钥匙挂在门把手上。
⚠️ 真实数据:一台未加固的 Ubuntu VPS,24 小时内平均会遭遇 2,000+ 次 SSH 暴力破解尝试,其中 80% 来自中国 IP 段的自动化僵尸网络。
第一层:UFW 防火墙
UFW(Uncomplicated Firewall)是 Ubuntu/Debian 默认的防火墙前端,底层调用 iptables,语法极简。
# 安装并启用
sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行业务端口(按需)
sudo ufw allow 22/tcp # SSH(建议改成自定义端口)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# 启用(输入 y 确认,避免 SSH 断开)
sudo ufw enable
sudo ufw status verbose
⚠️ 坑点:启用 UFW 前必须先放行 SSH 端口,否则会把自己锁在外面。如果是云厂商(如 AWS/腾讯云),还要在控制台安全组同步放行。
第二层:fail2ban 防暴力破解
fail2ban 通过监控日志,对多次失败登录的 IP 自动封禁。是防 SSH 暴力破解最有效的工具。
sudo apt install fail2ban -y
# 本地配置(不覆盖默认)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
# 关键配置([sshd] 段)
[sshd]
enabled = true
port = 22 # 改端口后同步改这里
maxretry = 3 # 3 次失败即封
findtime = 600 # 10 分钟窗口
bantime = 86400 # 封 24 小时
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # 查看封禁状态
第三层:SSH 端口与登录强化
三招组合拳:改端口 + 禁密码 + 限用户。
sudo nano /etc/ssh/sshd_config
Port 22022 # 改成非标准端口
PasswordAuthentication no # 强制密钥登录
PermitRootLogin no # 禁止 root 直接登录
AllowUsers deploy # 只允许指定用户
MaxAuthTries 3 # 单次连接最多 3 次尝试
sudo systemctl restart sshd
💡 顺序很重要:禁用密码登录前,先用密钥登录测试一次。改端口后,UFW 和 fail2ban 都要同步更新端口配置。
进阶:DDOS 与端口扫描防护
- Cloudflare 前置:把域名解析到 Cloudflare,启用 Under Attack 模式,让 CF 拦截 L3/L4 DDOS,源站只放行 CF IP 段。
- SYN Cookie:`sudo sysctl -w net.ipv4.tcp_syncookies=1` 防 SYN Flood。
- 端口敲门(Port Knocking):用 knockd 让 SSH 端口只在正确敲门序列后才开放,扫描器根本看不到端口。
- 自动安全更新:`sudo apt install unattended-upgrades` 让系统自动打安全补丁。
加固检查清单
- ✅ UFW 已启用,仅放行业务端口
- ✅ fail2ban 运行中,sshd jail 已激活
- ✅ SSH 端口已改为非 22
- ✅ 密码登录已禁用,仅密钥登录
- ✅ root 直接登录已禁用
- ✅ unattended-upgrades 已配置自动安全更新
- ✅ 云厂商安全组与 UFW 规则一致
- ✅ 已备份 sshd_config,已知救援模式入口