企业运维中,堡垒机(Bastion Host)是保障服务器访问安全的核心组件。本文将简单剖析一下某企业级运维安全网关的技术原理,并分享一个实用的跨平台访问方案——如何在 Mac 上通过 Windows 上的堡垒机客户端访问堡垒机资源。
什么是运维安全网关
运维安全网关,也称为堡垒机,是一种集中管理和审计服务器访问的安全系统。它的核心功能包括:
- 统一身份认证:支持多因子认证(MFA)
- 访问控制:基于角色的权限管理
- 会话审计:记录所有操作命令和会话录像
- 协议支持:SSH、RDP、Telnet、数据库等多种协议
- 安全隧道:加密传输,隐藏真实服务器地址
传统架构中,运维人员直接连接生产服务器,存在诸多安全隐患:
运维人员 ──────> 生产服务器
缺乏审计
权限难控
账号分散引入堡垒机后的架构:
运维人员 ──> 堡垒机 ──> 生产服务器
统一认证
全程审计
细粒度授权客户端架构剖析
市面上主流的堡垒机客户端通常采用隧道代理的架构。以某企业级运维安全网关为例,其客户端安装目录结构非常典型:
C:\Program Files (x86)\Bastion Client\
├── jre/ # 内置 Java 运行环境
├── locale/ # 多语言资源
├── logging_conf.d/ # 日志配置
├── bh_am_pfe_launcher.exe # 启动器
├── bh_am_pfe_tunnel.exe # 安全隧道代理
├── bh_am_pfe_webbrowser.exe # 内嵌浏览器模块
├── bh_local.exe # 本地辅助组件
├── bhmp_open.exe # Bastion Helper/MP 组件
├── bhmp_oper.exe # 运营相关模块
├── bhmp_psm_entry.exe # PSM 入口模块
├── bh_player.jar # 会话录像播放器
├── AppFill.dll # AutoFill / 表单填充库
├── common.dll # 公共依赖库
├── dbvis.dll # 数据库可视化相关组件
├── FileZilla.dll # FTP 功能相关库
├── libiconv2.dll # 字符编码转换库
├── msvcp140.dll # VC++ 运行库
├── FFFTP.dll # FTP 相关组件
├── FlashFXP.dll # FlashFXP 工具库
├── OmniClientPlus.exe # 远程客户端辅助程序
├── Putty.dll # PuTTY 工具库
├── Putty.exe # SSH/Telnet 工具
├── Xftp.dll # Xftp 工具支持文件
├── Xshell.dll # Xshell 工具支持文件
├── Xshell.exe # Xshell 终端
├── libmysql.dll # MySQL 客户端依赖
├── kingbase8-8.6.0.jar # Kingbase 数据库依赖
├── kingbase8-8.2.0.jar # Kingbase 旧版本依赖
├── mysql.dll # 数据库连接库
├── SSMS.dll # SQL Server Management Studio 依赖
├── SQLDev.dll # Oracle SQL Developer 依赖
├── TSQLA.dll # T-SQL 相关模块
├── 4DOracle.dll # Oracle 相关组件
├── PLSQLDev.dll # PL/SQL Developer 依赖
├── unins000.exe # 卸载程序
└── unins000.dat # 卸载数据实际上,很多堡垒机厂商只提供 Windows 版客户端,这也是本文后面要解决的问题。
核心组件功能
1. 启动器(Launcher)
bh_am_pfe_launcher.exe 负责:
- 检查客户端版本更新
- 加载主程序和隧道模块
- 管理进程生命周期
2. 隧道代理(Tunnel)
bh_am_pfe_tunnel.exe 是最核心的组件,它实现了 本地端口转发机制:
本地工具 本地隧道 堡垒机 目标服务器
(putty) ──> 127.0.0.1:5339 ──> 加密通道 ──> 192.168.1.100:22这个设计有几个巧妙之处:
- 安全隔离:只监听
127.0.0.1(localhost),外部无法直接访问 - 动态端口:每个会话使用随机端口(如 5339、60012),减少端口冲突
- 透明代理:SSH/RDP 客户端无需感知堡垒机存在
- 加密传输:本地到堡垒机的流量全程加密
3. 浏览器模块(WebBrowser)
bh_am_pfe_webbrowser.exe 提供:
- 内嵌的 Web 控制台
- HTML5 会话终端
- 资源选择界面
隧道工作原理详解
让我们通过一个完整的 SSH 连接流程来理解隧道机制:
步骤 1:登录堡垒机
1. 连接企业 VPN
2. 打开浏览器访问堡垒机地址:https://bastion.company.com
3. 输入用户名/密码 + MFA 验证码
4. 进入堡垒机 Web 控制台步骤 2:选择目标服务器
在 Web 界面中选择要访问的服务器和协议(如 SSH、RDP)。
步骤 3:建立本地隧道
当点击"使用 PuTTY 连接"时,后台发生了这些事情:
sequenceDiagram
participant User as 用户
participant Web as Web控制台
participant Tunnel as 隧道进程
participant Bastion as 堡垒机
participant Server as 目标服务器
User->>Web: 点击"连接"
Web->>Tunnel: 启动隧道进程
Tunnel->>Tunnel: 监听 127.0.0.1:5339
Tunnel->>Bastion: 建立加密连接
Bastion->>Server: 转发到目标服务器
Tunnel-->>User: 返回本地端口号
User->>Tunnel: PuTTY 连接 127.0.0.1:5339
Tunnel->>Bastion: 转发 SSH 流量
Bastion->>Server: 转发 SSH 流量
步骤 4:验证隧道端口
可以通过 Windows 命令行查看隧道进程监听的端口:
C:\> netstat -ano | findstr LISTENING | findstr <PID>
TCP 127.0.0.1:5339 0.0.0.0:0 LISTENING 4596这里:
127.0.0.1:5339是本地监听地址4596是bh_am_pfe_tunnel.exe的进程 ID
步骤 5:客户端连接
PuTTY 实际连接的不是目标服务器的真实地址,而是本地隧道端口:
PuTTY 配置:
Host: 127.0.0.1
Port: 5339所有 SSH 流量会经过:
PuTTY → localhost:5339 → 加密隧道 → 堡垒机 → 解密转发 → 目标服务器跨平台访问方案:Mac 通过 Windows 访问
既然官方不提供 Mac 客户端,我们可以利用 端口转发 + 隧道暴露 的方式实现跨平台访问。
方案架构
Mac ──> Windows PC ──> 堡垒机 ──> 目标服务器
(端口转发) (隧道代理)核心思路:
- Windows 上的堡垒机客户端建立隧道(监听
127.0.0.1:5339) - 使用 GOST 将本地端口暴露为网络可访问端口
- Mac 通过 SSH 连接 Windows 的转发端口
工具准备
在 Windows 上安装 GOST(Go Simple Tunnel)。
实施步骤
1. 在 Windows 上建立堡垒机连接
正常流程登录堡垒机,选择目标服务器,点击"使用 PuTTY 连接"。
此时查看隧道端口:
C:\> tasklist | findstr bh_am_pfe_tunnel
bh_am_pfe_tunnel.exe 4596
C:\> netstat -ano | findstr 4596
TCP 127.0.0.1:5339 0.0.0.0:0 LISTENING 4596记住端口号(这里是 5339)。
2. 使用 GOST 暴露端口
在 Windows 上运行:
C:\Tools\gost> gost.exe -L tcp://:33818/127.0.0.1:5339这条命令的含义:
-L tcp://:33818:监听本机所有网卡的 33818 端口/127.0.0.1:5339:转发到本地的 5339 端口
现在端口映射关系是:
0.0.0.0:33818 ──> 127.0.0.1:5339 ──> 堡垒机隧道 ──> 目标服务器3. 在 Mac 上配置 SSH
假设 Windows 机器的 IP 是 192.168.15.134,在 Mac 上编辑 SSH 配置:
nano ~/.ssh/config添加以下内容:
Host bastion-via-windows
HostName 192.168.15.134
Port 33818
User root
# 如果目标服务器 SSH 版本较老,需要启用旧算法
KexAlgorithms +diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa4. 从 Mac 连接
现在可以直接连接:
ssh bastion-via-windows完整的连接链路是:
Mac SSH → Windows:33818 → Windows:5339 → 堡垒机 → 目标服务器SSH 兼容性问题处理
如果遇到以下错误:
Unable to negotiate with 192.168.15.134 port 33818: no matching key exchange method found.
Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1这是因为目标服务器使用的是旧版 SSH(如 OpenSSH 8.8 或更早),只支持 SHA1 算法,而新版 macOS 的 OpenSSH 9.9 默认禁用了这些算法。
解决方法是在 SSH 配置中显式启用:
KexAlgorithms +diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa或者在命令行临时启用:
ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 \
-oHostKeyAlgorithms=+ssh-rsa \
[email protected] -p 33818调试技巧
使用 -vvv 参数查看详细的连接过程:
ssh -vvv bastion-via-windows关键日志包括:
debug2: KEX algorithms: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: host key algorithms: ssh-rsa,ssh-dss
debug1: kex: algorithm: diffie-hellman-group14-sha1安全考量
1. 端口暴露风险
将 127.0.0.1 端口暴露为 0.0.0.0 会带来安全风险:
- 局域网中其他人可以访问
- 绕过了堡垒机的客户端控制
- 相当于建立了一个跳板
使用防火墙规则限制访问:
# 只允许 Mac 的 IP 访问
netsh advfirewall firewall add rule name="GOST Tunnel" dir=in action=allow protocol=TCP localport=33818 remoteip=192.168.15.1002. 会话审计完整性
即使通过 GOST 转发,堡垒机仍然能够审计所有操作:
- 会话录像正常记录
- 命令审计不受影响
- 访问日志完整
因为所有流量仍然经过堡垒机,只是客户端连接方式发生了变化。
3. 企业合规性
在使用这种方案前,务必确认是否合规:
- 获得 IT 部门批准:可能违反公司安全策略
- 说明技术方案:解释不会绕过审计
- 限制使用场景:仅用于个人开发环境
其他协议支持
这个方案不仅支持 SSH,理论上可以转发所有协议,例如RDP, 数据库(如MySQL), SFTP。
总结
本文深入简单剖析了企业级运维安全网关的技术原理:
- 架构设计:原生隧道代理的混合架构
- 隧道机制:本地端口转发 + 加密传输
- 安全特性:localhost 监听、动态端口、全程审计
针对缺少 Mac 客户端的问题,提供了 GOST 端口转发方案:
- 技术可行:利用现有 Windows 客户端
- 审计完整:所有流量仍经过堡垒机
- 需要授权:可能涉及企业安全策略
本方案适用于:
- 个人开发环境
- 临时访问需求
- Mac 用户的运维场景
但需注意:
- 遵守企业安全政策
- 不要在生产环境使用