互动
最近评论
标签
寻找感兴趣的领域
cover

VPS-Web 安全加固指南:从裸奔到固若金汤

本文记录了在一台 VPS 上同时部署 X-UI 面板、各类 Web 应用(导航页/订阅管理)以及 Typecho 博客,并实现“节点直连速度”“管理后台绝对安全”完美共存的完整过程。

🎯 核心目标:
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 + 域名 才能访问后台;节点连接不受影响。这是一套非常完美的生产环境配置。
原创 VPS-Web 安全加固指南:从裸奔到固若金汤
VPS-Web 安全加固指南:从裸奔到固若金汤
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 柯舟听风

你好啊!我是
柯舟听风
分享科技生活