0%

ssh端口转发真实应用

以下是作者本人在公司工作过程中遇到的案例,使用SSH端口转发进行解决。

一、案例一

1.1、案例描述

公司有两个网络A和B,作者的机器A1在网络A中,B中的机器都作为服务器之用,B中的机器互相之间能够连通。现在在B网络中存在两台机器B1和B2:B2对外没有提供IP地址(即A1不能直接连接B2),其上运行有MySQL服务,监听端口为3306;B1对外提供了IP地址(即A1能够直接连接B1),B1上运行SSH Server服务,监听端口为22,A1能够以“dsl”账户与该SSH Server进行连接,相应的私钥文件为“~/.ssh/dsl_private_key”。
现在的需求是:想要使A1能够使用B2的Mysql服务。

1.2、解决方案

解决方案有两种,一种是本地转发,另外一种是动态转发。
假定在A1的“~/.ssh/config”中已经配置好如下内容:

Host B1   
    HostName B1的对外IP地址   
    User dsl    
    Port 22  
    IdentityFile ~/.ssh/dsl_private_key   

1.2.1、解决方案1

在A1上执行以下命令建立SSH的本地转发:

ssh -L localhost:5010:B2:3306 B1  

现在在A1中访问A1中的5010端口就可以使用B2上的Mysql服务。
具体的连接B2上的Mysql服务的命令如下:

mysql -h localhost -P 5010 -u '合法的Mysql账户' -p'合法的Mysql密码'  

1.2.2、解决方案2

在A1上执行以下命令建立SSH的动态转发:

ssh -D localhost:5010 B1  

另外配置A1上的全局代理,使得A1上所有的对外连接请求都被转发给A1上的5010端口,转发给A1上的5010端口的数据会被转发给A1上的SSH Client,接着A1上的SSH Client通过SSH隧道将连接请求传递给B1上的SSH Server,然后由SSH Server代理去进行这些连接的请求。(注意,此时发起连接请求的源地址是B1,而不再是A1,而B1是有权限访问B2的)
此时具体的连接B2上的Mysql服务的命令如下:

mysql -h '在B网络中B2的内网地址' -P 3306 -u '合法的Mysql账户' -p'合法的Mysql密码'  

二、案例二

2.1、案例描述

公司有两个网络A和B,作者的机器A1在网络A中,B中的机器都作为服务器之用,B中的机器互相之间能够连通。现在在B网络中存在两台机器B1和B2:B2对外没有提供IP地址(即A1不能直接连接B2),其上运行有Web服务,监听端口为8080;B1对外提供了IP地址(即A1能够直接连接B1),B1上运行SSH Server服务,监听端口为22,A1能够以“dsl”账户与该SSH Server进行连接,相应的私钥文件为“~/.ssh/dsl_private_key”。
现在的需求是:想要使A1能够使用B2的Web服务。

2.2、解决方案

解决方案有两种,一种是本地转发,另外一种是动态转发。
假定在A1的“~/.ssh/config”中已经配置好如下内容:

Host B1   
    HostName B1的对外IP地址   
    User dsl    
    Port 22  
    IdentityFile ~/.ssh/dsl_private_key    

2.2.1、解决方案1

在A1上执行以下命令建立SSH的本地转发:

ssh -L localhost:5010:B2:8080 B1  

现在在A1中访问A1中的5010端口就可以使用B2上的Web服务。
具体的使用B2上的Web服务的方式如下:在A1的浏览器中访问http://localhost:5010

2.2.2、解决方案2

在A1上执行以下命令建立SSH的动态转发:

ssh -D localhost:5010 B1  

另外配置A1上的全局代理,使得A1上所有的对外连接请求都被转发给A1上的5010端口,转发给A1上的5010端口的数据会被转发给A1上的SSH Client,接着A1上的SSH Client通过SSH隧道将连接请求传递给B1上的SSH Server,然后由SSH Server代理去进行这些连接的请求。(注意,此时发起连接请求的源地址是B1,而不再是A1,而B1是有权限访问B2的)
此时具体的使用B2上的Web服务的方式如下:在A1的浏览器中访问http://‘在B网络中B2的内网地址’:8080

三、案例三

3.1、案例描述

公司有两个网络A和B,作者的机器A1在网络A中,B中的机器都作为服务器之用,B中的机器互相之间能够连通。现在在B网络中存在N台机器B1,B2,B3,B4…BN。B2到BN这些机器对外都没有提供IP地址(即A1不能直接连接这些机器),这些机器上面都运行有Web服务,监听端口位于“8080-8090”范围之内;B1对外提供了IP地址(即A1能够直接连接B1),B1上运行SSH Server服务,监听端口为22,A1能够以“dsl”账户与该SSH Server进行连接,相应的私钥文件为“~/.ssh/dsl_private_key”。
现在的需求是:想要使A1能够访问B2到BN这些机器的Web服务。

3.2、解决方案

解决方案有两种,一种是本地转发,另外一种是动态转发。
假定在A1的“~/.ssh/config”中已经配置好如下内容:

Host B1   
    HostName B1的对外IP地址   
    User dsl    
    Port 22  
    IdentityFile ~/.ssh/dsl_private_key    

3.2.1、解决方案1

首先获取B2-BN这些机器上Web服务对应的端口,比如分别为“8080,8081,8082…8090”,然后在A1上针对每台机器建立一个SSH本地转发,SSH命令形式如下:

ssh -L localhost:5010:B2:8080 B1  
ssh -L localhost:5011:B3:8081 B1  
ssh -L localhost:5012:B4:8082 B1  
ssh -L localhost:5013:B5:8083 B1  

现在在A1中访问A1中的5010端口就可以访问B2上的Web服务,访问A1中的5011端口就可以访问B3上的Web服务,依此类推。
具体的使用B2上的Web服务的方式如下:在A1的浏览器中访问http://localhost:5010
以上方案繁杂不方便,如果“B2到BN”的机器数量非常大,那么工作量会非常巨大。

3.2.2、解决方案2

在A1上执行以下命令建立SSH的动态转发:

ssh -D localhost:5010 B1  

另外配置A1上的全局代理,使得A1上所有的对外连接请求都被转发给A1上的5010端口,转发给A1上的5010端口的数据会被转发给A1上的SSH Client,接着A1上的SSH Client通过SSH隧道将连接请求传递给B1上的SSH Server,然后由SSH Server代理去进行这些连接的请求。(注意,此时发起连接请求的源地址是B1,而不再是A1,而B1是有权限访问B2到BN的)
此时具体的访问B2上的Web服务(假定Web服务端口为8080)的方式如下:在A1的浏览器中访问http://‘在B网络中B2的内网地址’:8080
此时具体的访问B3上的Web服务(假定Web服务端口为8081)的方式如下:在A1的浏览器中访问http://‘在B网络中B3的内网地址’:8081
此时具体的访问B4上的Web服务(假定Web服务端口为8082)的方式如下:在A1的浏览器中访问http://‘在B网络中B4的内网地址’:8082

您的支持将鼓励我继续分享!