SSH 管道 - 使用SSH进行端口转发

本文翻译自:SSH Tunnel – Port Forwarding With SSH

SSH 有很多功能,SSH 管道就是其中一个。SSH管道是两台机器间的安全连接,经常被称为“SSH隧道”,或者“端口转发”。

使用SSH,我们可以绑定本地计算机的指定端口到远程计算机上的指定端口。这将在这些机器之间创建加密的SSH 管道,并允许通过本地主机套接字地址直接与远程主机通信。我们可以使用SSH管道来保护不安全的连接或绕过防火墙的不同限制。

在我们创建我们的第一个SSH管道之前,你可以在你机器上的命令行下输入 “ssh” 命令来测试是否已经安装了SSH。如果你运行的是CentOS 6 迷你版本的系统,那么你可能需要安装 openssh-clients 软件包(Ubuntu 用户需要安装 openssh-client 软件包)。

这里有三种类型的端口转发,以及使用SSH管道的三种方式:

  • 本地端口转发(允许通过中间SSH服务器,从本地套接字地址访问目的套接字地址)

  • 远程端口转发(允许通过中间SSH服务器套接字地址,从远程位置访问localsocket地址)

  • 动态端口转发(SOCKS代理服务器 - 在本文中不涉及详细信息!)

我每天都使用“SSH管道”(本地端口转发),因为我的一个客户的环境被设计为只能在SSH服务的22端口上访问工作站的Linux服务器。所有其他基础设施设备都通过这个工作站才能访问,所以使用SSH管道是直接访问不同服务的最佳路径。

SSH 管道 - 本地端口转发

本地端口转发,您可以从本地机器连接到远程计算机,即使你不能通过本地机器直接连接到远程机器。为了达到这个目的,你需要一个可以通过SSH访问的中间服务器,并且这个服务器可以访问这些远程的机器。这个中间服务器可以驻留在您的本地网络内,并受到不同的防火墙策略影响或者是在你的本地网络之外。

例子 #1:

我们可以通过SSH的22端口访问一个工作站机器(用户名:wsuser,主机名:workstation),工作站机器的后面是一个应用服务器(主机名:appserver),在8080端口上运行着Apache Tomcat。我们不能通过本地机器在8080端口上访问这个Apache Tomcat的管理员页面,但是这个工作站机器可以访问Apache Tomcat 网页的8080端口。因此,我们可以创建一个SSH 管道,通过这个工作站,把我们本地机器的本地8080端口转发到这个应用服务器。

我们可以在我们的本地机器上运行下面的命令来实现这个需求:

ssh -f wsuser@workstation -L 8080:appserver:8080 -N

等到这个工作站机器的SSH 服务器认证成功后,连接就会被建立,当我们在本地机器上打开浏览器,输入 http://localhost:8080 就可以访问到那个应用服务器的Apache Tomcat 网页。

例子 #2:

假设我们的情况跟例子1一样,除了一个不同,那就是在工作站机器( 用户名: wsuser, 主机名: workstation)和应用服务器(用户名: appuser, 主机名: appserver)之间有一个防火墙,只允许通过SSH在22端口上从工作站机器访问应用服务器,意味着工作站机器不能直接访问Apache Tomcat 的8080端口。

还有一种从本地机器访问Apache Tomcat 管理员网页的方法,但是我们需要通过SSH进行两跳。

  1. SSH 连接到工作站机器

    ssh wsuser@workstation

  2. 当连接到工作站机器,通过SSH,把8080端口转发到应用服务器

    ssh -f appuser@appserver -L 8080:localhost:8080 -N

  3. 下一步需要通过SSH,把本地机器的8080端口转发到工作站机器

    ssh -f wsuser@workstation -L 8080:localhost:8080 -N

瞧,当我们在本地机器上打开浏览器,输入 http://localhost:8080 就可以访问到那个应用服务器的Apache Tomcat 网页了。

SSH 管道 - 远程端口转发

远程端口转发的实现与本地端口转发的实现一样。通过本地端口转发,我们可以使用一个有SSH服务的中间机器,从本地访问远程的机器。而通过远程端口转发,我们可以使用一个有SSH服务的中间机器,从远程访问本地机器。当然,为了实现这个,我们需要通过SSH连接到一个中间机器。当我们没有路由器的管理权限,不能在路由器级别上配置端口转发时,远程端口转发就显得非常有用,SSH管道就可以完成这种伎俩。

在我们开始远程端口转发之前,我们必须重新配置一个中间的机器上的SSH服务器来启用它。我们必须编辑“/ etc/ SSH/ sshd_config文件”,把以下选项取消注释并更改为“yes”:

GatewayPorts yes

当然,我们需要重启SSH服务。

例子 #1:

我们在本地的8080端口上运行了Apache Tomcat 服务。我们希望某个朋友,不是在本地网络上的,可以在8080端口上访问我们的Apache Tomcat管理员页面,帮助我们配置或者部署新的应用程序。幸运的是,我们有一个WebServer(用户名:myuser, 主机名:webserver),管理着一些网页,可以通过因特网访问的。同时也可以通过SSH,从我们本地机器访问这个WebServer。我们将配置一个远程端口转发,让我们的朋友可以通过这个WebServer来访问运行在我们本地机器上的Apahce Tomcat服务。

我们可以通过下面的代码来实现:

ssh -f myuser@webserver -R 8080:localhost:8080 -N

瞧,我们的朋友就可以通过WebServer 的8080端口来访问我们本地机器上运行的Apache Tomcat 服务了。

正如我们刚到的,这个命令与配置本地端口转发的命令唯一的不同就是把 “-L” 变成了“-R”。

SSH 管道 - 动态端口转发

动态端口转发会把你的机器变成一个SOCKS代理。SOCKS代理可以代理所有通过网络或者因特网的请求。但程序通常必须被配置为使用SOCKS代理。 SOCKS代理可以用下面的命令开启:

ssh -C -D 1080 localmachine

其中,-c选项启用压缩,-D选项指定动态端口转发和1080是标准的SOCKS代理服务器的端口。下一步将是重新配置你的Web浏览器在端口1080使用127.0.0.1作为SOCKS代理。

使用动态端口转发和配置浏览器以使用本地SOCKS代理服务器将加密所有访问您的Web浏览器的流量,使您的连接安全。

SSH 管道 – GeekPeek 提示

如果你是在一个非默认端口上运行SSH服务器,运行SSH服务时,需要通过 “-p” 来指定端口。

ssh -f wsuser@workstation -p 22222 -L 8080:appserver:8080 -N

在进行本地端口转发或者远程端口转发之前,仔细检查那些已经在中间服务器上使用的端口,您可以使用netstat命令和grep命令来检查要转发的端口。

netstat -anp |grep 8080

不要忘了在进行远程端口转发之前,重新配置SSH 服务,已经重启SSH服务器。

GatewayPorts yes

“-f”选项要求SSH运行在后台,“-N”选项告诉SSH不要执行远程命令。如果你不想SSH进入后台,可以移除这两个选项。

请确保你的iptables的配置与你配置的端口转发规则兼容!

最近的文章

有弹性,可伸展的UICollectionView 头部视图

本文翻译自:Stretchy UICollectionView headers滚动视图的反弹效果可能是iOS中最具特色的效果之一。虽然最初只是华而不实,但随着时间的推移,实际上它已经发挥了一些功能用途,像下拉刷新。另一个很好地应用滚动视图的反弹效果的,就是我最近看到的弹性头部视图。这个效果非常好,当你向下拉动滚动视图时,可以在顶部和底部查看更多的图片内容。你可能已经在Twitter的iOS应用和Airbnb清单中看到类似的效果了。这种效果很容易实现,今天我将向您展示如何去做。让我们开始...…

iOS继续阅读
更早的文章

Radare - 逆向工程框架

本文翻译自:Radare – The Reverse Engineering FrameworkRadare开始作为一个简单的命令行界面的十六进制编辑器,支持64位偏移量以从磁盘中搜索和恢复数据。它已演变成由一个以十六进制编辑器为中心所组成的项目,包括组装/分解器,代码分析,脚本功能,分析和图形化代码与数据,并容易与unix集成。从本质上讲,它已经成为一个逆向工程框架,插件等等。radare2本身就是这个十六进制编辑器和调试器的核心。允许从不同的IO访问,如磁盘,网络,内核插件,远程设...…

逆向工程继续阅读