VPS-Web 安全加固指南:从裸奔到固若金汤
本文记录了在一台 VPS 上同时部署 X-UI 面板、各类 Web 应用(导航页/订阅管理)以及 Typecho 博客,并实现“节点直连速度”与“管理后台绝对安全”完美共存的完整过程。
🎯 核心目标:
1. 节点流量: 直连 VPS(保留 IP 暴露),保证科学上网速度。
2. 管理面板: 全部通过 Cloudflare CDN + Nginx 反代,隐藏真实端口,只有通过域名才能访问。
3. 防火墙: 封死所有管理端口,只允许 Nginx 内部访问,杜绝黑客直接扫描 IP 爆破。
1. 节点流量: 直连 VPS(保留 IP 暴露),保证科学上网速度。
2. 管理面板: 全部通过 Cloudflare CDN + Nginx 反代,隐藏真实端口,只有通过域名才能访问。
3. 防火墙: 封死所有管理端口,只允许 Nginx 内部访问,杜绝黑客直接扫描 IP 爆破。
第一部分:Cloudflare 域名解析策略
为了实现“速度与安全分离”,我们需要将域名功能拆分:
- 节点专用域名(如
tk66): ❌ 关闭小黄云(DNS Only)。这是为了节点能直连,虽然会暴露 IP,但必须这么做。 - 管理专用域名(如
box,blog): ✅ 开启小黄云(Proxied)。所有 Web 访问走 CDN 保护。
⚠️ 关键设置: 在 Cloudflare 后台 -> SSL/TLS,将模式设置为 Full (Strict) 或 Full,否则 Nginx 反代 HTTPS 时会报 502 错误。
第二部分:Nginx Proxy Manager (NPM) 配置
我们使用 NPM 来统管所有 Web 服务的反向代理。这里有一个巨大的坑:Docker 网络通信问题。
1. 寻找 Docker 网关 IP
在 NPM(容器内)填反代地址时,千万不要填 127.0.0.1,也不要填公网 IP。要填 Docker 宿主机的网关 IP。
# 在 SSH 查看 docker0 的 IP
ifconfig docker0
# 通常是 172.17.0.1
2. 添加反向代理规则
以 X-UI 面板为例(假设原端口 5886):
- Domain Names:
box.你的域名.com - Scheme:
https(如果面板本身有 SSL) 或http - Forward Hostname / IP:
172.17.0.1(关键!) - Forward Port:
5886 - Websockets Support: 开启
3. 解决 502 Bad Gateway (高级技巧)
如果面板用的是自签名证书,Nginx 会拒绝连接。需要在 NPM 的 Advanced 选项卡填入:
proxy_ssl_verify off;
proxy_ssl_server_name on;
第三部分:终极防火墙配置 (UFW + iptables)
这是最复杂也是最重要的一步。Docker 会自动修改 iptables 绕过 UFW,导致我们封锁端口失败。我们需要一套组合拳。
步骤 1:修复 UFW 与 Docker 的冲突
允许 UFW 转发 Docker 流量,否则开启防火墙后所有网站都会断连。
# 修改配置文件,将 DROP 改为 ACCEPT
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
# 重载配置
ufw reload
步骤 2:配置 UFW 基础规则
# 1. 恢复出厂设置 (清空旧规则)
echo "y" | ufw reset
# 2. 放行核心服务
ufw allow 22/tcp # SSH 端口,防失联
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# 3. 允许 Docker 内部通信 (让 Nginx 能连上所有容器)
ufw allow from 172.16.0.0/12 to any
# 4. 放行节点端口 (假设范围是 10000-65000)
ufw allow 10000:65000/tcp
ufw allow 10000:65000/udp
# 5. 启用防火墙
echo "y" | ufw enable
步骤 3:核弹级封锁 (iptables 手动补漏)
为了防止 IPv6 泄露或 Docker 特权绕过,我们需要手动把面板端口(如 5886)彻底焊死,只允许 Docker 内部访问。
# --- IPv4 规则 ---
# 1. 给 Docker/Nginx 开白名单 (插队到第一行)
iptables -I INPUT 1 -s 172.16.0.0/12 -p tcp --dport 5886 -j ACCEPT
# 2. 封死外部访问 (黑名单)
iptables -I INPUT 2 -p tcp --dport 5886 -j DROP
# --- IPv6 规则 (防止 IPv6 绕过) ---
# 3. 允许本地回环
ip6tables -I INPUT 1 -i lo -j ACCEPT
# 4. 封死 IPv6 访问
ip6tables -I INPUT 2 -p tcp --dport 5886 -j DROP
步骤 4:持久化保存规则
防止重启 VPS 后 iptables 规则丢失。
apt install iptables-persistent netfilter-persistent -y
netfilter-persistent save
第四部分:Docker 部署 Typecho 博客
最后,利用现有的环境快速搭建一个轻量级博客。
1. 创建 docker-compose.yml
version: '3'
services:
typecho:
image: joyqi/typecho:nightly-php7.4-apache
container_name: typecho
restart: always
ports:
- "8989:80"
environment:
- TIMEZONE=Asia/Shanghai
volumes:
- ./data:/app/usr
2. 启动与权限修复
# 启动容器
docker compose up -d
# 修复数据库权限 (重要!否则安装失败)
chmod -R 777 data
3. 上线
去 NPM 添加反代:http://172.17.0.1:8989,开启 SSL。访问域名即可开始安装。
🎉 总结:
现在的状态是:外部扫描 IP+端口 无法进入任何面板(被防火墙拦截);只有通过 Cloudflare + 域名 才能访问后台;节点连接不受影响。这是一套非常完美的生产环境配置。
现在的状态是:外部扫描 IP+端口 无法进入任何面板(被防火墙拦截);只有通过 Cloudflare + 域名 才能访问后台;节点连接不受影响。这是一套非常完美的生产环境配置。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 柯舟听风