Jichen

Back

SSH隧道工具详解:端口转发技术与实战应用指南Blur image

SSH简介#

SSH(Secure SHell)命令是OpenSSH套件的组成部分,是一个用于登录到远程机器并在远程机器上执行命令的程序。它的目的是取代 rlogin 和 rsh,并在一个不安全的网络上提供两个不受信任的主机之间的安全加密通信。X11 连接和任意 TCP 端口也可以通过安全通道进行转发。

常用端口转发参数:

参数功能示例
-L本地端口转发-L 8080:localhost:3000
-R远程端口转发-R 8080:localhost:3000
-N不执行远程命令仅建立隧道
-f后台运行后台执行

常用场景#

  1. 访问内网服务:通过跳板机访问数据库、Web服务
  2. 本地开发调试:将本地服务临时暴露给外网测试
  3. 安全访问:加密传输敏感数据
  4. 绕过防火墙:访问受限制的网络资源

SSH命令示例#

远程到本地(访问远程服务)#

命令格式

ssh -l [用户名] -L [本地端口]:localhost:[远程端口] -N [远程服务器IP]
shell

具体示例

ssh -l root -L 8080:localhost:3306 -N 192.168.1.100
shell

效果:将远程服务器192.168.1.100的3306端口(MySQL)映射到本地的8080端口。访问 localhost:8080 即访问远程MySQL服务。

本地到远程(暴露本地服务)#

命令格式

ssh -l [用户名] -R 0.0.0.0:[远程端口]:localhost:[本地端口] -N [远程服务器IP]
bash

具体示例

ssh -l ubuntu -R 0.0.0.0:8080:localhost:3000 -N 203.0.113.10
shell

效果:将本地3000端口(如React开发服务器)暴露到远程服务器203.0.113.10的8080端口。访问 203.0.113.10:8080 即可访问本地服务。

脚本功能介绍#

这个批处理脚本简化了SSH隧道创建过程:

  1. 环境检查:验证SSH客户端是否存在
  2. 模式选择:提供两种隧道模式
  3. 参数输入:交互式输入服务器、端口等信息
  4. 命令生成:自动构建正确的SSH命令
  5. 确认执行:显示完整信息后执行

脚本流程#

检查SSH → 选择模式 → 输入参数 → 显示配置 → 确认执行
plaintext

使用效果#

screenshot.png

常见问题与解决方案#

问题1:未安装SSH客户端#

现象:运行脚本时提示”未在系统中找到 ssh 客户端”

原因:Windows系统未安装OpenSSH客户端

解决

  1. Windows 10/11内置安装

    # PowerShell管理员模式运行
    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
    powershell
  2. Git Bash:安装Git for Windows,自带SSH客户端

  3. 手动下载:从OpenSSH官网下载并添加到PATH

问题2:本地到远程模式无法通过公网IP访问#

现象:服务器上 curl localhost:端口 成功,但 curl 公网IP:端口 失败

原因:SSH默认只绑定到127.0.0.1

解决

  1. 脚本已处理:使用 0.0.0.0:%REMOTE_PORT% 格式

  2. 服务器配置(如仍无效):

    # 编辑 /etc/ssh/sshd_config
    GatewayPorts yes
    # 重启服务
    sudo systemctl restart sshd
    shell

问题3:连接被拒绝或超时#

解决

  1. 检查服务器防火墙规则
  2. 云服务器需配置安全组入站规则
  3. 验证服务器SSH服务正常运行

问题4:端口已被占用#

解决

  1. 更换端口号
  2. 检查端口占用:netstat -ano | findstr :端口

问题5:权限不足#

解决

  1. 使用管理员权限运行脚本
  2. 检查服务器用户权限

快速使用#

# 保存为 ssh_tunnel.bat
# 双击运行,按提示操作
shell

模式1(远程到本地):访问远程服务器上的服务 模式2(本地到远程):将本地服务暴露给外网访问

@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion

echo [INFO] Windows SSH 隧道工具
echo.

where ssh >nul 2>nul
if errorlevel 1 (
    echo [ERROR] 未在系统中找到 ssh 客户端
    echo [INFO] 请先安装 OpenSSH 或将 ssh.exe 加入 PATH
    pause
    exit /b
)

for /f "tokens=1,2" %%a in ('ssh -V 2^>^&1') do set SSH_VER=%%a %%b
echo [OK] !SSH_VER!
echo.

:mode_select
echo 请选择端口转发模式:
echo 1. 远程 本地  (访问远程服务)
echo 2. 本地 远程  (暴露本地服务)
set /p MODE=请输入 1 2: 

if "%MODE%"=="1" (
    set MODE_NAME=远程 本地
    set MODE_FLAG=L
) else if "%MODE%"=="2" (
    set MODE_NAME=本地 远程
    set MODE_FLAG=R
) else (
    echo [ERROR] 模式输入错误
    echo.
    goto mode_select
)

:input_server
echo.
set /p SERVER_IP=请输入服务器IP: 
if "%SERVER_IP%"=="" (
    echo [ERROR] 服务器IP不能为空
    goto input_server
)

set /p SSH_USER=请输入用户名(默认root): 
if "%SSH_USER%"=="" set SSH_USER=root

:input_local
set /p LOCAL_PORT=请输入本地端口: 
if "%LOCAL_PORT%"=="" (
    echo [ERROR] 本地端口不能为空
    goto input_local
)

:input_remote
set /p REMOTE_PORT=请输入远程端口: 
if "%REMOTE_PORT%"=="" (
    echo [ERROR] 远程端口不能为空
    goto input_remote
)

echo.
echo [INFO] SSH 隧道信息
echo 服务器: !SSH_USER!@%SERVER_IP%
echo 转发模式: %MODE_NAME%

if "%MODE_FLAG%"=="L" (
    set ACCESS_ADDR=localhost:%LOCAL_PORT%
    set MAP_INFO=%SERVER_IP%:%REMOTE_PORT% to localhost:%LOCAL_PORT%
    set SSH_CMD=ssh -l !SSH_USER! -L %LOCAL_PORT%:localhost:%REMOTE_PORT% -N %SERVER_IP%
) else (
    set ACCESS_ADDR=%SERVER_IP%:%REMOTE_PORT%
    set MAP_INFO=localhost:%LOCAL_PORT% to %SERVER_IP%:%REMOTE_PORT%
	set SSH_CMD=ssh -l !SSH_USER! -R 0.0.0.0:%REMOTE_PORT%:localhost:%LOCAL_PORT% -N %SERVER_IP%
)

echo 映射关系: %MAP_INFO%
echo 访问地址: http://%ACCESS_ADDR%
echo.
echo 将要执行的命令:
echo %SSH_CMD%
echo.
set /p CONFIRM=是否启动(y/n): 

if /I not "%CONFIRM%"=="y" (
    echo [INFO] 用户取消操作
    pause
    exit /b
)

echo.
echo [INFO] 正在建立SSH隧道
echo [INFO] 映射: %MAP_INFO%
echo [INFO] 请访问: http://%ACCESS_ADDR%
echo [INFO] 按 Ctrl+C 断开连接
echo.

%SSH_CMD%

pause
shell

总结#

这个脚本将复杂的SSH隧道命令封装为简单的交互界面,特别适合需要频繁建立隧道的开发者和运维人员。核心改进是本地到远程模式自动使用0.0.0.0绑定,解决公网访问问题。


脚本优势

  • 简化操作流程
  • 避免参数记忆错误
  • 自动处理常见配置问题
  • 适用于Windows环境
SSH隧道工具详解:端口转发技术与实战应用指南
https://shujichen.com/blog/sshtunnelingtool
Author Jichen
Published at January 10, 2026
Comment seems to stuck. Try to refresh?✨