SSH端口转发

Posted 南岸青栀*

tags:

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

血虐,被问到了我完全不知道,在此记录一下
好的,之后回忆,发现自己又说NAT端口映射,大概率是自己给自己挖坑,不管怎么样,那就学习一下端口转发

参考
https://www.yuque.com/rjwang1982/kr42ak/dc8dc374a4ef9351e1bb2502cb6825d6
https://www.cnblogs.com/keerya/p/7612715.html#_label1

端口转发概念

也是看到很多对SSH端口转发的定义吧!

首先,SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。同时SSH还提供了一个非常有用的功能,那就是端口转发。主要作用就是能将其他TCP端口的网络数据通过SSH连接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做隧道(tunneling)

例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,
如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。

SSH端口能够提供两大功能:

  • 加密SSH Client端到SSH Server端之间的通信数据。
  • 突破防火墙的限制,完成一些之前无法建立的TCP连接。

SSH端口转发

本地端口转发

假设实验室有一台LDAP服务器,但是限制只有本地上部署的应用才能直接连接此LDAP服务器。如果我们由于调试或者测试需要临时从远端及其直接连接到LDAP服务器,就会使用本地端口转发

命令格式:

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

对参数的一个说明吧,毕竟直接给出也是云里雾里

  • localport:本机开启的端口号
  • remotehost:最终连接机器的IP地址
  • remotehostport:转发机器的端口号
  • sshserver:转发机器的IP地址。

在ladpClientHost上执行如下命令就可建立SSH的本地端口转发

$ ssh -L 7001:localhost:389 LdapServerHost

注:关于端口选择,在选择端口时需要注意非管理员账号无权绑定1-1023端口的,所以一般在选用一个1024-65535之间的并且尚未使用的端口号即可。

数据流过程

  • 首先ldapClientHost上的应用将数据发送到本地的7001端口上
  • 本机的SSH Client会将7001端口收到的数据加密并转发到ldapServerHost的SSH Server上。
  • SSH Server会解密收到的数据并将之转发到监听的LDAP 389端口上,
  • 最后再将从LDAP返回的数据原路返回,这样就算完成整个流程

整个过程中应用并没有直接连接LDAP服务器,而是连接到了本地的一个监听端口,但SSH端口转发完成了剩下的所有事情,加密,转发,解密,通讯。

解惑

  • 1.必须保持这个SSH连接使得端口转发保持生效。
  • 2.你可能会疑惑上面命令中的 为什么用 localhost,它指向的是哪台机器呢?在本例中,它指向 LdapServertHost 。我们为什么用 localhost 而不是 IP 地址或者主机名呢?其实这个取决于我们之前是如何限制LDAP 只有本机才能访问。如果只允许 lookback 接口访问的话,那么自然就只有 localhost 或者 IP 为127.0.0.1 才能访问了,而不能用真实 IP 或者主机名。
  • 3.命令中的 和 必须是同一台机器么?其实是不一定的,它们可以是两台不同的机器
  • 4.我们已经在 LdapClientHost 建立了端口转发,那么这个端口转发可以被其他机器使用么?比如能否新增加一台 LdapClientHost2 来直接连接 LdapClientHost 的 7001 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
#     -g    Allows remote hosts to connect to local forwarded ports.  If used on a multiplexed connection, then this option must be specified on the master process.
ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

实验(先不做PASS掉)

远程转发

假设由于网络或防火墙的原因,我们不能用SSH直接从ldapClientHost连接到LDAP服务器。但是 反向连接却是被允许的(从LDAP ServerHost 发起ssh 连接到LDAPClientHost)。那此时我们的选择自然就是远程端口转发了。

命令格式:

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

例如在 LDAP 服务器(LdapServertHost)端执行如下命令:

$ ssh -R 7001:localhost:389 LdapClientHost


和本端短裤转发相比,,这次的图例,SSH Server和SSH Client的位置对调了一下,但是数据流依然是一样的。我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Client 上。 SSH Client 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,最后再将从 LDAP 返回的数据原路返回以完成整个流程。

本地转发和远端转发对比

首先SSH连接是有方向的,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

本地转发时:
LdapClientHost 同时是应用的客户端,也是 SSH Client,这两个连接都从它指向 LdapServertHost(既是 LDAP 服务端,也是 SSH Server)。
远程转发时:
LdapClientHost 是应用的客户端,但却是 SSH Server ;而 LdapServertHost 是 LDAP 的服务端,但却是 SSH Client 。这样两个连接的方向刚好相反。

多主机转发应用


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

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

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

动态转发(典型科学上网解决方案)

例如前面例子中的 LDAP 服务端的 389 端口。那如果没有这个端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器进行 Web 浏览,比如说 MSN 等等。
当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。让我们先来看一下动态转发的命令格式:

$ ssh -D <local port> <SSH Server>


依然选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。

X转发

日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。
使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:

export DISPLAY=<X Server IP>:<display #>.<virtual #>

例如:

export DISPLAY=myDesktop:1.0

然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。
一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。(当然,使用此方法前最好先咨询相关 IT 部门是否符合相应的安全条例,以免造成违规操作。)
建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:

$ ssh -X <SSH Server>

前面我们大概了解了本地端口转发,远程端口转发,动态端口转发和X转发。对这些SSH端口转发我们就只是做简单的理解吧。下次如果还有机会,希望自己可以讲出来。

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

ssh的代理和端口转发机制介绍

SSH进行端口转发

SSH 内网端口转发实战

SSH -R 远程端口转发

SSH端口转发

ssh服务端口转发详解