SSH TCP/IP隧道转移
隧道转移方向
Local(Outgoing)
本地隧道端口转发远程应用端口
-L local_socket:remote_socket
对本地指定的TCP端口port的连接都将转发到指定的远程主机及其端
口上(host:hostport)。工作方式是在本地端分配一个socket监听TCP
端口。当监听到本地此端口有连接时,连接将通过安全隧道转发给
远程主机(server),然后从远程主机(是server端)上建立一个到
host:hostport的连接,完成数据转发。
译者注:隧道建立在本地和远程主机(server端,即中间主机)之间,
而非本地和host之间,也不是远程主机和host之间。
端口转发也可以在配置文件中指定。只有root用户才能转发特权端口
(小于1024)。
默认本地端口被绑定在GatewayPorts指令指定的地址上。但是,显式
指定的bind_address可以用于绑定连接到指定的地址上。如果设置
bind_address为"localhost",则表示被绑定的监听端口只可用于本地
连接(即该端口监听在回环地址上),如果不设置bind_address或设置
为"*"则表示绑定的端口可用于所有网络接口上的连接(即表示该端口
监听在所有地址上)。
Remote(Incoming)
远程隧道端口转发本地应用端口
-R remote_socket:local_socket
对远程(server端)指定的TCP端口port的连接都就将转发到本地主机和
端口上,工作方式是在远端(server)分配一个套接字socket监听TCP端
口。当监听到此端口有连接时,连接将通过安全隧道转发给本地,然后
从本地主机建一条到host:hostport的连接。
端口转发也可以在配置文件中指定。只有root用户才能转发特权端口
(小于1024)。
默认远程(server)套接字被绑定在回环地址上。但是,显式指定的
bind_address可以用于绑定套接字到指定的地址上。如果不设置
bind_address或设置为"*"则表示套接字监听在所有网络接口上。
只有当远程(server)主机的GatewayPorts选项开启时,指定的
bind_address才能生效。(见sshd_config(5))。
如果port值为0,远程主机(server)监听的端口将被动态分配,并且在
运行时报告给客户端。
Dynamic(SOCKS4/5)
动态代理端口,该代理将远程主机的网络代理到本地
-D [bind_address:]port
指定一个本地动态应用层端口做转发端口。工作方式是分配一个套接
字监听在此端口,当监听到此端口有连接时,此连接中的数据将通过
安全隧道转发到server端,server端再和目的地(端口)建立连接,目
的地(端口)由应用层协议决定。目前支SOCK4和SOCK5两种协议,并且
SSH将扮演SOCKS服务端角色。
只有root用户可以开启特权端口。动态转发端口也可以在配置文件
中指定。
默认情况下,转发端口将绑定在GatewayPorts指令指定的地址上,但
是可以显式指定bind_address,如果bind_address设置为"localhost",
则转发端口将绑定在回环地址上,如果bind_address不设置或设置为
"*",则转发端口绑定在所有网路接口上。
隧道转移应用举例
环境假设
主机 | 网络域 | 有公网IP | SSH |
Local_A | 办公区 | 无/通过路由器共享上网 | 有客户端 |
Local_B | 办公区 | 无/通过路由器共享上网 | windows服务器主机,未安装客户端 |
Remote_C | 云主机 | 有 | 服务端 |
Remote_D | 云主机 | 无/与Remote_C在同一内网 | 服务端 |
场景假设1: Local_B 上有部署AD服务(LDAP),Remote_D 上的应用需要访问该AD服务
LDAP的端口为389
ssh -NR 0.0.0.0:1389:Local_B:389 root@Remote_C
之后,Remote_D 便可以通过访问 Remote_C:1389 来访问 AD服务了。
至于 389是否在公网公开,可以通过其它手段处理,不在本文讨论范围
场景假设2:Remote_D 上有部署了机密服务,希望在办公区访问该服务
假设该服务端口为:8080
ssh -NL 0.0.0.0:7080:REMOTE_D:8080
之后,办公区就可以通过访问 LOCAL_A:7080 来访问该机密服务了
场景假设3:Remote_C 所在网络域部署了很多服务,网管很忙,没时间一个一个做转发,且服务还在不断增减
这时,可能最需要是建设VPN,又不在本文讨论范围了。
通过SSH 代理,也可以暂时实现。
ssh -ND 0.0.0.0:1080 REMOTE_A
之后,在办公区,就可以通过 SCOKS5代理 LOCAL_A:1080 来访问云主机上的所有服务了。