VPS 安全加固实战总结
起因
VPS 遭遇 DDoS 攻击,IP 被黑洞路由 15 分钟。排查后发现多个安全隐患。
问题一:端口暴露过多
发现:
ss -tlnpMySQL 3306 对公网开放,代理端口直接暴露。
修复:
- Docker 服务只绑定 127.0.0.1
- 同一 Docker network 内的容器通信不需要暴露端口
- 启用 ufw,只放行必要端口
问题二:SSH 直接暴露
方案:Cloudflare Tunnel
原理:VPS 主动向外建立隧道,外部无法直接访问任何端口。
本地 → Cloudflare 网络 → VPS(主动连出的隧道)配置完成后:
- SSH 只监听 127.0.0.1
- 关闭 SSH 端口的防火墙规则
- 通过
cloudflared access ssh连接
逃生通道:VPS 控制台的 VNC/Serial Console,与 SSH 完全独立。
问题三:代理协议过时
原方案 Trojan 问题:
- 项目停止维护(2020)
- 需要单独暴露端口
- 不支持 WebSocket,无法套 CDN
升级为 VLESS + Reality:
优势:
- 不需要域名和证书
- 伪装成访问正规大站,无法识别
- 可与 Web 服务共用 443 端口(fallback 机制)
架构:
外部 443 → Xray
├─ VLESS 流量 → 代理出去
└─ 普通 HTTPS → 回落到 Web 服务问题四:真实 IP 泄露
检查方法:
curl -s "https://api.hackertarget.com/hostsearch/?q=你的域名"历史 DNS 记录会被收录,一旦泄露无法撤回。
教训:
- 新域名/新 IP 从第一秒起开启 Cloudflare 代理
- 子域名命名避免暴露用途(不要用 vpn、proxy、trojan 等)
- VLESS 客户端直接填 IP,不走域名
关于 Null Route
廉价 VPS 的 DDoS 防护机制:检测到异常流量后,将 IP 路由到黑洞。
副作用: 攻击者只需小流量触发阈值,就能让服务中断 15 分钟。
应对: 隐藏真实 IP 比硬扛更重要。
最终架构
| 服务 | 访问方式 |
|---|---|
| Web | Cloudflare 代理 → Xray 回落 → Docker |
| SSH | Cloudflare Tunnel |
| 代理 | VLESS + Reality(直连 IP) |
| 数据库 | 仅本地 |
对外只暴露 80/443,且:
- 禁用 ping 响应
- Web 流量有 Cloudflare 保护
- 代理流量伪装成正常 HTTPS
扫描者只能看到一个普通网站。
检查清单
# 查看监听端口
ss -tlnp
# 查看防火墙状态
sudo ufw status
# 检查 IP 是否泄露
curl -s "https://api.hackertarget.com/hostsearch/?q=你的域名"
# 禁用 ping
sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1