云服务器上线前的安全清单:端口、SSH、防火墙别留默认-第三维度MokIII

为什么写这个

默认配置的云服务器,暴露在公网的第一天就会开始被扫。这不是"可能",是必然——任何开在公网 IP 上的机器,几小时内就会有扫描器敲遍常见端口。

下面是我自己会做的检查顺序,从最外层往内收。

一、安全组:只放必须的端口

云厂商的安全组是第一层,也是最容易被忘的一层——很多人只配了系统防火墙,忘了安全组同样开着口。

原则:

  • 只开放真的需要公网访问的端口(Web 的 80 / 443);
  • 管理类端口(SSH、面板、数据库)优先只对自己的固定 IP 开放;
  • 数据库尽量不放公网,走内网或云数据库。

从外网视角自查(在另一台机器上执行):

for p in 22 80 443 3306 6379 8888; do
  timeout 2 bash -c "echo >/dev/tcp/你的IP/$p" 2>/dev/null && echo "$p 开放" || echo "$p 关闭"
done

二、SSH:先改掉默认端口和密码登录

按收益排序,这三件事比任何花哨配置都有效:

  1. 禁用密码登录,只用密钥;
  2. 改掉默认的 22 端口,换成自己记得住的高位端口;
  3. 禁止 root 直接登录,用普通用户 + sudo。
# /etc/ssh/sshd_config
Port <你的高位端口>
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

⚠️ 改端口和禁密码之前,一定先确认密钥登录已经能通,并在另一个会话里保留一个已登录的连接不要断。改错了会把自己锁在外面,只能去云控制台用 VNC 救。

改完在新开的会话里验证成功,再关闭旧会话:

ssh -p <你的高位端口> 用户@你的IP

三、系统防火墙:别只依赖安全组

安全组和系统防火墙是两层,关系是"与":两边都放行才通。所以系统防火墙可以配得更严。

firewall-cmd --list-all
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

如果安全组里已经做了 IP 白名单,系统防火墙也照做:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的固定IP/32" port port="<高位端口>" protocol="tcp" accept'
firewall-cmd --reload

四、fail2ban:让暴力破解付出代价

改端口只是减少噪音;真被打的时候要靠自动封禁。装好之后必须验证它真的在封,否则就是个摆设:

fail2ban-client status sshd      # 当前封了哪些、列表里有没有 IP
fail2ban-client status           # jail 列表是否都起来了

这里有个大坑:在某些防火墙后端(例如 nftables)下,使用 ipset 类的 action 会出现"看起来封了、实际一条规则都没生效"——jail 状态显示已封禁,但 firewall-cmd --list-rich-rules 里空空如也。判断方法是去防火墙里数实际规则条数,而不是看 fail2ban 的自我报告。

五、最后:把"能进这台机器"的路数清楚

配置做完了,回头确认到底有几条路能进来:

  • 云控制台的 VNC / 远程连接(这是最后的保险,别关);
  • SSH 密钥;
  • 面板。

任何"忘了还开着"的入口——临时开的端口、测试用的账号、遗留的 FTP——都是风险。


一句话总结:安全组、SSH、系统防火墙、fail2ban 四层,按"从外到内、先收面再防点"的顺序做。改 SSH 前先确保有退路;配完 fail2ban 一定要去防火墙里数规则,别只看它自己的状态输出。