SSH 管道 - 使用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进行两跳。
-
SSH 连接到工作站机器
ssh wsuser@workstation
-
当连接到工作站机器,通过SSH,把8080端口转发到应用服务器
ssh -f appuser@appserver -L 8080:localhost:8080 -N
-
下一步需要通过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的配置与你配置的端口转发规则兼容!