你会用到OpenSSH的8种场景

对于 Secure Shell (SSH) 这样的网络协议来说,其主要职责就是在终端模式下访问一个远程系统。因为 SSH 协议对传输数据进行了加密,所以通过它在远端系统执行命令是安全的。此外,我们还可以在这种加密后的连接上通过创建隧道(端口转发)的方式,来实现两个不同终端间的互联。凭借这种方式,只要我们能通过 SSH 创建连接,就可以绕开防火墙或者端口禁用的限制。

OpenSSH

这个话题在网络领域有大量的应用和讨论:

O’Reilly: Using SSH Tunneling

Ssh.com: Tunneling Explained

Ssh.com: Port Forwarding

SecurityFocus: SSH Port Forwarding

Red Hat Magazine: SSH Port Forwarding

我们在接下来的内容中并不讨论端口转发的细节,而是准备介绍一个如何使用 OpenSSH 来完成 TCP 端口转发的速查表,其中包含了八种常见的场景。有些 SSH 客户端,比如 PuTTY,也允许通过界面配置的方式来实现端口转发。而我们着重关注的是通过 OpenSSH 来实现的的方式。

在下面的例子当中,我们假设环境中的网络划分为外部网络(network1)和内部网络(network2)两部分,并且这两个网络之间,只能在 externo1 与 interno1 之间通过 SSH 连接的方式来互相访问。外部网络的节点之间和内部网络的节点之间是完全联通的。

OpenSSH

SSH tunnels: no tunnel

场景 1

在 externo1 节点访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = localhost / 主机 = localhost )

externo1 节点可以通过 OpenSSH 连接到 interno1 节点,之后我们想通过其访问运行在 5900 端口上的 VNC 服务。

OpenSSH

SSH Tunnels: Scenario 1

我们可以通过下面的命令来实现:

externo1 $ ssh -L 7900:localhost:5900 user@interno1 

现在,我们可以在 externo1 节点上确认下 7900 端口是否处于监听状态中:

externo1 $ netstat -ltn 

Active Internet connections  (only servers) 

Proto Recv-Q  Send-Q  Local Address Foreign Address State       

... 

Tcp  0  0  127.0.0.1:7900  0.0.0.0:*  LISTEN   

... 

我们只需要在 externo1 节点上执行如下命令即可访问 internal 节点的 VNC 服务:

externo1 $ vncviewer localhost::7900 

注意:在 vncviewer 的 man 手册中并未提及这种修改端口号的方式。在 About VNCViewer configuration of the output TCP port 中可以看到。这也是 the TightVNC vncviewer 所介绍的的。

场景 2

在 externo2 节点上访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = 0.0.0.0 / 主机 = localhost)

这次的场景跟方案 1 的场景的类似,但是我们这次想从 externo2 节点来连接到 interno1 上的 VNC 服务:

OpenSSH

SSH Tunnels: Scenario 2

正确的命令如下:

externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1 

看起来跟方案 1 中的命令类似,但是让我们看看 netstat 命令的输出上的区别。7900 端口被绑定到了本地(127.0.0.1),所以只有本地进程可以访问。这次我们将端口关联到了 0.0.0.0,所以系统允许任何 IP 地址的机器访问 7900 这个端口。

externo1 $ netstat -ltn 

Active Internet connections  (only servers) 

Proto Recv-Q  Send-Q  Local Address Foreign Address State       

... 

Tcp  0  0  0.0.0.0:7900  0.0.0.0:*  LISTEN 

...  

所以现在在 externo2 节点上,我们可以执行:

externo2 $ vncviewer externo1::7900 

来连接到 interno1 节点上的 VNC 服务。

除了将 IP 指定为 0.0.0.0 之外,我们还可以使用参数 -g(允许远程机器使用本地端口转发),完整命令如下:

externo1 $ ssh -g -L 7900:localhost:5900 user@interno1 

这条命令与前面的命令能实现相同效果:

externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1 

换句话说,如果我们想限制只能连接到系统上的某个 IP,可以像下面这样定义:

externo1 $ ssh -L 192.168.24.80:7900:localhost:5900 user@interno1 

externo1 $ netstat -ltn 

Active Internet connections (only servers) 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读