以下是作者本人在公司工作过程中遇到的案例,使用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”中已经配置好如下内容:
1 | Host B1 |
1.2.1、解决方案1
在A1上执行以下命令建立SSH的本地转发:
1 | ssh -L localhost:5010:B2:3306 B1 |
现在在A1中访问A1中的5010端口就可以使用B2上的Mysql服务。
具体的连接B2上的Mysql服务的命令如下:
1 | mysql -h localhost -P 5010 -u '合法的Mysql账户' -p'合法的Mysql密码' |
1.2.2、解决方案2
在A1上执行以下命令建立SSH的动态转发:
1 | 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服务的命令如下:
1 | 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”中已经配置好如下内容:
1 | Host B1 |
2.2.1、解决方案1
在A1上执行以下命令建立SSH的本地转发:
1 | ssh -L localhost:5010:B2:8080 B1 |
现在在A1中访问A1中的5010端口就可以使用B2上的Web服务。
具体的使用B2上的Web服务的方式如下:在A1的浏览器中访问http://localhost:5010
。
2.2.2、解决方案2
在A1上执行以下命令建立SSH的动态转发:
1 | 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”中已经配置好如下内容:
1 | Host B1 |
3.2.1、解决方案1
首先获取B2-BN这些机器上Web服务对应的端口,比如分别为“8080,8081,8082…8090”,然后在A1上针对每台机器建立一个SSH本地转发,SSH命令形式如下:
1 | ssh -L localhost:5010:B2:8080 B1 |
现在在A1中访问A1中的5010端口就可以访问B2上的Web服务,访问A1中的5011端口就可以访问B3上的Web服务,依此类推。
具体的使用B2上的Web服务的方式如下:在A1的浏览器中访问http://localhost:5010
。
以上方案繁杂不方便,如果“B2到BN”的机器数量非常大,那么工作量会非常巨大。
3.2.2、解决方案2
在A1上执行以下命令建立SSH的动态转发:
1 | 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
。