SSH隧道 服务器

2026-03-23 约 1531 字 阅读时长4 分钟

SSH隧道

介绍

SSH 隧道(SSH Tunneling),也常被称为 SSH 端口转发,是一种利用 SSH 协议创建安全加密通道的技术。它能够将其他 TCP 端口的网络数据通过 SSH 连接进行转发,从而为原本不安全的网络通信提供加密保护,并能有效绕过防火墙的限制。

为什么需要 SSH 隧道?

常见场景:公司的数据库(如 MySQL)部署在内网,出于安全考虑,它不直接对外网开放。作为开发人员,在家办公时需要访问这个数据库。这时,SSH 隧道就派上用场了。

  • 安全加密:如果你的应用程序(如数据库客户端)使用的协议本身不加密,数据在互联网上传输时就有被窃听的风险。SSH 隧道会在你的电脑和远程服务器之间建立一个加密管道,所有通过它的数据都会被自动加密和解密,保证了传输过程的安全。
  • 突破限制:许多服务(如数据库、内部管理系统)被防火墙保护,无法从外部直接访问。SSH 隧道可以“穿透”防火墙,让你通过一个可以访问的 SSH 服务器(常被称为“跳板机”)来访问这些内部服务。

三种隧道类型

本地端口转发

本地端口转发 (Local Port Forwarding),它将远程服务器上的某个端口“映射”到你的本地机器的一个端口上。

  • 作用:让你通过访问本地的某个端口,来安全地访问远程网络中的服务。

  • 场景:访问内网的数据库、Web 服务或 API。

  • 命令

    bash
    1# 格式
    2ssh -L [本地IP:]本地端口:目标地址:目标端口 用户名@SSH服务器地址
    3
    4# 示例:将本地 3306 端口映射到内网数据库 10.0.0.5:3306
    5ssh -L 3306:10.0.0.5:3306 user@gateway.example.com -N

    执行后,你本地的数据库客户端连接 localhost:3306,流量就会通过加密隧道到达 gateway.example.com,再由它转发到内网的 10.0.0.5:3306

远程端口转发

它将本地机器上的服务“暴露”给远程服务器。

  • 作用:让外部网络可以通过访问远程服务器的某个端口,来访问你本地运行的服务。这是实现“内网穿透”的常用技术。

  • 场景:在本地开发了一个 Web 应用,想让外部的同事或客户进行预览。

  • 命令

    bash
    1# 格式
    2ssh -R [远程IP:]远程端口:本地地址:本地端口 用户名@SSH服务器地址
    3
    4# 示例:将本地的 3000 端口映射到公网服务器 8080 端口
    5ssh -R 8080:localhost:3000 user@public-server.com -N

    执行后,任何人访问 public-server.com:8080,请求就会被转发到你本机的 localhost:3000 服务上。 注意:要让远程服务器监听非本地回环地址(即允许其他机器访问),需要在服务器的 /etc/ssh/sshd_config 文件中设置 GatewayPorts yes

动态端口转发

比较灵活的转发方式,它会在本地机器上创建一个 SOCKS5 代理服务器。

  • 作用:所有配置了使用该代理的应用程序,其网络流量都会通过 SSH 隧道从远程服务器发出。

  • 场景:通过一个可信的远程服务器来安全地浏览网页,或者访问其所在内网的各种资源。

  • 命令

    bash
    1# 格式
    2ssh -D [本地SOCKS端口] 用户名@SSH服务器地址 -N
    3
    4# 示例:在本地 1080 端口创建一个 SOCKS5 代理
    5ssh -D 1080 user@gateway.example.com -N

    执行后,在你的浏览器或系统网络设置中配置 SOCKS5 代理,地址为 127.0.0.1,端口为 1080,所有的网络请求就会通过加密隧道从 gateway.example.com 出去。

常用命令技巧

  • 后台运行:使用 -N-f 参数组合,可以让隧道在后台静默运行,不占用当前终端。

    bash
    1ssh -f -N -L 3306:localhost:3306 user@server.com
  • 多端口转发:可以在一条命令中建立多个隧道。

    bash
    1ssh -L 3306:mysql:3306 -L 6379:redis:6379 user@gateway.com
  • 跨主机跳转 (ProxyJump):对于复杂的网络环境,可以通过一台或多台跳板机访问目标服务器。SSH 7.3 及以上版本推荐使用 -J 参数。

    bash
    1# 通过 jump.example.com 访问内网的 prod-server-01
    2ssh -J user@jump.example.com user@prod-server-01.internal
  • 保持连接稳定:可以使用 autossh 工具来自动重启断开的 SSH 隧道,确保连接的稳定性。

    bash
    1autossh -M 0 -f -N -L 8080:localhost:80 user@server.com

安全与配置

  • 服务器配置:SSH 隧道的功能受远程服务器的 /etc/ssh/sshd_config 文件控制。关键配置项包括 AllowTcpForwarding(是否允许端口转发)和 GatewayPorts(是否允许远程主机连接转发端口)。
  • 密钥认证:为了安全和方便,可以使用 SSH 密钥对进行认证,避免每次建立隧道都输入密码。
使用滚轮缩放
按住拖动