服务器安全防护,从外到内分四层:
网络层 防火墙规则(iptables/nftables/ufw)、端口管理、DDoS高防IP、WAF Web应用防火墙。
系统层 SSH加固(改端口+密钥登录+禁root)、系统更新、用户权限管理、文件权限、内核参数调优。
应用层 Web服务安全配置(Nginx/Apache)、数据库安全、代码漏洞扫描、HTTPS证书、CSP策略。
监控层 入侵检测(fail2ban)、日志审计、主机安全Agent、异常登录告警、文件完整性监控。
第一步:SSH加固,挡住90%的攻击入口
一台公网服务器最薄弱的环节就是SSH。黑客扫描到22端口开放,用字典暴力破解root密码,一旦攻破就拿到了服务器的完全控制权。以下六步SSH加固是服务器上线的第一件事:
| 操作 | 命令/配置 | 效果 | 优先级 |
|---|---|---|---|
| 改默认端口 | Port 22822(改/etc/ssh/sshd_config) | 躲过99%的自动扫描,攻击尝试从5000次/天降到个位数 | 最高 |
| 禁用root登录 | PermitRootLogin no | 即使密码泄露也拿不到root权限,需先登录普通用户再sudo | 最高 |
| 禁用密码登录 | PasswordAuthentication no | 只能用SSH密钥登录,暴力破解彻底失效 | 最高 |
| 限制登录用户 | AllowUsers youruser | 只允许指定用户通过SSH登录,缩小攻击面 | 高 |
| 限制连接频率 | MaxAuthTries 3 LoginGraceTime 30 | 最多尝试3次密码,30秒内未完成认证自动断开 | 中 |
| 关闭X11转发 | X11Forwarding no | 普通服务器不需要图形转发,关掉减少攻击面 | 中 |
改完之后用systemctl restart sshd重启SSH服务,不要关闭当前SSH连接,新开一个终端测试新端口和密钥能否正常登录。确认能登录之后再关闭旧连接。很多人改完配置重启SSH发现登不上去,只能去云控制台用VNC救急。

第二步:fail2ban自动封IP,把暴力破解者挡在门外
改端口能减少扫描量,但攻击者如果专门针对你的IP和端口,仍然可以暴力尝试。fail2ban的作用是监控日志,发现多次失败尝试后自动用iptables封禁该IP,几分钟到几小时内禁止访问。
# 安装fail2banapt install fail2ban -y # Debian/Ubuntuyum install fail2ban -y # CentOS/RHEL# 创建自定义配置(不要直接改jail.conf)cat > /etc/fail2ban/jail.local << 'EOF'[DEFAULT]# 封禁时间:1小时bantime = 3600# 查找时间窗口:10分钟内findtime = 600# 最大失败次数:5次maxretry = 5# 忽略本地IPignoreip = 127.0.0.1/8[sshd]enabled = trueport = 22822logpath = /var/log/auth.logmaxretry = 3bantime = 86400EOF# 启动fail2bansystemctl enable fail2ban --now# 查看SSH封禁状态fail2ban-client status sshd
fail2ban不只是保护SSH,还能保护Nginx、Apache、MySQL、Postfix等几乎所有服务。在jail.local里加上对应的配置段就能开启:
# 防Nginx 404扫描和恶意请求[nginx-http-auth]enabled = trueport = http,httpslogpath = /var/log/nginx/error.logmaxretry = 3# 防CC攻击(大量请求)[nginx-botsearch]enabled = trueport = http,httpslogpath = /var/log/nginx/access.logmaxretry = 2findtime = 60
第三步:防火墙最小化原则,只开放必须的端口
默认情况下服务器可能开着几十个端口,每一个都是潜在的攻击入口。最小化原则:只开放业务必需的端口,其余全部关闭。
# ufw方式(Ubuntu/Debian最简单)ufw default deny incoming # 默认拒绝所有入站ufw default allow outgoing # 默认允许所有出站ufw allow 22822/tcp # SSH自定义端口ufw allow 80/tcp # HTTPufw allow 443/tcp # HTTPSufw enable # 启用防火墙ufw status verbose # 查看规则# iptables方式(更灵活但更复杂)iptables -A INPUT -p tcp --dport 22822 -j ACCEPTiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -j DROP# 保存规则iptables-save > /etc/iptables/rules.v4
一个常见的坑:在云服务器上配置iptables之前,先确认云服务商的安全组规则。腾讯云、阿里云都有独立的安全组防火墙,规则是叠加的——安全组放行+iptables放行才能通。很多人iptables配好了发现端口不通,排查半天发现是安全组没放行。
第四步:系统和软件持续更新,堵住已知漏洞
2025-2026年Linux系统重大漏洞频发,OpenSSH的regreSSHion漏洞(CVE-2024-6387)允许未经认证的远程代码执行,影响数百万台服务器。这类漏洞的修复方式只有一个:及时更新。

# 手动更新apt update && apt upgrade -y # Debian/Ubuntuyum update -y # CentOS/RHEL# 设置自动安全更新(推荐)apt install unattended-upgrades -ydpkg-reconfigure unattended-upgrades# 定期检查是否需要重启(内核更新后需要重启)ls /var/run/reboot-required
除了系统,Web应用和框架也必须保持更新。WordPress、Nginx、PHP、MySQL这些组件的漏洞是黑客最喜欢的入侵路径。WordPress一个过时插件的漏洞可能比SSH弱密码更容易被利用。
第五步:WAF和主机安全,云厂商的专业防护工具
上面的四步都是"自己能做"的基础安全配置。但如果业务对安全要求更高——比如做电商、金融、政务类网站——就需要专业的安全产品:
| 产品类型 | 代表产品 | 防护什么 | 价格 | 适合谁 |
|---|---|---|---|---|
| WAF Web应用防火墙 | 腾讯云WAF、阿里云WAF、雷池WAF、Cloudflare | SQL注入、XSS、CSRF、CC攻击、恶意爬虫、Webshell上传 | 免费版可用(雷池/Cloudflare),专业版¥2000+/月 | 所有有Web业务的服务器 |
| 主机安全 | 腾讯云CWP、阿里云安骑士 | 漏洞扫描、基线检查、入侵检测、木马查杀、异常登录告警 | 基础版免费,专业版¥60-100/月 | 所有服务器,强烈建议安装 |
| DDoS高防 | 腾讯云DDoS高防、阿里云DDoS防护 | 大流量DDoS攻击清洗、CC攻击防护 | ¥20800+/月起 | 高价值业务、容易被攻击的行业 |
| 堡垒机 | 齐治堡垒机、云堡垒机 | 统一管理服务器登录、操作审计、权限控制、录屏回放 | 云堡垒机¥2000+/月起 | 多人运维、等保合规需求 |
如果预算有限,Cloudflare免费版+雷池WAF社区版是不错的起步组合。Cloudflare的免费CDN自带基础DDoS防护和WAF规则,雷池WAF社区版部署在自己的服务器上,免费保护10个站点,覆盖SQL注入、XSS、文件上传等常见Web攻击。两者配合使用,能挡住90%以上的Web层攻击。
第六步:日志监控和告警,出了事第一时间知道
安全配置做得再好,也不能保证100%不被入侵。关键是被入侵了能第一时间发现,而不是几个月后才发现服务器在挖矿。
| 监控项 | 工具/方法 | 告警条件 |
|---|---|---|
| 异常登录 | lastb + fail2ban + 云主机安全Agent | 陌生IP登录、非工作时间登录、从境外IP登录 |
| 文件篡改 | aide / tripwire(文件完整性校验) | 关键系统文件(/etc/passwd、/bin/、/usr/bin/)被修改 |
| 资源异常 | htop + 云监控 + 自定义脚本 | CPU突然100%(挖矿特征)、网络流量异常飙升、磁盘突然写满 |
| Web攻击 | WAF日志 + Nginx错误日志 | 大量404请求(目录扫描)、SQL注入特征、Webshell访问 |
最简单的告警方案:写一个Shell脚本放到crontab里,每小时检查一次登录日志和系统负载,发现异常就发邮件或钉钉通知:
#!/bin/bash# 简易安全巡检脚本,放到crontab每小时跑一次# 1. 检查CPU负载(超过80%告警)LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)if [ "$LOAD" -gt "$(nproc)" ]; thenecho "[告警] CPU负载过高: $LOAD" >> /var/log/security-check.logfi# 2. 检查最近的SSH失败登录FAILED=$(grep "Failed password" /var/log/auth.log | wc -l)if [ "$FAILED" -gt 100 ]; thenecho "[告警] SSH失败登录过多: $FAILED 次" >> /var/log/security-check.logfi# 3. 检查异常进程(常见的挖矿程序名)MINERS=$(ps aux | grep -iE "xmrig|minerd|cpuminer|stratum" | grep -v grep | wc -l)if [ "$MINERS" -gt 0 ]; thenecho "[严重告警] 发现疑似挖矿进程!" >> /var/log/security-check.logfi免费工具组合方案,按预算和规模选
| 方案 | 组件 | 月费 | 适合谁 |
|---|---|---|---|
| 个人站长基础版 | SSH加固 + fail2ban + ufw + Cloudflare免费版 + 云厂商免费主机安全 | ¥0 | 1-5台服务器,个人博客/企业站 |
| 中小企业进阶版 | 基础版 + 雷池WAF + 云厂商专业版主机安全 + 定期漏洞扫描 | ¥100-500/月 | 10-50台,电商/教育/金融 |
| 高价值业务完整版 | 进阶版 + 商业WAF + DDoS高防 + 堡垒机 + 日志审计 + 渗透测试 | ¥3000+/月 | 大型电商/金融/政务/游戏 |
服务器安全不是一个"装完就完事"的任务,而是一个持续的过程。花了半小时做完SSH加固+防火墙+fail2ban,基础防线就算搭好了。之后每个月做的事就三件:看一眼安全日志有没有异常、更新系统补丁、检查一下新装的软件有没有开不必要的端口。这三件事加起来每个月花不了半小时,但能让服务器从"上线72小时被黑"变成"连续跑一年不出事"。安全这件事,投入的时间和被黑之后的修复时间,差了至少100倍。
