SSH 隧道(端口转发)是 SSH 协议的重要功能,可将网络流量通过 SSH 连接进行加密转发,常被用于绕过防火墙限制、安全访问内网服务或加密不安全的协议。 我觉得最大的两个好处,第一就是可以绕过访问内网的限制,第二就是绕过防火墙的限制
结合隧道参数的 SSH 命令格式通常为: ssh [参数] -L/-R/-D [绑定地址:]端口:目标地址:目标端口 用户名@跳板机
下面详细介绍三种主要隧道类型及其参数:
- 本地转发(Local Forwarding)-L 可以将本地计算机(客户端)的某个端口接收到的流量,通过 SSH 连接转发到远程服务器(跳板机),再由远程服务器转发到最终的目标地址和端口。 常用于访问远程网络内部的服务(如数据库、Web 控制台),绕过防火墙对特定端口的封锁。
命令格式通常为: ssh -L [本地地址:]本地端口:目标地址:目标端口 用户名@跳板机
- 若不指定本地地址,默认绑定到 127.0.0.1,即仅本机可访问该隧道端口
- 目标地址是相对于跳板机而言的,可以是跳板机自身的 127.0.0.1、内网 IP 或域名
例如假设远程服务器 jump.example.com 可以访问内网数据库 192.168.1.100:3306,你想在本地 3306 端口直接连接该数据库: ssh -L 3306:192.168.1.100:3306 user@jump.example.com 之后,你在本地连接 127.0.0.1:3306,实际流量会经过 SSH 加密通道传至跳板机,再由跳板机转发至内网数据库。
本地转发主要用于访问公司内网的 Web 后台(如 Jenkins、GitLab)以及安全连接远程的 Redis、MySQL 等无加密服务
- 远程转发(Remote Forwarding)-R 可以将远程服务器(跳板机)的某个端口接收到的流量,通过 SSH 连接转发到本地计算机,再由本地计算机转发到指定的目标地址和端口。 常用于让外部网络访问你内网中的服务(如演示本地开发站点、远程调试)。
命令格式通常为: ssh -R [远程地址:]远程端口:目标地址:目标端口 用户名@跳板机
- 默认远程地址为 127.0.0.1,即只允许跳板机自身访问该隧道端口
- 若要让其他机器访问,通常需要修改 SSH 服务端的
GatewayPorts yes配置
例如本地运行了一个 Web 服务在 3000 端口,想让外网通过跳板机 jump.example.com 的 8080 端口访问: ssh -R 8080:localhost:3000 user@jump.example.com 此时,任何能访问 jump.example.com:8080 的设备都能看到你本地的 Web 服务。
远程转发主要用于临时将本地开发环境暴露给同事或客户以及内网穿透,无公网 IP 时借助公网服务器提供服务
- 动态转发(Dynamic Forwarding)-D 作用是在本地启动一个 SOCKS 代理服务器,通过 SSH 连接转发所有符合代理规则的流量。 常用于全局代理上网,绕过网络审查或防火墙。 命令格式为: ssh -D [本地地址:]本地端口 用户名@跳板机 示例 ssh -D 1080 user@jump.example.com 然后在浏览器或系统网络设置中配置 SOCKS5 代理为 127.0.0.1:1080,所有代理请求都会通过 SSH 隧道发送到跳板机,再由跳板机访问目标网站。 动态转发不需要为每个目标单独指定端口,适合浏览网页、访问各类服务而且支持 TCP 协议(UDP 需额外配置或使用新版 SSH 的 -D 扩展,但多数场景仅 TCP)
这是我自己整理的在windows上配置ssh,但是建议在Linux系统上测试,比Windows更加方便。
在Windows中配置ssh
#验证是否安装完成
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# 启动 SSH 服务
Start-Service sshd
# 设置 SSH 服务开机自动启动
Set-Service -Name sshd -StartupType 'Automatic'
# 查看服务状态(应显示 Running)
Get-Service sshd
## 配置防火墙放行 22 端口
#查看 SSH 相关的防火墙规则是否启用
Get-NetFirewallRule -Name *SSH*
#在局域网内另一台电脑上执行ssh
用户名@你的WindowsIP地址```