在个人服务器上搭建网站,对于计划长期运行的站点,有一个问题是必须要考虑的,那就是站点的安全问题。这里介绍一些基本的防护手段。防护的核心原则是:在保持服务可访问的前提下,最大限度地缩小攻击面,并建立多层防御。
1. 核心端口功能与风险
通常 Web 服务器会开放 22/80/443 这三个端口,我们了解下每个端口的主要风险点:
- 22 (SSH):管理的大门。主要风险是暴力破解和弱口令。一旦被攻破,服务器就易主了;
- 80/443 (Web):服务的脸面。主要风险是Web应用漏洞(如SQL注入)、DDoS攻击和CC攻击;
- 所有端口:都存在基于软件漏洞的0-day攻击风险,以及系统配置不当带来的隐患;
2. 个人服务器分层防护
第一层:访问控制与最小化原则(最基础也最有效)
这部分是必须做的,能挡住绝大多数自动化攻击。
SSH 端口安全(关键!)
禁用密码登录,改用密钥对:这是最重要的一步。
密码很容易被暴力破解,而密钥对几乎无法被暴力枚举。
操作:修改
/etc/ssh/sshd_config,设置PasswordAuthentication no。更改默认端口(可选但推荐):
将 SSH 服务从默认端口 22 改为一个高位端口(如
2222)。这并不能防住定向攻击,但能瞬间避开 99% 的自动化扫描和攻击脚本。
操作:修改
/etc/ssh/sshd_config,设置Port 2222。安装 Fail2ban:这是一个必备工具。
它会监控 SSH 日志,当发现同一个 IP 多次登录失败后,自动将其加入防火墙黑名单一段时间,能有效遏制暴力破解。
配置:重点监控SSH服务,设置合适的
maxretry(重试次数)和bantime(封禁时间)。
防火墙配置
只开放必要端口:使用防火墙,只放行你需要对外提供的端口(80, 443, 22(或你修改后的 SSH 端口))。
通常,云服务提供商会提供默认的防火墙功能,通过云服务控制台即可完成配置。如果需要手动配置服务器防火墙(一般是
ufw或者firewalld),可以将默认策略配置为“DROP”,然后只放行需要对外提供的端口。命令示例(ufw):sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 2222/tcp # 假设SSH改到了2222端口 sudo ufw enable注意:优先选择云服务厂商提供的防火墙,而非 ufw,具体原因下面会提到。
注意 SYN flood 攻击
SYN Flood 是一种最常见的拒绝服务攻击(DoS/DDoS)方式。它利用 TCP 协议的三次握手漏洞,耗尽服务器 SYN 队列,导致服务器无法响应正常用户的连接请求。普通的、仅做静态包过滤的防火墙很难有效抵御 SYN Flood。对于个人站点,最直接且有效的应对方式是启用操作系统内核自带的 SYN Cookie 机制:
# 检查是否生效 ## 查看当前 SYN Cookie 状态 sysctl net.ipv4.tcp_syncookies ## 或者直接读取 proc 文件系统 cat /proc/sys/net/ipv4/tcp_syncookies ## 输出结果:0=关闭,1=开启,3=严格模式(通常也是开启) # 临时启用(立即生效,重启后失效) sudo sysctl -w net.ipv4.tcp_syncookies=1 # 永久启用(编辑配置文件) echo "net.ipv4.tcp_syncookies=1" | sudo tee -a /etc/sysctl.conf # 然后使配置生效 sudo sysctl -p除了 SYN Cookie,你还可以通过
iptables限制 SYN 包速率,或通过sysctl调整 SYN 队列大小net.ipv4.tcp_max_syn_backlog来增加系统的“韧性”。注意:ufw 开启可能会影响 SYN Cookie 机制。UFW 有自己的 sysctl 配置文件
/etc/ufw/sysctl.conf,当你启用 UFW 时,它会覆盖系统级的/etc/sysctl.conf设置。这就是为什么有些人发现“启用 UFW 后,内核开始报告 SYN flooding”的原因。实际情况取决于服务器的版本,可以通过以下命令检查:# 1. 查看当前 SYN Cookie 状态 sysctl net.ipv4.tcp_syncookies # 2. 查看 UFW 的 sysctl 配置 cat /etc/ufw/sysctl.conf | grep -i syncookies # 3. 查看系统级配置 cat /etc/sysctl.conf | grep -i syncookies cat /etc/sysctl.d/*.conf | grep -i syncookies 2>/dev/null
第二层:Web 服务加固与纵深防御
在第一层基础上,再增加几道防线,应对更复杂的攻击。
Web 服务防护
- 利用 Cloudflare 作为前置防火墙:将域名的 DNS 解析托管给 Cloudflare,它提供免费的 DDoS 防护和 Web 应用防火墙(WAF)。
- 配置 Web 服务的访问日志:Web 服务默认会记录访问日志。结合 GoAccess 等日志分析工具,可以实时分析流量,发现异常模式(如特定URL被大量请求)。
- 文件权限:确保 Web 服务运行用户(如
caddy)对网站根目录仅有读取和执行权限,无写入权限。这能有效防止网站被篡改。
系统自动更新
开启操作系统的安全更新自动安装,及时修补已知漏洞。
操作:在Ubuntu上,
dpkg-reconfigure -plow unattended-upgrades。
第三层:监控与告警
通过配置监控与告警,让系统自动通知你异常情况。
- 配置关键监控
- SSH 登录告警:配置 Linux 的
pam_tty_audit或编写简单的脚本,当有用户通过 SSH 成功登录时,向你的 Telegram、钉钉或企业微信机器人发送消息通知。这样如果有人进了你的服务器,你能第一时间知道。 - 端口状态监控:使用像 Prometheus + Node Exporter 这样的监控系统,或更简单的 Uptime Kuma,监控服务器状态和端口存活情况。一旦网站宕机,立刻通过邮件或App通知你。
- SSH 登录告警:配置 Linux 的
3. 总结与行动清单
对于新创建的站点,不需要一步到位,可以按优先级来:
立即执行:
- 禁用SSH密码登录,启用密钥对。
- 配置防火墙,只放行必要的端口(80, 443, 你的SSH端口)。
- 将域名接入 Cloudflare 隐藏真实IP并获得基础防护。
短期完成:
- 安装并配置
Fail2ban,为 SSH 和 Web 服务提供暴力破解防护。 - 配置系统自动安全更新。
- 确认 Web 服务运行用户权限正确(只读)。
- 安装并配置
长期优化:
- 配置 SSH 登录告警通知。
- 搭建一个简单的监控工具(如Uptime Kuma)监控网站可用性。
最关键的是从禁用 SSH 密码登录和配置防火墙开始。