SSH 隧道转发与代理命令

本地端口转发 -L

访问目标服务器的内网服务

1
ssh -N -L 本地端口:目标主机:目标端口 用户名@SSH服务器

示例:把内网 192.168.1.100:8082 映射到本机 127.0.0.1:8082

1
ssh -N -L 8082:192.168.1.100:8082 user@SSH服务器地址

本地访问:

1
curl -v http://127.0.0.1:8082/

浏览器访问:

1
http://127.0.0.1:8082/

注意:

  • 目标主机 是从 SSH 服务器视角能访问到的地址。
  • 本地访问统一用 127.0.0.1,避免 localhost 解析到 IPv6 ::1。
  • 如果目标服务校验 Host,可测试:
1
curl -v -H "Host: 192.168.1.100:8082" http://127.0.0.1:8082/

远程端口转发 -R

让目标服务器访问本地服务

1
ssh -N -R 远程端口:本地主机:本地端口 用户名@SSH服务器

示例:把本机 3000 端口映射到 SSH 服务器的 8080 端口

1
ssh -N -R 8080:localhost:3000 user@SSH服务器地址

之后在 SSH 服务器上访问:

1
http://127.0.0.1:8080/

用途:内网穿透、让远端访问本地开发环境。
是否允许远程访问还取决于 SSH 服务端 GatewayPorts 配置。


代理 -D

开启 SOCKS5 代理,并用它访问内网服务

1
ssh -N -D 1080 用户名@SSH服务器

示例:

1
ssh -N -D 1080 user@SSH服务器地址

该命令在本机 127.0.0.1:1080 开启一个 SOCKS5 代理。之后支持 SOCKS5 的程序都可以通过该代理访问 SSH 服务器能访问的网络。

curl 走 SOCKS5 代理

1
curl --socks5-hostname 127.0.0.1:1080 http://目标内网IP:8082/

推荐 --socks5-hostname,让代理端解析域名。目标使用 IP 时也可:

1
curl --socks5 127.0.0.1:1080 http://目标内网IP:8082/

浏览器走 SOCKS5 代理

代理设置中只填:

1
2
3
SOCKS 主机:127.0.0.1
SOCKS 端口:1080
类型:SOCKS5

HTTP 代理、SSL 代理、FTP 代理全部留空。
-D 提供的是 SOCKS 代理,不是 HTTP 代理。把 SOCKS 填到 HTTP 代理栏会导致 ERR_CONNECTION_RESET。

命令行临时代理环境变量

Linux/macOS:

1
2
export ALL_PROXY=socks5h://127.0.0.1:1080
curl http://目标内网IP:8082/

Windows CMD:

1
2
set ALL_PROXY=socks5h://127.0.0.1:1080
curl http://目标内网IP:8082/

PowerShell:

1
2
$env:ALL_PROXY="socks5h://127.0.0.1:1080"
curl http://目标内网IP:8082/

注意:不是所有程序都识别 ALL_PROXY,浏览器单独配置 SOCKS5 最稳。


常用参数速查

参数 作用
-N 只转发,不执行远程命令,不开 shell
-f 后台运行,Linux/macOS 常用;Windows 可新开窗口
-C 压缩传输
-v 调试输出,排查隧道失败必用
-T 不分配终端
-4 / -6 强制 IPv4 / IPv6
-o ExitOnForwardFailure=yes 转发失败就退出,避免“假连上”
-o ServerAliveInterval=30 每 30 秒发心跳
-o ServerAliveCountMax=3 心跳失败 3 次后断开
-g 允许其他主机连接本地转发端口,慎用

推荐稳定写法:

1
2
3
4
5
6
ssh -N -C \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-L 8082:192.168.1.100:8082 \
user@SSH服务器地址

Windows 不使用 -f 时,新开 CMD 窗口运行即可;CMD 后台新窗口可用:

1
start "" ssh -N -D 1080 user@SSH服务器地址

写入 ~/.ssh/config

Windows 路径通常为:

1
C:\Users\<用户名>\.ssh\config

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
Host jump
HostName SSH服务器地址
User user
Port 22
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes

# 本地转发:访问内网 8082
LocalForward 8082 192.168.1.100:8082

# 动态 SOCKS5 代理
DynamicForward 1080

以后启动:

1
ssh -N jump

只保留本地转发时,注释掉 DynamicForward;只保留 SOCKS 代理时,注释掉 LocalForward。


最常用三条

1
2
3
4
5
6
7
8
9
10
11
# 1. 本地转发:访问内网服务
ssh -N -L 8082:目标内网IP:8082 user@SSH服务器
# 浏览器/curl 访问 http://127.0.0.1:8082/

# 2. 动态 SOCKS5 代理:通用代理
ssh -N -D 1080 user@SSH服务器
# curl --socks5-hostname 127.0.0.1:1080 http://目标内网IP:8082/
# 浏览器只配 SOCKS5 127.0.0.1:1080

# 3. 远程转发:把本地服务暴露到 SSH 服务器
ssh -N -R 8080:localhost:3000 user@SSH服务器