返回博客

10 服务器安全加固:别让你的服务器裸奔,5 步搞定基础防护

10 服务器安全加固:别让你的服务器裸奔,5 步搞定基础防护

导语:新买的服务器,默认状态等于"裸奔"——门没锁、钥匙人人能配。5 步基础防护,30 分钟做完,安稳一整年。

上一篇文章我们给服务器配了安全组,但很多新手会问:"安全组配了,系统防火墙还要配吗?这俩到底啥关系?" 还有更隐蔽的一层——数据库端口,大多数人部署完网站就忘了它,等于把保险柜敞着门。

这篇把三件事讲透:5 步防护清单、安全组和防火墙的区别、数据库端口怎么守住。

一、先看清:你的服务器现在有多危险

刚买的新服务器,默认状态是这样的:

默认状态 意味着什么
root 账号允许密码登录 等于把大门钥匙挂在门口
SSH 端口 22 对外开放 全网扫描器 24 小时在试密码
防火墙没配 所有端口对所有 IP 敞开
数据库端口裸奔 数据库(如 3306)全网可连、弱口令可猜
系统补丁没人更新 已知漏洞无人修补

经验:网上有大量自动扫描程序,买下服务器几分钟内就会被扫到并开始被尝试登录。这不是你"被针对",是所有公网 IP 的日常——所以防护不是可选项,是基础配置。

二、第 1 步:禁用 root 密码登录,改用 SSH 密钥

为什么:密码可以被猜,密钥几乎不可能被猜。密钥是"指纹锁",别人捡到密码也没用。

做什么(三小步):

  1. 在你自己的电脑上生成密钥:
ssh-keygen -t ed25519

一路回车,会生成一对钥匙:公钥(给别人)和私钥(自己留好)。

  1. 把公钥拷到服务器:
ssh-copy-id root@你的服务器IP

这条命令会要你输一次密码,之后服务器就认识你的"指纹"了。

  1. 在服务器上关掉密码登录:
sudo nano /etc/ssh/sshd_config

找到两行改成:PermitRootLogin no(root 不允许密码登录)、PasswordAuthentication no(所有账号都关密码),保存后重启服务:

sudo systemctl restart ssh

经验:第 3 步之前,先新开一个终端窗口,用密钥重新登录一次——确认密钥能登录,再关密码登录。不然密钥没配好就把密码关了,你只能去控制台重置。

三、第 2 步:改 SSH 默认端口

为什么:全网扫描器只盯着常见端口(22 是头号目标)。把 SSH 挪到别的端口,等于把门牌号换了,扫描器找不到你。

做什么:在刚才那个配置文件里,把 #Port 22 改成 Port 2222(或你喜欢的任意高端口),保存重启。

经验:改端口和配防火墙的顺序不能反——先在防火墙放行新端口,再改配置重启。顺序反了,新端口被防火墙挡着,旧端口又关了,你直接进不了服务器。真进不去了,用云厂商控制台的网页终端(VNC)救。

四、第 3 步:配防火墙——先搞懂安全组和它的关系

这是新手最容易懵的地方:"云厂商的安全组,和服务器里的防火墙(ufw),不是一回事吗?" 不是。它们是一道门的两道锁,缺一不可。

对比 安全组(云厂商) 系统防火墙(ufw/iptables)
在哪一层 服务器外面,云厂商网络层 服务器里面,操作系统层
谁在管 云厂商控制台网页配置 服务器上命令行配置
生效方式 改完立即生效,不用重启 改完立即生效(服务级)
比喻 小区门口的门卫 你家门上的锁
特点 拦"进小区的人",看得见、好排查 拦"到你家门口的人",更细、可控进程

流量是怎么过的:访问请求先到安全组(门卫点头放行)→ 进到服务器系统 → 再被系统防火墙检查(锁认不认这把钥匙)→ 最后才到你的程序。两层都放行,请求才进得来。

所以正确姿势是两层都配:

  • 安全组:放行 22/80/443 等必要端口(上篇文章讲过)。
  • 系统防火墙(Ubuntu 用 ufw):
sudo ufw allow 2222/tcp    # 放行你的新 SSH 端口
sudo ufw allow 80/tcp      # 放行网页
sudo ufw allow 443/tcp     # 放行 HTTPS
sudo ufw enable            # 开启防火墙

三个高频坑:

  • 只配了一层:以为安全组放行了就万事大吉,结果系统防火墙默认全拒,网站还是打不开——排查半天才发现是 ufw 没配。
  • 配了 ufw 忘了开服务:ufw enable 之后新开服务(比如数据库),记得回来放行对应端口,不然"服务起来了但外面连不上"。
  • 把两层混为一谈:安全组在云控制台改,ufw 在服务器上改,别在网页上找不到设置就以为"没有防火墙"。

五、第 4 步:装 fail2ban,防暴力破解

为什么:就算关了密码登录,其它服务(比如网站后台)可能还有登录接口。fail2ban 像一个"记仇的门卫":谁连续登录失败,直接拉黑它的 IP 一段时间。

做什么:

sudo apt install fail2ban
sudo systemctl enable fail2ban

默认配置已经保护 SSH,够用。

经验:fail2ban 默认"连续失败几次就 ban"——你自己输错密码太多次,也会被自己的服务器 ban 掉。被 ban 了不用慌,等几分钟自动解封,或者把家里宽带 IP 加进白名单(配置文件里 ignoreip)。

六、第 5 步:定期更新补丁

为什么:系统漏洞一直在被修补,不更新等于"带着已知的洞裸奔"。大部分入侵,靠的就是没打补丁的旧系统。

做什么:

sudo apt update && sudo apt upgrade -y

想更省心,装自动更新:

sudo apt install unattended-upgrades

经验:别攒着半年更新一次——安全补丁有时效,晚一天就是多暴露一天。设个习惯:每周看一次系统更新(或者开自动更新,每月手动检查一次)。

七、数据库端口:最容易裸奔的"保险柜"

网站部署完,大多数人会漏掉这一层:数据库还开着大门。

默认状态有多危险:MySQL(端口 3306)、Redis(端口 6379)安装后默认监听所有网卡——全网任何 IP 都能试着连。扫描器扫到开放端口,就开始猜弱口令(root/123456 这种),猜中就拖库。数据库一旦被拖走,你网站的全部数据就没了。

怎么判断自己有没有裸奔:登录服务器跑一条命令看端口监听:

ss -tlnp

看到 0.0.0.0:3306 或 *:3306,就是"对所有 IP 开放",需要处理。

三层防护,从紧到松:

层级 做法 效果
1. 限制来源 防火墙/安全组:数据库端口只允许"服务器内网 IP"或"你的固定 IP" 别人根本连不上
2. 改默认端口 把 3306 改成不常见的端口 减少被扫描命中的概率
3. SSH 隧道访问 本地开发时通过 SSH 隧道连数据库,不开放数据库端口 最安全,端口对外完全关闭

经验:

  • Redis 比 MySQL 更危险:Redis 默认无密码,配置不当可以直接写服务器文件,等于送人一把万能钥匙。Redis 务必设密码,且绝不监听公网。
  • 别用 root 跑数据库:给数据库建独立账号,权限最小化——即使被攻破,损失也有限。
  • "改端口"只是拖延不是防护:真正拦住人的是"限制来源"和"SSH 隧道"这两层,别指望改个端口就高枕无忧。
  • SSH 隧道是"数据库端口完全关闭"也能安全访问的方法,下一篇《常用客户端工具》会详细讲怎么配。

八、三条救命经验(先看这条再动手)

  1. 改任何 SSH 配置前,先开一个新终端测试登录:密钥能进、新端口能连,再关旧通道。顺序错了最多就一次进不去的教训。
  2. 防火墙永远"先放行再关闭":改端口、开新服务都按这个顺序,不然把自己锁外面。
  3. 所有操作问 AI 之前,先告诉它你的系统版本:cat /etc/os-release 看一眼,命令适配你的系统,别照抄别家的。

总结

  • 新服务器默认=裸奔:root 密码登录、端口全开、数据库裸奔、无防护,扫描器几分钟就找上门。
  • 5 步防护:SSH 密钥登录 → 改默认端口 → 安全组 + 系统防火墙(两道锁都要配)→ fail2ban → 定期补丁。
  • 安全组是"小区门卫"(云厂商,外层),ufw 是"家门锁"(系统,内层),流量先过安全组再过防火墙,两层都放行才进得来。
  • 数据库端口是最常被漏的保险柜:默认 0.0.0.0 监听 = 全网可连;用"限制来源 + 改端口 + SSH 隧道"三层守住,Redis 务必设密码。
  • 核心纪律:先放行再关闭、先测试再切换;命令让 AI 生成,但每步在做什么、为什么,你要能说出来。

10 分钟小任务:登录你的服务器,跑 ss -tlnp 看看哪些端口对外开着——重点找有没有 0.0.0.0:3306(MySQL)或 6379(Redis);再跑 sudo grep "Failed password" /var/log/auth.log | tail -20 看看有没有人试图登录过。然后按清单从第 1 步开始做。下一篇,我们讲讲连服务器、数据库的客户端工具,以及 SSH 隧道怎么用。

下一篇:常用客户端工具:SSH、数据库、Redis 客户端,小白装哪几个就够。