Pangolin 零信任访问实施指南 (最佳实践)


Pangolin 零信任访问实施指南 (最佳实践)

本指南基于 fosrl/pangolin 官方文档及零信任最佳实践编写,旨在落实“方案一:全节点连接器模式”,将十余台 VPS 纳入统一的安全访问管理。

1. 架构规划

  • 控制平面 (Control Plane): 部署一台独立的 VPS 作为 Pangolin Server,负责身份认证、策略管理和 WireGuard 密钥分发。
  • 数据平面 (Data Plane): 在每一台业务 VPS 上部署 Pangolin Connector (Agent),建立到控制平面的加密隧道。
  • 访问平面 (Client): 运维人员使用 Pangolin Client (基于 WireGuard) 接入。

2. 环境准备

  • 控制端 VPS: 建议 1核 2G 内存以上,安装 Docker & Docker Compose。
  • 域名: 一个用于管理面板的域名 (如 vpn.example.com)。
  • 被管 VPS: 需支持安装 Docker (推荐) 或直接运行二进制文件。

3. 部署控制平面 (Pangolin Server)

官方推荐使用 Docker Compose 进行部署,这是维护成本最低的方式。

3.1 准备配置文件

在控制端 VPS 上创建目录 ~/pangolin 并创建 docker-compose.yml

version: '3.8'
services:
  pangolin:
    image: fosrl/pangolin:latest
    container_name: pangolin
    restart: always
    # 关键:开启特权模式以管理 WireGuard 网络接口
    privileged: true
    network_mode: host
    environment:
      # 替换为您的实际域名
      - PUBLIC_HOST=vpn.example.com
      # 设置初始管理员密码 (首次启动后建议修改)
      - ADMIN_PASSWORD=ChangeMe123!
      # WireGuard 监听端口 (默认 51820/udp)
      - WG_PORT=51820
      # 面板端口
      - PORT=8080
    volumes:
      - ./data:/data

3.2 启动服务

cd ~/pangolin
docker-compose up -d

3.3 初始化配置

  1. 访问 http://vpn.example.com:8080 (注意防火墙需放行 TCP 8080 和 UDP 51820)。
  2. 使用 admin 和环境变量中设置的密码登录。
  3. 安全加固:
    • 立即修改管理员密码。
    • (推荐) 配置 OIDC/SAML 对接公司现有的身份源 (如 Google Workspace, Okta, 或自建 Keycloak),实现单点登录。

4. 接入业务节点 (部署 Connectors)

针对您管理的十余台 VPS,我们需要逐一安装 Connector。

4.1 创建 Connector 令牌

  1. 在 Pangolin 管理面板,进入 NetworkConnectors 菜单。
  2. 点击 “Add Connector” (或 Add Site)。
  3. 命名建议使用主机名 (如 prod-db-01, dev-app-02) 以便于识别。
  4. 系统将生成一个 Join Token 或安装脚本。

4.2 在业务 VPS 上安装

登录每一台业务 VPS,执行安装命令。官方通常提供 Docker 方式,这是最干净的:

# 替换 <YOUR_JOIN_TOKEN> 和 <CONTROL_PLANE_IP>
docker run -d \
  --name pangolin-connector \
  --restart always \
  --privileged \
  --net=host \
  fosrl/pangolin:latest \
  agent --token <YOUR_JOIN_TOKEN> --server <CONTROL_PLANE_URL>

注意:Agent 模式启动后,该 VPS 会自动通过 WireGuard 隧道连接到控制平面。

4.3 验证连接

回到 Pangolin 管理面板,确认所有 Connector 状态变为 “Connected” (在线)。

5. 配置零信任 SSH 访问

这是本方案的核心:不通过公网 IP 直连 SSH,而是通过 Pangolin 隧道。

5.1 定义 SSH 资源

在管理面板中为每一台 VPS 添加资源:

  1. Resource Name: ssh-prod-db-01
  2. Connector: 选择对应的 prod-db-01 连接器。
  3. Network Address: 127.0.0.1:22
    • 解释:因为 Connector 运行在 VPS 本地,所以目标地址是 localhost 的 22 端口。
  4. Protocol: TCP

5.2 配置访问策略 (Policies)

  1. 进入 Policies 菜单。
  2. 创建策略 Allow-SSH-Admins
  3. Subject: 选择管理员用户组 (或特定用户)。
  4. Object: 选择上述创建的 SSH 资源。
  5. Action: Allow。

5.3 客户端连接测试

  1. 运维人员电脑安装 WireGuard 客户端或 Pangolin 专用客户端。
  2. 从管理面板获取个人连接配置 (Profile) 并导入。
  3. 连接成功后,Pangolin 通常会为资源分配一个虚拟 IP 或内部域名。
    • 例如:ssh-prod-db-01.pangolin.internal
  4. 使用 SSH 连接:
    ssh user@ssh-prod-db-01.pangolin.internal

6. 收尾与安全加固 (关键步骤)

在确认通过 Pangolin 可以成功连接所有 VPS 的 SSH 后,执行以下操作以闭环安全:

  1. 关闭公网 SSH 端口:

    • 配置 VPS 的防火墙 (ufw/iptables) 或云厂商的安全组。
    • 拒绝 所有来自公网的入站 TCP 22 流量。
    • 仅允许 UDP 51820 (如果 Connector 直连) 或完全关闭入站 (如果 Connector 是出站连接模式)。
    • 注意:保留云厂商提供的 VNC/Console 访问方式以防误操作导致“通过 VPN 也连不上”的死锁情况。
  2. 审计与监控:

    • 定期查看 Pangolin 面板的 Audit Logs,审查谁在何时访问了哪台服务器。

7. 应急预案

  • 控制平面故障: 如果 Pangolin Server 宕机,所有 SSH 将不可用。
    • 对策: 保持至少一台“逃生通道”服务器,其 SSH 端口仅对公司固定公网 IP 开放,不依赖 Pangolin,作为紧急入口。