前言
SSH 隧道是一种强大的网络技术,它允许我们通过 SSH 连接在本地和远程主机之间建立安全的通信通道。本文将详细介绍 SSH 隧道的两种主要模式:远程端口转发和本地端口转发,帮助你在不同场景下灵活运用。
SSH 隧道基础概念
什么是 SSH 隧道
SSH 隧道利用 SSH 协议的加密特性,在不安全的网络环境中创建一个安全的通信通道。它可以用来:
- 访问内网服务
- 绕过防火墙限制
- 加密不安全的协议流量
- 实现端口转发和代理
两种核心模式
| 模式 | 方向 | 用途 |
|---|---|---|
远程转发 (-R) | 远程 → 本地 | 将本地服务暴露到公网 |
本地转发 (-L) | 本地 → 远程 | 访问远程内网服务 |
远程端口转发(Remote Forwarding)
远程端口转发用于将本地服务通过 SSH 隧道暴露到远程服务器上。这在需要将内网服务临时暴露到公网时非常有用。
基本语法
ssh -R [远程端口]:[本地地址]:[本地端口] [用户名]@[远程服务器]
常用参数
| 参数 | 含义 | 说明 |
|---|---|---|
-R | 远程转发 | 将远程服务器的端口转发到本地 |
-N | 不执行命令 | 仅建立隧道,不打开远程 Shell |
-f | 后台运行 | 建立连接后转入后台 |
-o ServerAliveInterval=60 | 心跳保活 | 每 60 秒发送心跳包,防止连接断开 |
实战案例 1:将本地 Web 服务暴露到公网
场景:你在本地开发了一个 Web 应用(运行在 127.0.0.1:80),需要临时让外部用户访问。
ssh -R 8080:127.0.0.1:80 root@<YOUR_SERVER_IP> -N -f -o ServerAliveInterval=60
效果:
- 公网服务器
<YOUR_SERVER_IP>的8080端口被转发到本地的80端口 - 外部用户访问
http://<YOUR_SERVER_IP>:8080即可访问你的本地服务
验证:
# 在公网服务器上测试
curl http://127.0.0.1:8080/api/ping
实战案例 2:内网设备端口映射
场景:你需要将内网中另一台设备(192.168.5.32)的 80 端口暴露到公网。
ssh -R 8080:192.168.5.32:80 root@<YOUR_SERVER_IP> -N -f -o ServerAliveInterval=30
注意:192.168.5.32 必须是你本地网络中可访问的设备。
实战案例 3:MQTT 端口转发
场景:将本地 MQTT 服务(192.168.5.32:1883)映射到公网的 1884 端口。
ssh -R 1884:192.168.5.32:1883 root@<YOUR_SERVER_IP> -N -f -o ServerAliveInterval=30
停止隧道
由于隧道在后台运行,需要使用以下命令停止:
# 查找 SSH 进程
ps aux | grep ssh
# 杀掉进程(假设 PID 是 12345)
kill 12345
本地端口转发(Local Forwarding)
本地端口转发用于通过 SSH 隧道访问远程内网中的服务。这在需要访问公司内网资源时非常有用。
基本语法
ssh -L [本地端口]:[目标地址]:[目标端口] [用户名]@[跳板机]
常用参数
| 参数 | 含义 | 说明 |
|---|---|---|
-L | 本地转发 | 将本地端口转发到远程目标 |
-N | 不执行命令 | 仅建立隧道,不打开远程 Shell |
-f | 后台运行 | 建立连接后转入后台 |
-n | 重定向 stdin | 从 /dev/null 读取输入,防止后台进程读取键盘输入 |
实战案例:远程办公访问公司数据库
场景背景:
- 你(主机 A):在家里,想访问公司的 MySQL 数据库
- 公司跳板机(主机 B):IP 是
192.168.1.100,你可以 SSH 连上它 - 公司数据库(主机 C):IP 是
10.0.0.5,端口3306。它在防火墙后面,外网连不上,只有跳板机能连
目标:让你家里的电脑可以通过访问 127.0.0.1:3306 连到公司的数据库
执行命令:
ssh -f -N -n -L 3306:10.0.0.5:3306 user@192.168.1.100
命令执行效果:
- 输入密码:终端会提示你输入跳板机的密码(或者用密钥登录)
- 瞬间”消失”:登录成功后,因为加了
-f,命令行提示符立刻回来了,你感觉不到 SSH 还在运行 - 静默工作:因为加了
-N和-n,它在后台不占屏幕,也不听你键盘乱敲 - 连接数据库:
- 你打开本地的 Navicat 或 DBeaver
- 连接地址填
127.0.0.1,端口填3306 - 神奇的事情发生了:数据通过 SSH 隧道(A -> B -> C),安全地连上了公司的内网数据库
参数详解:
| 参数 | 含义 | 作用 | 为什么要用它? |
|---|---|---|---|
-L | 本地转发 | 定义转发规则:本地端口:目标IP:目标端口 | 核心功能。把本地的流量”传送”到远程去。 |
-N | 不执行命令 | 告诉 SSH 连上后不要打开远程的 Shell | 我们只是来修”隧道”的,不是来远程敲命令的。省资源且更安全。 |
-f | 后台运行 | 连接建立后,把 SSH 进程放到后台运行,释放当前终端 | 让你关掉终端窗口后,隧道还能继续跑,不占用你的屏幕。 |
-n | 重定向 stdin | 把标准输入重定向到空(/dev/null),不听键盘输入 | 防止后台进程因为误读到你敲击键盘的字符而报错或卡死。 |
停止隧道:
# 查找 SSH 进程
ps aux | grep ssh
# 杀掉进程
kill <PID>
两种模式的对比
| 特性 | 远程转发 (-R) | 本地转发 (-L) |
|---|---|---|
| 数据流向 | 远程 → 本地 | 本地 → 远程 |
| 典型场景 | 将本地服务暴露到公网 | 访问远程内网服务 |
| 常用参数 | -R -N -f -o ServerAliveInterval | -L -N -f -n |
| 安全注意 | 暴露本地服务到公网有风险 | 相对安全,仅访问远程服务 |
安全注意事项
- 密钥认证:生产环境应使用 SSH 密钥而非密码认证
- 访问控制:限制可连接隧道的 IP 地址
- 防火墙配置:确保防火墙允许必要的端口通信
- 及时关闭:使用完毕后及时关闭隧道,避免长期暴露
- 日志监控:定期检查 SSH 连接日志,发现异常及时处理
总结
SSH 隧道是一个功能强大的网络工具,通过远程转发和本地转发两种模式,可以灵活地解决各种网络访问问题:
- 远程转发:适合将本地或内网服务临时暴露到公网
- 本地转发:适合安全访问远程内网中的服务
掌握这些技术,可以大大提高运维工作的效率,同时保证数据传输的安全性。