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 来访问云主机上的所有服务了。

 

posted @ 2022-02-07 11:59  两仪清风  阅读(265)  评论(0编辑  收藏  举报