SSH 隧道深入解析:通过堡垒机进行转发

一、概述

1. 背景介绍

SSH 隧道技术是网络工程师和安全从业者必备的技能之一。在前两部分中,我们介绍了本地端口转发和远程端口转发两种基本的 SSH 隧道方向。本篇文章将深入探讨一种更复杂的场景:通过堡垒机(Bastion Host)进行 SSH 隧道转发。

2. 核心概念

堡垒机是一种暴露在外部网络中的中间服务器,用于作为访问内部网络的网关。内部系统通常隐藏在堡垒机之后,不直接对外开放访问。这种架构在安全实践中非常常见。

3. 应用场景

  • 安全地访问受保护的内部网络资源
  • 通过跳板机管理多层级网络架构
  • 在不暴露内部服务的情况下进行远程运维

二、SSH 代理隧道原理

1. 工作机制

SSH 代理隧道是建立在本地端口转发基础上的扩展技术。其核心思想是:不是将流量直接转发到 SSH 服务器,而是通过一个中间机器(堡垒机)转发到实际目标。

2. 架构分析

graph LR
    A[客户端机器] -->|SSH 连接| B[堡垒主机]
    B -->|网络访问| C[内部机器]
    A -->|本地端口转发| B
    B -->|流量转发| C
    A -.->|最终访问| C

SSH 代理隧道架构图

3. 关键组件

A. 客户端机器

用户操作的本地计算机,运行 SSH 命令并建立隧道。

B. 堡垒主机

暴露在外部网络的中间服务器,作为进入内部网络的网关。

C. 内部机器

位于受保护网络中的目标服务器,只能通过堡垒机访问。

三、实验环境配置

1. 网络拓扑

典型实验环境包含三台机器:

  • 客户端机器:192.168.56.10 - 运行 SSH 命令的本地机器
  • 堡垒主机:192.168.56.11 - 暴露在外部的中间服务器
  • 内部机器:192.168.57.11 - 需要通过堡垒机访问的目标服务器

2. 网络连通性

graph TB
    subgraph 外部网络
        Client[客户端<br/>192.168.56.10]
        Bastion[堡垒主机<br/>192.168.56.11]
    end
    subgraph 内部网络
        Internal[内部机器<br/>192.168.57.11]
    end
    Client -->|可直接访问| Bastion
    Bastion -->|可访问| Internal
    Client -.->|无法直接访问| Internal

网络拓扑图

3. 环境要求

系统要求

  • 所有机器运行 Linux 操作系统
  • SSH 服务已安装并运行
  • 网络防火墙规则正确配置

权限要求

  • 客户端需要有堡垒机的 SSH 访问权限
  • 堡垒机需要有内部机器的网络访问权限

四、SSH 代理隧道配置

1. 基本语法

通过堡垒机进行 SSH 隧道转发的命令格式:

ssh -L [本地端口]:[内部目标地址]:[内部端口] [堡垒机用户]@[堡垒机地址]

参数说明

  • -L:本地端口转发
  • [本地端口]:客户端监听的端口号
  • [内部目标地址]:相对于堡垒机的内部机器地址
  • [内部端口]:内部机器上目标服务的端口号
  • [堡垒机用户]:堡垒机的登录用户名
  • [堡垒机地址]:堡垒机的 IP 地址或域名

2. 实战示例

假设内部机器 192.168.57.11 上运行着 Web 服务(端口 80),我们要通过堡垒机 192.168.56.11 访问该服务。

步骤 1:建立 SSH 隧道

ssh -L 8080:192.168.57.11:80 user@192.168.56.11

步骤 2:访问内部服务

隧道建立后,在客户端浏览器访问:

http://localhost:8080

流量路径:客户端 localhost:8080 → 堡垒机 → 内部机器:80

3. 工作流程详解

sequenceDiagram
    participant C as 客户端
    participant L as 本地端口
    participant B as 堡垒主机
    participant I as 内部机器

    C->>L: 访问 localhost:8080
    L->>B: 通过 SSH 隧道转发
    B->>I: 转发到 192.168.57.11:80
    I-->>B: 返回响应
    B-->>L: 通过隧道返回
    L-->>C: 返回给浏览器

工作流程时序图

五、高级配置

1. 后台运行隧道

使用 -f 参数让 SSH 在后台运行:

ssh -f -N -L 8080:192.168.57.11:80 user@192.168.56.11
  • -f:后台运行
  • -N:不执行远程命令,仅建立隧道

2. 密钥认证

配置 SSH 密钥认证避免重复输入密码:

# 生成密钥对
ssh-keygen -t rsa -b 4096

# 复制公钥到堡垒机
ssh-copy-id user@192.168.56.11

3. 持久化隧道

使用 autossh 自动重连断开的隧道:

# 安装 autossh
sudo apt-get install autossh

# 启动持久化隧道
autossh -M 0 -f -N -L 8080:192.168.57.11:80 user@192.168.56.11

六、安全最佳实践

1. 访问控制

堡垒机加固

  • 禁用密码登录,仅允许密钥认证
  • 限制允许登录的用户
  • 配置 fail2ban 防止暴力破解

配置示例

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers specific_user

2. 网络隔离

防火墙规则

  • 严格限制堡垒机的入站访问
  • 内部机器仅接受来自堡垒机的连接

iptables 示例

# 堡垒机上允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 内部机器上仅允许堡垒机访问
iptables -A INPUT -s 192.168.56.11 -j ACCEPT
iptables -A INPUT -j DROP

3. 审计日志

启用详细日志

# /etc/ssh/sshd_config
LogLevel VERBOSE

集中化日志管理

  • 使用 syslog 或 rsyslog 将日志发送到中央服务器
  • 配置日志轮转和长期存储

七、故障排查

1. 连接问题

症状:无法建立隧道

  • 检查网络连通性:ping 192.168.56.11
  • 验证 SSH 服务:telnet 192.168.56.11 22
  • 查看 SSH 日志:/var/log/auth.log

解决方法

# 测试 SSH 连接
ssh -v user@192.168.56.11

# -v 参数输出详细的调试信息

2. 端口占用

症状:本地端口已被使用

错误信息:channel_setup_fwd_listener: cannot listen to port: 8080

解决方法

# 查找占用端口的进程
lsof -i :8080
netstat -tlnp | grep 8080

# 终止进程或使用其他端口
ssh -L 8081:192.168.57.11:80 user@192.168.56.11

3. 权限问题

症状:堡垒机无法访问内部机器

排查步骤

# 在堡垒机上测试连通性
ping 192.168.57.11
telnet 192.168.57.11 80

# 检查堡垒机路由表
ip route show

# 检查防火墙规则
iptables -L -n

八、实际应用场景

1. 远程数据库访问

访问受保护网络中的数据库服务:

# MySQL 数据库隧道
ssh -L 3306:internal-db.example.com:3306 user@bastion.example.com

# 然后可以本地连接
mysql -h 127.0.0.1 -u dbuser -p

2. Web 服务调试

调试生产环境的 Web 应用:

# 多端口转发
ssh -L 8080:web1.internal:80 \
     -L 8081:web2.internal:80 \
     user@bastion.example.com

3. 多跳隧道

通过多级堡垒机访问深层网络:

# 第一个隧道:客户端到第一级堡垒
ssh -L 9999:second-bastion.internal:22 user@first-bastion.example.com

# 第二个隧道:通过第一级堡垒到第二级堡垒
ssh -p 9999 -L 8080:target.internal:80 user@localhost
graph LR
    A[客户端] -->|隧道1| B[一级堡垒]
    B -->|隧道2| C[二级堡垒]
    C -->|访问| D[目标服务器]

多跳隧道架构

九、性能优化

1. 压缩传输

使用 -C 参数启用压缩:

ssh -C -L 8080:internal.server:80 user@bastion.server

适用于文本传输,可能不适合已经压缩的内容(如视频、图片)。

2. 连接复用

使用 SSH 连接复用减少握手开销:

# ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/cm %r@%h:%p
ControlPersist 10m

3. MTU 优化

调整 MTU 大小以适应隧道封装:

# 在隧道接口上设置 MTU
ip link set dev tun0 mtu 1400

十、总结

通过堡垒机进行 SSH 隧道转发是一种强大且实用的网络访问技术。它能够在保证安全性的同时,灵活地访问受保护的内部网络资源。

核心要点

  1. 堡垒机作为进入内部网络的网关,提供额外的安全层
  2. SSH 本地端口转发是基础,代理隧道是其扩展应用
  3. 合理的配置和监控是确保隧道稳定运行的关键
  4. 安全加固和审计日志是生产环境必备措施

最佳实践建议

  • 使用密钥认证替代密码登录
  • 配置自动重连机制提高可用性
  • 建立完善的监控和告警体系
  • 定期审查访问日志和权限配置

参考资料

  1. Part 3: SSH Tunnels Deep Dive - SSH Through Bastion Server
最后修改:2026 年 01 月 18 日
如果觉得我的文章对你有用,请随意赞赏