去年帮一个做站群的朋友接手了8台刚买回来的云服务器,上线第一天没做任何安全配置就跑起来了。第三天他截了张SSH日志图发过来——/var/log/auth.log里密密麻麻的"Failed password for root",来自越南、俄罗斯、印度、美国的IP轮着试密码,不到72小时被扫描了1400多次,其中800多次是SSH暴力破解。万幸密码够长没被破开,但这件事让他后背发凉。
服务器安全设置不是什么高深的运维玄学。很多人觉得"我又没得罪谁,谁会来黑我",这个想法在2026年的互联网上相当于把家门钥匙插在锁孔里然后出国度假。攻击者不针对你,他们在全球IP段地毯式扫描,谁的服务器安全防护弱,谁就是下一个肉鸡。以下8项安全设置,按照"上线即做"的优先级排列,每一项配具体命令和原理说明。
8项安全设置优先级排序
| 1 | 修改SSH默认22端口 —— 过滤掉99%的自动化扫描 |
| 2 | 禁用root远程登录 + 创建普通用户sudo提权 |
| 3 | SSH密钥认证替代密码登录 —— 彻底消除暴力破解可能 |
| 4 | UFW防火墙 —— 白名单模式,只开放业务必需的端口 |
| 5 | Fail2Ban自动封禁 —— 多次失败尝试自动拉黑IP |
| 6 | 自动安全更新 —— unattended-upgrades静默打补丁 |
| 7 | 关闭不必要的服务和端口 —— 减少攻击面 |
| 8 | 日志监控与入侵检测 —— rkhunter + 定期审计 |
绿色 = 立即生效,防99%攻击 | 黄色 = 配置后生效,防残余攻击 | 红色 = 持续运行,防内部渗透
一、改SSH端口,挡住99%的自动化扫描

全球有几十万台被感染的主机在不停地扫描公网IP的22端口。它们不是针对你,而是对所有能访问到的IP逐一试探。只要你的SSH开在22端口、允许密码登录,你的服务器就在这几十万扫描器的"待爆破清单"里。改端口不能防专业渗透,但能过滤掉几乎所有自动化批量扫描。
# 编辑SSH配置文件sudo vim /etc/ssh/sshd_config# 找到 #Port 22,改为(端口号建议在1024-65535之间,避开常用端口):Port 22987# 保存退出后重启SSH服务sudo systemctl restart sshd# 在防火墙中开放新端口(重要!先开放再禁用旧端口)sudo ufw allow 22987/tcp关键提醒:修改SSH端口之前,一定先确认新端口在防火墙中已开放,并且在云服务商的安全组/防火墙规则中也放行了。否则改完端口重启SSH后,你会发现自己连不上服务器了——只能通过VNC控制台紧急恢复。
选端口号时避开常见替代端口(2222、22222、5555等),这些端口同样在扫描器的字典里。用一个五位数的随机端口,和任何已知服务端口都不冲突的。
二、禁root登录+创建普通用户,暴力破解的第二道门
root是Linux系统的超级管理员账户,所有自动化扫描工具的第一件事就是用root+常见密码组合尝试登录。因为你没法给root改名,所以攻击者永远知道用户名是root,只需要试密码。而普通用户——攻击者连用户名都不知道,暴力破解的成本会指数级上升。
# 创建新用户(用户名不要用admin、deploy、webmaster等常见词)sudo adduser zhang_ops# 将新用户加入sudo组sudo usermod -aG sudo zhang_ops# 测试新用户能否sudosu - zhang_opssudo whoami # 应返回 root# 编辑SSH配置,禁用root登录sudo vim /etc/ssh/sshd_config# 找到 PermitRootLogin,改为:PermitRootLogin no# 重启SSHsudo systemctl restart sshd操作顺序:先创建普通用户并确认能用sudo,再禁用root登录。千万不要反过来——先把root禁了然后发现自己没别的用户可用。
三、SSH密钥认证,密码登录的死穴彻底堵上
密码登录有两个致命弱点:一是密码可以被猜(暴力破解),二是密码可以被键盘记录器截获。SSH密钥对(公钥+私钥)解决了这两个问题——私钥是一个2048位或4096位的随机数,暴力破解需要的时间是天文数字。即使攻击者拿到了你的密码,没有私钥文件也登不进去。
# === 在本地电脑上生成密钥对 ===ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_server_key# 会生成两个文件:# my_server_key → 私钥(绝对不要发给任何人!)# my_server_key.pub → 公钥(放到服务器上)# === 把公钥传到服务器 ===ssh-copy-id -i ~/.ssh/my_server_key.pub -p 22987 zhang_ops@你的服务器IP# === 在服务器上禁用密码登录 ===sudo vim /etc/ssh/sshd_config# 找到 PasswordAuthentication,改为:PasswordAuthentication no# 同时确保密钥认证开启:PubkeyAuthentication yes# 重启SSHsudo systemctl restart sshd私有密钥文件的安全等于服务器安全。私钥泄露 = 服务器被控。把私钥文件放在本地加密磁盘上,不要上传到云盘、不要发微信、不要存Git仓库。建议用密码保护私钥文件(生成密钥时设置passphrase)。
做完这三步(改端口+禁root+密钥登录),你的SSH服务已经免疫了所有暴力破解。日志里的"Failed password"会从一天几百条变成零。
四、UFW防火墙白名单,只留业务需要的口子
防火墙的策略分两种:黑名单(默认允许,封禁特定IP/端口)和白名单(默认拒绝,只开放必要端口)。服务器安全用白名单——你不知道攻击者会从哪个端口进来,但你知道自己只需要哪几个端口。
# 启用UFW并设置默认策略sudo ufw default deny incoming # 默认拒绝所有入站sudo ufw default allow outgoing # 默认允许所有出站# 只开放业务必需的端口sudo ufw allow 22987/tcp # SSH(已修改的端口)sudo ufw allow 80/tcp # HTTPsudo ufw allow 443/tcp # HTTPS# 如果有MySQL,限制只允许本地访问sudo ufw allow from 127.0.0.1 to any port 3306# 启用防火墙sudo ufw enable# 查看规则sudo ufw status numbered一个Web服务器真正需要对外开放的端口只有三个:SSH端口、80和443。像MySQL(3306)、Redis(6379)、MongoDB(27017)这些数据库端口绝对不要对公网开放,它们应该只监听127.0.0.1。Redis未授权访问导致的服务器被黑案例,2025-2026年仍然高频发生。

| 服务 | 默认端口 | 是否对公网开放 | 说明 |
|---|---|---|---|
| SSH | 22(建议改) | 是 | 改为随机端口+密钥认证 |
| HTTP/HTTPS | 80/443 | 是 | Web服务必需 |
| MySQL | 3306 | 绝对不要 | 只绑定127.0.0.1,或通过SSH隧道访问 |
| Redis | 6379 | 绝对不要 | 必须设置密码 + bind 127.0.0.1 |
| MongoDB | 27017 | 绝对不要 | 必须开启认证 + bind 127.0.0.1 |
| phpMyAdmin | 随Web端口 | 建议限制IP | 用.htaccess或Nginx限制访问IP |
五、Fail2Ban自动封禁,被盯上时自动还手
改了端口+禁了密码登录之后,理论上暴力破解已经无效了。但Fail2Ban仍然值得装——它不光防SSH,还监控Nginx、Apache、MySQL、Postfix等服务的失败日志,一旦某个IP在短时间内触发多次失败(比如反复尝试访问不存在的URL、反复输错数据库密码),自动在防火墙层面封禁这个IP一段时间。
# 安装Fail2Bansudo apt update && sudo apt install fail2ban -y# 复制一份本地配置(不要直接改默认配置)sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# 编辑本地配置sudo vim /etc/fail2ban/jail.local# 关键配置项:[DEFAULT]bantime = 3600 # 封禁1小时findtime = 600 # 10分钟内的失败次数maxretry = 3 # 允许3次失败[sshd]enabled = trueport = 22987 # 改为你的SSH端口# 启动并设置开机自启sudo systemctl enable fail2bansudo systemctl start fail2ban# 查看封禁状态sudo fail2ban-client status sshdsudo fail2ban-client banned # 列出所有被封IPFail2Ban的防护范围可以扩展到Web服务:写一个Nginx jail,监控返回404、403、500等错误码频率异常的IP——这些往往是扫描器在探测网站漏洞。一旦触发阈值,自动封IP。
六、自动安全更新,漏洞出现当天就补上
2025-2026年公开的Linux内核漏洞和常见服务漏洞有几十个,其中相当一部分是远程代码执行级别的。如果靠人工关注安全公告然后手动打补丁,从漏洞公布到你更新系统,中间可能隔了几周——这段时间你的服务器就暴露在已知漏洞下。
Ubuntu/Debian系统的unattended-upgrades工具可以每天自动检查并安装安全更新,不需要人工干预。它只安装安全补丁,不会升级大版本,不用担心把系统搞坏。
# 安装unattended-upgradessudo apt update && sudo apt install unattended-upgrades -y# 启用自动更新(交互式,选"是")sudo dpkg-reconfigure --priority=low unattended-upgrades# 手动配置(可选,更精细的控制)sudo vim /etc/apt/apt.conf.d/50unattended-upgrades# 确保以下行未被注释:Unattended-Upgrade::Allowed-Origins {"${distro_id}:${distro_codename}";"${distro_id}:${distro_codename}-security";"${distro_id}ESM:${distro_codename}";};# 可选:自动清理不再需要的依赖Unattended-Upgrade::Remove-Unused-Dependencies "true";# 查看自动更新日志tail -f /var/log/unattended-upgrades/unattended-upgrades.log站群场景的额外考量:多台服务器不要同时设置相同的自动更新时间窗口。如果10台服务器都在凌晨3点同时拉取安全更新,可能导致短暂的性能波动。把每台服务器的更新检查时间错开15-30分钟。
七、关掉不用的服务,攻击面越小越安全
Linux服务器默认安装了很多你可能根本用不到的服务,每一个都在监听某个端口,每一个都是潜在的攻击入口。拿到一台新服务器,第一件事不是装软件,而是看看有哪些服务在跑、哪些端口在监听、哪些可以关掉。
# 查看所有监听端口和服务sudo ss -tulnp# 查看所有运行中的服务sudo systemctl list-units --type=service --state=running# 禁用不需要的服务(举例)sudo systemctl disable --now cups # 打印服务sudo systemctl disable --now avahi-daemon # 零配置网络sudo systemctl disable --now bluetooth # 蓝牙# 如果不需要邮件服务sudo systemctl disable --now postfixsudo systemctl disable --now sendmail# 再次检查端口,确认只有必需的端口在监听sudo ss -tulnp | grep LISTENWeb服务器上通常只需要SSH、Nginx/Apache、MySQL/MariaDB、PHP-FPM这几个服务在运行。其他所有服务——cups(打印)、avahi-daemon(网络发现)、bluetooth(蓝牙)——在服务器上没有任何存在的理由,关掉。
八、日志监控与入侵检测,确保前面的防线没被突破
前七项是"防",第八项是"查"——万一前面某道防线被突破了,你能不能第一时间发现。有两类工具配合使用:rkhunter扫描Rootkit,日志审计发现异常行为。
rkhunter(Rootkit Hunter)是一个轻量级的Rootkit扫描工具,检查系统文件是否被篡改、是否有隐藏进程、是否有已知的后门特征。

# 安装rkhuntersudo apt install rkhunter -y# 更新特征库sudo rkhunter --update# 执行扫描sudo rkhunter --check --skip-keypress# 设置每天自动扫描(添加到crontab)sudo crontab -e# 添加以下行(每天凌晨4点扫描):0 4 * * * /usr/bin/rkhunter --check --skip-keypress --cronjobSSH安全检查
· 端口已改为非默认端口
· root远程登录已禁用
· 密码认证已关闭,仅密钥登录
· DNS反向解析已禁用(UseDNS no)
防火墙检查
· UFW已启用,默认拒绝入站
· 仅开放SSH/80/443端口
· 数据库端口仅监听127.0.0.1
· 云服务商安全组规则已配置
持续防护检查
· Fail2Ban已运行并监控SSH+Nginx
· unattended-upgrades每日运行
· rkhunter每日扫描
· 多余服务已全部关闭
站群多服务器的安全配置怎么做
用UC建站系统做站群,每台服务器独立部署、独立IP、独立SSH密钥,天然隔离了单点被控后的横向扩散风险。多站看板统一监控各服务器的运行状态、端口监听情况和异常登录告警——哪台服务器被人尝试登录、哪个站点的防火墙出现了异常流量,看板上一眼可见。内容中台不直接暴露数据库端口,前端站点通过API调用内容数据,数据库层和Web层物理隔离,即使Web服务器被攻破也拿不到数据库的直接访问权限。
服务器安全设置这件事,成本不是钱,是时间。上面8项全做一遍,熟练的话一台服务器15分钟搞定。不做的成本是什么?某天早上起来发现数据库被删了、网站被挂了博彩页面、服务器变成了别人的挖矿机——恢复成本可能是几百倍的时间。安全设置是基础设施,上线当天就必须做完,别等出了问题再补救。
服务器的安全防线不需要花里胡哨,8件事做完,你的服务器在公网上就从一个"容易被盯上的目标"变成了"不值得浪费时间的目标"。攻击者永远选软柿子捏——你只要比周围90%的服务器更难攻破,他们就绕道去扫下一个IP了。每台新服务器上线,按这个顺序走一遍:改端口、禁root、上密钥、开防火墙、装Fail2Ban、配置自动更新、关多余服务、设日志监控。15分钟,换来的是一年不用半夜爬起来处理安全事件。
