c++ 检查远程主机端口_SSH 端口转发

一、概述

我们知道,SSH 会自动加密和解密 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。就是说能将 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密以及解密服务,这一过程也被称为“隧道”(tunneling)。如果在一些环境中防火墙限制了一些网络端口的使用,但是允许 SSH 链接,那么我们就可以将 TCP 端口转发来使用 SSH 通讯。

总的说 SSH 端口转发两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 可以突破防火墙的限制完成一些之前无法建立的 TCP 链接。

二、本地端口转发

假设在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有在本机上部署的应用才能连接此 LDAP 服务器。如果我们我们由于调试或者测试的需要想要临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器,就可以用到本地端口转发了。

其实简单来说就是,我有一台服务器,他的某一个端口(比如 389)不对外开发(防火墙),那我就只能老老实实的走到这个服务器面前使用它。但是我想在宿舍里也能连接上这个端口,那么我就需要一个“内鬼”,这个内鬼是可以和我们联系的(对外开放,不被防火墙隔离),并且就在这台服务器上,这样他就可以帮我访问这个被限制的 389 端口了。

本地端口转发其实就是这个内鬼,或者说这个使用 SSH 的本地端口转发功能可以做到内鬼的功能。

cdae304d544f64f6911a645a39a08679.png

命令格式:

ssh -L [local_bind_addr:]<local port>:<remote host>:<remote port> <SSH hostname>

我更喜欢将 <SSH hostname> 理解为 <middle host> 即中间跳板机,跳板机可以是目标主机自身,也可以是其他中间主机。

命令实践:

那么我们就以在宿舍里自己的电脑上执行命令建立一个 SSH 的本地端口转发:

ssh -L 70001:localhost:389 LdapServerHost

数据流向:

  • 我们在 LdapClientHost(宿舍内的电脑)上的应用将数据发送到本机的 7001 端口。
  • 而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServerHost(实验室的服务器) 的 SSH Server 上。
  • SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上。
  • 最后再将从 LDAP 返回的数据原路返回以完成整个流程。

注意点:

  1. 上面命令中 <remote host> 为什么用 localhost,它指向哪台机器呢?在本例中,它指向 LdapServerHost。我们为什么用 localhost 而不是 IP 地址或者是主机名呢?其实取决于我们之前是如何限制 LDAP 只能本机才能方法。如果只允许 lookback 接口访问的话,那么自然就只有 localhost 或者 IP 为 127.0.0.1 才能访问了,而不能用真实 IP 或主机名。
  2. 命令中的 <remote host><SSH hostname> 必须是同一台机器么?其实不一定,他们可以是两台不同的机器,稍后会有例子阐述。
  3. 我们已经在自己的电脑上(LdapClientHost)建立了端口转发,那么这个端口转发可以被其他机器使用么?比如说你宿舍的室友,室友的电脑(LdapClientHost2)来直接连接你的电脑(LdapClientHost)的70001端口?答案是不行的,在主流的 SSH 实现中,本地端口转发绑定的是 lookback 接口,也就是说只有 localhost 或者127.0.0.1 才能使用本机的端口转发,其他机器发起的连接只会得到 ”connection refused“。好在 SSH 提供了 GatewayPorts 关键字(参数 -g),我们可以指定它与其他机器共享这个端口转发。

ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

三、远程转发

第二个例子,这次假设由于网络或者防火墙的原因我们不能用 SSH 直接从 LdapClientHost 连接到 LDAP 服务器(LdapServerHost),但是反向链接却是被允许的。那次是我们的选择就是远程端口转发

61b4e11f8d88bfa96fead33d8db65cc6.png

命令格式:

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

命令实践:

这次不同的是我们需要在 LDAP服务器(LdapServerHost)上即服务器端执行如下命令

ssh -R 7001:localhost:389 LdapClientHost

数据流向:

其实数据流依然是一样的,我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServerHost 的 SSH Client 上。SSH Client 会解密收到的数据并将之转发到 LDAP 389 端口上,最后再将从 LDAP 返回的数据原路返回以完成整个流程。

到这里可能点模糊了,我们对比来看

四、本地转发与远程转发的对比与分析

不错,SSH Server,SSH Client,LdapServerHost,LdapClientHost,本地转发,远程转发,这么多的名词的确容易让人糊涂。

首先,SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那就是本地转发。而如果两个方向不一致,我们就说他是远程转发。更简单的来说:

本地转发:

LdapClientHost 同时是应用的客户端,也是 SSH Client,这两个连接从它指向 LdapServerHost、(即是 LDAP 服务端,也是 SSH Server)。

远程转发:

LdapClientHost 是应用的客户端,但却是 SSH Server;而 LdapServerHost 是 LDAP 的服务端,但却是 SSH Client。这样两个连接的方向刚好相反。

五、多主机转发

我们来看一个进阶版的端口转发。我们之前涉及到的各种连接/转发都只涉及到了两台机器,我们之前在本地转发中提到的一个问题——本地转发命令中的 <remote host><SSH hostname> 可以是不同的机器么?

答案是可以的。我们举一个涉及到四台机器的(A,B,C,D)的例子。

44b951d32b783340dfe1c82cf0708f9e.png

在 SSH Client(C)执行下列命令来建立 SSH 连接以及端口转发:

ssh -g -L 7001:<B>:389 <D>

然后在我们的应用客户端(A)上配置连接机器(C)的 7001 端口即可。注意我们在命令中制定了 “-g” 参数以保证机器(A)能够使用机器(C)建立的本地端口转发。另一个值得注意的地方是,在上述连接中,(A)<->(C)以及(B)<->(D)之间的连接并不是安全连接,他们之间没有经过 SSH 的加密以及解密。如果他们之间的网络并不是值得信赖的网络连接,我们就需要谨慎使用这种连接方式了。

六、动态转发实例

到现在为止,我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号,例如前面例子中的 LDAP 服务端的 389 端口。那如果没有这端口号这么办?什么样的应用会没有这个端口号呢?比如说用浏览器进行 Web 浏览,比如说 MSN 等等。

SSH 支持动态端口转发,由 SSH 来判断发起请求的工具使用的是什么应用层协议,然后根据判断出的协议结果决定目标端口。

SSH 动态端口转发是 SSH 客户端功能。

1b29c6b2a34eb9bd37c27f01acfdfcae.png

命令格式:

ssh -D <local port> <SSH Server>

命令实践:

ssh -D 7001 <SSH Server>

数据流向:

执行完命令后,只要在客户端程序工具将其自身的代理设置为 SSH Client:7001 ,则该程序所有产生的数据都将转发到该端口,再由该端口将数据通过隧道转发给 SSH Server,最后由 SSH Server 和互联网的应用层协议的端口进行通信。

以 IE 浏览器为例,我们将 IE 浏览器的代理设置为 SSH Client:7001,由于 IE 浏览器发起的请求使用的 http 协议(暂不考虑其他协议),那么 IE 浏览器产生的数据都转发的 SSH Client:7001,继而通过隧道转发给 SSH Server,SSH Server 能连接互联网,所有就实现了联网功能。

df3b59b02c63f5c3dddaa94f57a92940.png

0e86dc8049ce888468de55b62892b2f6.png

七、参考

实战 SSH 端口转发​www.ibm.com SSH隧道:端口转发功能详解 - 骏马金龙 - 博客园​www.cnblogs.com
65a65048b7f0ef334faa89bcbf4c355e.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值