内容简介:SSH 端口转发(port forwarding)是一种之后将会看到,我们这个例子属于其中的第二项功能,因为我们希望与远程机器建立一个 TCP 链接无法实现的连接。有关 SSH 端口转发的介绍,下文是一个非常好的材料(并且是中文的):英文材料可以看:
SSH 端口转发(port forwarding)是一种 将其他 TCP 端口的网络数据通过 SSH 链接来转发 的技术, 也被称作“隧道”(tunneling)。SSH 端口转发能够提供两大有用的功能:
- 加密 SSH 客户端至服务端之间的通信连接(因为SSH连接自动提供了相应的加密和解密服务)
- 绕过防火墙的限制完成一些之前无法建立的 TCP 连接
之后将会看到,我们这个例子属于其中的第二项功能,因为我们希望与远程机器建立一个 TCP 链接无法实现的连接。有关 SSH 端口转发的介绍,下文是一个非常好的材料(并且是中文的):
英文材料可以看:
本文从实际例子出发介绍端口转发的应用。其中很多引用到 实战SSH端口转发 的内容,非常推荐大家去读读这篇文章。
为什么需要端口转发?
让我们先来回顾一下我们已经实现了什么:我们利用 python flask 搭建起了一个简单的服务器,启动之后能够监听本地主机(localhost)的某个端口然后提供服务,显示我们准备好的网页文件。
然而我们注意到,一直以来我们只是在 本地机器 上对某个端口进行访问。那么,这个端口是否能够被远程机器所访问呢?换句话说,一个远程的客户端是否能够通过连接这个TCP端口实现对服务器的访问呢?通常在以下两种情况下, 答案是否定的:
- 服务器上的配置限制了只有通过本地主机才能连接此服务器。
- 由于防火墙的限制,无法用SSH直接从外部连接到此服务器(比如说服务器处于内网之中)。
这时候我们就需要用到端口转发技术来实现对服务器的远程访问了。
实例环境
假设我们是在一个“公家”机器上搭建的服务器(比如说你工作所在单位配备的机器),该机器能够被外部网络连接(SSH)。但是公司一般会对该机器的外部访问权限进行限制,即只允许外部网络通过 SSH 端口连接。比如说我们可以尝试在远程客户端的浏览器窗口输入服务器的 IP 地址和相应的监听端口,会发现服务器并没有反应,说明我们并没有办法从外部网络通过 TCP 端口来连接。
本地端口转发
虽然“公家”机器对外部连接进行了限制,我们可以使用 本地端口转发 (local port forwarding)实现从远程机器连接到服务器。
假设服务器监听的端口是5000,IP地址是 ServerHost。那么我们可以从 远程机器 (客户端)输入以下命令实现本地端口转发:
ssh -L 7001:localhost:5000 ServerHost
建立起该 SSH 连接之后,我们只要在远程机器(客户端)上访问本机的7001端口(localhost:7001),便实现连接到服务器5000端口的效果。 That’s all!(很神奇有木有?)
用法解析
首先,该命令建立了一个从远程机器到 ServerHost 的SSH连接,而 -L 选项指定了我们需要建立一个本地端口转发。
其中,7001是我们希望在远程机器上配置的端口(一般选用一个1024-65535之间并尚未被使用的端口即可)。5000是服务器在服务端监听的端口。localhost 指的就是 ServerHost 的本地主机,因为我们限制了只允许(服务端)本机上部署的应用才能连接到此服务器。因此,本地端口转发的完整命令是这样的:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
在我们的例子中,local 指的就是远程的客户端机器,remote指的是服务端的服务器机器,填入对应的内容就可以得到我们前面输入的命令了。
我们来捋一下建立起本地端口转发之后,数据是怎么通过 SSH 端口流动的:
- 首先,我们在远程机器(客户端)上访问本机的7001端口
- 此时本机会将这个从7001端口接收到的访问数据加密并通过建立起的 SSH 通道转发到服务端机器 ServerHost上
- 由于数据是通过 SSH 通道发送的,所以数据实际发送和接受的端口是25端口(一般SSH都用这个)
- 服务端机器接收到该数据之后,再将数据转发到服务器监听的5000端口上
- 服务器对数据请求进行回应,然后按照原路返回要回应的数据以完成整个流程
简而言之,本地端口转发的作用是: 将远程服务器监听的端口映射到本机的某个端口上,以致访问本机的该端口就可以实现访问远程服务器端口的效果 (这里远程是对于发起请求的客户端机器而言)。而整个数据连接过程实际上是通过 SSH 通道及其端口实现的(是不是有种暗度陈仓的感觉)。
进阶版
利用本地端口转发,我们实现了从远程的客户端机器访问服务端的服务器。可是这个这个端口转发只能够被该客户端机器这 一台机器 使用。这是因为在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“connection refused.”。
那我们能不能实现让其他远程机器能够 共享 该客户端机器的本地端口转发,从而都能访问到这个服务器呢?答案是肯定的,SSH 提供了 GatewayPorts 的关键字来实现这个“共享”的功能,只需要加上 -g 选项就行了:
ssh -g -L 7001:localhost:5000 ServerHost
假设客户端机器的IP地址为 ClientHost,这样其他机器就可以通过访问 ClientHost:7001 来访问服务器了。
后记
利用 SSH 端口转发,我们可以方便地实现对远程服务器进行 TCP 连接的效果。这里我们还要注意一个问题:SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。
另外,本文只介绍了端口转发当中的一种 – 本地端口转发。其实还有远程端口转发和动态端口转发等有趣的技术。由于没有在这个项目中实践过,就不提及了。感兴趣的朋友可以去看这篇介绍: 实战SSH端口转发
最后,感谢白俄罗斯友人 Vasili 为我指出了这个使用端口转发技术实现远程访问服务器 TCP 连接的思路!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Nginx+Tomcat实现80端口转发8080端口
- 猎鹰网络安全工具新功能:主机端口扫描可以自定义端口范围
- nginx代理其他端口到80端口-低调小熊猫的技术小黑屋
- 浅析Linux网络端口
- 443端口共用的方案
- 端口复用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python深度学习
[美] 弗朗索瓦•肖莱 / 张亮 / 人民邮电出版社 / 2018-8 / 119.00元
本书由Keras之父、现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。书中包含30多个代码示例,步骤讲解详细透彻。由于本书立足于人工智能的可达性和大众化,读者无须具备机器学习相关背景知识即可展开阅读。在学习完本书后,读者将具备搭建自己的深度学习环境、建......一起来看看 《Python深度学习》 这本书的介绍吧!