SSH高级功能 - 远程端口转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH高级功能 - 远程端口转发相关的知识,希望对你有一定的参考价值。

参考技术A

在本地端口的场景中,可以从Server-B建立到Server-A的SSH连接,但是如果Server-B到Server-A之间无法连接,只有Server-A到Server-B的连接呢? (比如开发机可以访问服务器,但是服务器一般是不可以访问本地开发机的)

假设Server-A的IP为 192.168.58.101 ,Server-B的IP是 192.168.58.103

在Server-A上执行如下命令:

上面的命令,就建立了远程端口转发,把远程服务器Server-B的9906端口的所有数据都会被转发到Server-A 192.168.58.101 的3306端口

在Server-B上执行命令

就可以连接到Server-A上的mysql Server了

本地端口转发 远程端口转发 结合起来使用,可以进行链式转发。假设A主机在公司,B主机在家,C主机为远程云主机。A主机上运行了前文的Node.js服务,需要在B主机上访问该服务。由于A和B不在同一个网络,且A主机没有独立公共IP地址,所以无法直接访问服务。

通过本地端口转发,将发送到B主机4000端口的请求,转发到远程云主机C的3000端口。

通过远程端口转发,将发送到远程云主机C端口3000的请求,转发到A主机的2000端口。

这样,在主机B可以通过访问 http://localhost:4000 来访问主机A上的服务。

ssh强大的端口转发功能

ssh 最普通的用法便是通过 ssh 远程登录 linux 服务器,或是远程执行命令,但是,ssh 的用法不光局限于此,它的端口转发功能才是高级的用法。
ssh的远程登录以及远程执行命令就不记录了,主要记录一下 ssh 在不同地方的端口转发。

这是ssh的参数解释
相关参数的解释:

-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。

-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接.

-C Enable compression.
压缩数据传输。

-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。

-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。注:这个参数我在实践中似乎始终不起作用。

以上摘录: http://blog.creke.net/722.html

服务器

远端A主机 ip: 111.21.21.2 ; 远端B主机 ip: 172.16.3.22
本地A主机 ip: 192.168.1.2 ; 本地B主机 ip: 192.168.1.5
可以理解为,远端主机A.B是一个局域网内的服务器,本地主机A.B 是自己当前所在的服务器;我们可以直接登录本地主机A或者B。但是,本地主机和远端主机之间,只有本地的 A 主机和远端的 A 主机可以互相直接通信。由此,对应不同的场景,我们便需要做端口转发来满足跨网段访问,可以理解为做端口转发的那台机器相当于是代理服务器。

示例1

从远端A主机做 ssh 隧道,将远端B主机的 3306 端口转发到本地的 A 主机上的 13306 端口上过,然后用 本地的 B 主机通过 本地A主机的 13306 登录 远端B主机的 3306 端口

ssh -Nf -R 13306:172.16.3.22:3306 [email protected] -o ServerAliveInterval=60

添加说明: 此方法,是在远端A主机执行此命令,将 13306 端口转发到了本地A主机上,可以在本地A主机上看到有 13306 端口,。当从 本地B主机 请求 本地A主机的 13306 端口时,本地A主机 将会直接通过 22 端口转发到 远端A主机的 22 端口,然后 远端A主机再去通过 22 端口请求远端 B 主机 的 3306端口,由此实现跨网段访问。这种方法最直观的展现给我们的是,通过 本地B主机 登录 本地A主机 的 13306 会直接登录到 远端B主机的 3306 端口上。
使用场景: 此方法使用于本地想要直接连接远端局域网内其他服务器的各种端口。
缺点:此方法有个蛋疼的地方,转发过来的端口不能对外,只能本机访问,想要再其他机器访问的话,本机装一个nginx,将本机的 127.0.0.0:13306 端口代理出去即可。

示例2

本地A主机分配socket,端口转发到远端A主机,本地B主机通过本地A主机开的端口去访问远端A主机,远端A主机判断出来自本地A主机的请求类型去访问请求对应的资源返回给本地A主机,然后本地A主机再将请求内容返回给本地B主机,可以看做本地A主机是本地代理服务器,远端A主机是远端代理服务器。

     ssh -C -fNg -D 65122 [email protected] -p 22 -o ServerAliveInterval=60
 应用场景:此种方式适合做×××代理服务器

以上是关于SSH高级功能 - 远程端口转发的主要内容,如果未能解决你的问题,请参考以下文章

利用SSH端口转发实现远程访问内网主机远程桌面 建立SSH转发

SSH -R 远程端口转发

SSH 内网端口转发实战

SSH 远程端口转发

安全牛学习笔记SSH远程端口转发和动态端口转发以及X协议转发

ssh的高级应用本地端口转发