【SSH隧道】使用

来源:互联网 发布:淘宝男装棉服 编辑:程序博客网 时间:2024/04/30 03:19

SSH隧道

SSH隧道(即SSH代理、端口转发),接触过Linux系统的都知道SSH,对于SSH隧道,如果之前没接触过,只知道这个概念、网上搜索这方面的资料的话,网上的资料把简单的问题复杂化了,写的很复杂很繁琐。 主要还是理解映射二字。把本地端口映射到远程机器端口,然后访问远程的端口就相当于访问的本地端口,这就是远程SSH隧道。把远程机器的端口通过中间服务器映射到本地端口。然后访问本地端口,就相当于访问到了远程的服务器端口,这就是本地SSH隧道。

建立SSH隧道命令

ssh -C -f -N -L listen_port:DST_Host:DST_port user@Tunnel_Host 
ssh -C -f -N -R listen_port:DST_Host:DST_port user@Tunnel_Host 
ssh -C -f -N -D listen_port user@Tunnel_Host

-L port:host:hostport #建立本地SSH隧道(本地客户端建立监听端口)
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 

-R port:host:hostport #建立远程SSH隧道(隧道服务端建立监听端口)
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 
# 有本地映射肯定有远程映射,就是把-L换成-R,这样我们访问远程主机的端口就相当于访问本地的端口,但感觉作用不大。

-D port 
指定一个本地机器 “动态的’’ 应用程序端口转发. 

-C 压缩数据传输。

-N Do not execute a shell or command. 
不执行脚本或命令,仅仅做端口转发。通常与-f连用。
-f Fork into background after authentication. 
后台认证用户/密码,不用登录到远程主机。


-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。把其他远程机器的端口通过中间服务器映射到本地端口上来。然后本地就能通过中间服务器访问了远程服务器了。

-R X:Y:Z 的含义就是把我们本地的Y机器的Z端口映射到远程机器的X端口上。把本地端口映射到远程机器的端口上去。然后远程机器访问X端口,就相当于访问的是本地机器了。前提是,本地到远程机器的网络是通的,才能把本地的端口映射到远程机器上去。

建立本地SSH隧道

需求:A访问服务器C,但是A--B之间的防火墙规则限制了A对C的访问

在我们计划建立一个本地SSH隧道之前,我们必须清楚下面这些数据:
  1. 中间服务器d的IP地址
  2. 要访问服务器c的IP地址
  3. 要访问服务器c的端口




线路A-B-C上A-B之间的防火墙屏蔽了对C服务器的访问。与此同时,我们也很快注意到,线路A-B-D之间、D-C之间是不受阻碍的。相信你已经想到了,在A-B之间的防火墙规则不会屏蔽对机器D的访问。因此 我们可以通过机器d建立一个通道A-B-D-C,从而访问到机器C上的数据。
  1. 需要访问234.234.234.234的FTP服务,也就是端口21
  2. 中间服务器是123.123.123.123
使用下面这条命令来达成我们的目的
 
ssh -N -f -L 2121:234.234.234.234:21123.123.123.123
ftp localhost:2121 # 现在访问本地2121端口,就能连接234.234.234.234的21端口了
 
这里我们用到了SSH客户端的三个参数,下面我们一一做出解释:
  • -N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
  • -f 告诉SSH客户端在后台运行
  • -L 做本地映射端口,被冒号分割的三个部分含义分别是最后一个参数是我们用来建立隧道的中间机器的IP地址(IP: 123.123.123.123)
  • 需要使用的本地端口号
  • 需要访问的目标机器IP地址(IP: 234.234.234.234)
  • 需要访问的目标机器端口(端口: 21)
我们再重复一下-L参数的行为。-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。然后就能直接通过访问本地IP+端口,访问到映射的IP+端口了。所以理解就是,把本地的端口转发到其他机器的端口上。在本地执行上面的命令。

建立远程SSH隧道

大多数公司的网络是通过路由器 接入互联网的,公司内部的机器不会直接与互联网连接,也就是不能通过互联网直接访问。通过线路D-B-A访问公司里的机器A便是不可能的。也许你已经注意 到了,虽然D-B-A这个方向的连接不通,但是A-B-D这个方向的连接是没有问题的。那么,我们能否利用一条已经连接好的A-B-D方向的连接来完成 D-B-A方向的访问呢?答案是肯定的,这就是远程SSH隧道的用途。
与本地SSH一样,我们在建立远程SSH隧道之前要清楚下面几个参数:
  • 需要访问内部机器的远程机器的IP地址(这里是123.123.123.123)
  • 需要让远程机器能访问的内部机器的IP地址(这里因为是想把本机映射出去,因此IP是127.0.0.1)
  • 需要让远程机器能访问的内部机器的端口号(端口:22)
在清楚了上面的参数后,我们使用下面的命令来建立一个远程SSH隧道,在192.168.0.100的主机上执行下面的命令:
ssh -Nf -R 2222:127.0.0.1:22123.123.123.123
 
现在,在IP是123.123.123.123的机器上我们用下面的命令就可以登陆公司的IP是192.168.0.100的机器了。
ssh -p 2222 localhost
 
-N,-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部分的含义分别是:
  • 远程机器使用的端口(2222)
  • 需要映射的内部机器的IP地址(127.0.0.1)
  • 需要映射的内部机器的端口(22)
例如:-R X:Y:Z 就是把我们内部的Y机器的Z端口映射到远程机器的X端口上。
========================================================
在大多数情况下,我们建立ssh隧道的时候,往往是想通过一台公网的主机或者是大家都可以访问的主机做跳转机,来访问内部或者外部不能直接访问的机器。所以一般像这种情况下,请将跳转机中的ssh服务器中的GatewayPorts设为yes
  1.建立本地的ssh隧道时,可以指定本地主机的地址,如下:
ssh -Nf -L 192.168.0.100:2121:234.234.234.234:21123.123.123.123
   那么本地局域网的任何机器访问192.168.0.100:2121都会自动被映射到234.234.234.234:21
  
  2.建立远程的ssh隧道时,可以指定公网的主机地址,不过一般情况是要访问内网的主机,所以这条命令应该在任何一台内网主机上执行,比如在192.168.0.102的主机上运行:
ssh -Nf -R 123.123.123.123:2222:192.168.0.100:22123.123.123.123
 只要在局域网里192.168.0.102可以直接连接内网主机192.168.0.100,且192.168.0.102可以直接与公网主机123.123.123.123建立ssh连接。那么任何外网主机通过访问公网主机123.123.123.123:2222就会被连接到192.168.0.100:22,从而可以完成外网穿越NAT到内网的访问,而不需要在内网网关和路由器上做任何操作。


以上内容参考网上某位博客,忘了地址。不好意思。

end

原创粉丝点击