SSH端口转发

学习使用SSH进行端口转发

今天正好遇到了需要使用 SSH 端口转发的应用场景,在用端口转发解决问题后,又重新学习了一下 SSH 的端口转发,学到了新的使用方法,故作此记录

命令

SSH 端口转发有三种模式,分为本地端口转发远程端口转发动态端口转发

本地端口转发和远程端口转发

本地端口转发和远程端口转发使用如下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh <参数> [bind_address:]local_port:target_host:target_port user@ssh_server
-L 建立本地端口转发
-R 建立远程端口转发

配合L或R使用,需放在L或R的前面,比如 -fL,-fNR
-f 后台运行
-N 不执行远程命令
-g 允许其他机器连接本地转发端口

[bind_address:] 指定本地监听的网络接口,默认为127.0.0.1
local_port 本地机器上开放的端口号
target_host 目标服务的实际地址和端口
target_port 目标服务的真实端口

动态端口转发

动态端口转发使用如下命令

1
2
3
4
5
6
7
ssh -D [bind_address:]local_port user@ssh_server
-D 动态端口转发(Socks代理)

配合使用
-f 后台运行
-N 不执行远程命令
-c 启用压缩

端口转发的使用场景

端口转发本质上是利用 SSH 建立的加密隧道实现的流量代理功能,有几个使用场景

本地端口转发

比如远端的主机在其本地环回地址 127.0.0.1:80 上搭建了一个服务,理论上本机是无法访问的,但是如果使用端口转发,将远端主机的 80 端口转发到的本地的某一个端口,如8080端口,就可以实现访问本机的 127.0.0.1:8080 来访问这个服务了
这样的场景可以使用如下命令实现

1
ssh -L 8080:localhost:80 user@hostname

又比如有一台主机A,它可以访问到内网中的某台主机B上的服务,例如b.b.b.b:bb,这种情况可以使用主机A作为中转,转发到本地cc端口,访问到主机B,使用如下命令

1
ssh -L cc:b.b.b.b:bb user@主机A

远程端口转发

假设有一台内网主机上面有一个服务,运行在其本地环回地址 127.0.0.1:80 上,又有一台公网主机,希望使用端口转发实现内网穿透,可以在内网主机上使用如下命令

1
ssh -R 公网端口:127.0.0.1:80 user@公网主机

这样就可通过 公网IP:公网端口 访问到内网主机上 80 端口的服务了

动态端口转发

动态端口转发就是不固定某一个端口,而是来者不拒,任何端口的流量都可以转发,例如使用如下命令开启一个到达一台外网主机的动态端口转发

1
ssh -D 10086 user@外网主机

然后在浏览器的代理中设置 SOCKS 代理,主机设置为 127.0.0.1,端口设置为 10086,这样就实现了一个通过 SSH 加密隧道的访问外网的行为


很早以前就学到过 SSH 端口转发的用法,但是一直没有实际使用的机会,导致没有实践的经历,对这一块的知识也就不是很熟,多亏了现在有使用的机会,也顺便重温了一下这块的知识,脑子里的知识一下子就串通起来了|ω・)