一、简单例子
1.1、本地转发(bind_address=localhost,host=localhost)
1.1.1、环境设定
现在有机器A和机器B,A中运行SSH Client,B中运行SSH Server,在B中运行着Mysql服务,监听端口为3306。在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.1.2、具体应用
可以建立一个SSH连接的本地转发,使得监听A中的5010端口,将传输给该端口的数据通过A和B之间的SSH隧道转发给B中的3306端口,即访问A中的5010端口就能够访问B中的3306端口,这样子就能使用B的Mysql服务。(这里限制只有来自于A自身的对5010端口的访问才被允许通过SSH隧道,即设置“bind_address=localhost”)
A中建立SSH连接的命令如下:
1 | ssh -L localhost:5010:localhost:3306 B |
1.2、远端转发(bind_address=localhost,host=localhost)
1.2.1、环境设定
现在有机器A和机器B,A处于公司内部网络中,没有自身的对外IP地址,B具有自身的对外IP(即A能够直接访问B,而B不能够直接访问A)。A中运行SSH Client,B中运行SSH Server,A中运行Mysql服务,监听端口为3306。在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.2.2、具体应用
可以建立一个SSH连接的远端转发,使得监听B中的5010端口,将传输给该端口的数据通过A和B之间的SSH隧道转发给A中的3306端口,即访问B中的5010端口就能够访问A中的3306端口,这样子就能使用A的Mysql服务。(这里限制只有来自于B自身的对5010端口的访问才被允许通过SSH隧道,即设置“bind_address=localhost”)
A中建立SSH连接的命令如下:
1 | ssh -R localhost:5010:localhost:3306 B |
1.3、动态转发(bind_address=localhost)
1.3.1、环境设定
现在有机器A和B,A处于某个防火墙内,不能访问有些网页,B处于防火墙之外,能够访问所有网页。A中运行SSH Client,B中运行SSH Server。在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.3.2、具体应用
可以建立一个SSH连接的动态转发,使得监听A中的5010端口,将传输给该端口的数据通过A和B之间的SSH隧道转发给B,在B处根据应用协议动态决定数据转发的目的地和目的端口,比如http://www.youtube.com:80
。即将数据请求传递给A中的5010端口,该数据请求被转发给B,B会根据应用协议动态决定数据请求转发的目的地和目的端口,以B的身份去进行数据请求,然后将返回得到的数据传输给“将数据传递给A中的5010端口的应用程序”。(这里限制只有来自于A自身的对5010端口的访问才被允许通过SSH隧道,即设置“bind_address=localhost”)
A中建立SSH连接的命令如下:
1 | ssh -D localhost:5010 B |
1.4、“X11”SSH连接
1.4.1、环境设定
现在有机器A和机器B,A中运行SSH Client,B中运行SSH Server,B中的sshd_config文件中配置允许建立“X11”SSH连接。
在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.4.2、具体应用
可以建立一个“X11”SSH连接,使得能够打开B中的图形界面应用程序,并在A中显示,数据通过A和B之间的SSH隧道传输。
A中建立SSH连接的命令如下:
1 | ssh -X B |
1.5、本地转发(bind_address=localhost,host=非localhost)
1.5.1、环境设定
现在有机器A,B和C,A中运行SSH Client,B中运行SSH Server,C中运行Mysql服务,监听端口为3306,A跟C不能直接连接,A跟B能够直接连接,B跟C能够直接连接。在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.5.2、具体应用
可以建立一个SSH连接的本地转发,使得监听A中的5010端口,将传输给该端口的数据通过A和B之间的SSH隧道转发给C中的3306端口,即访问A中的5010端口就能够访问C中的3306端口,这样子就能使用C的Mysql服务。(这里限制只有来自于A自身的对5010端口的访问才被允许通过SSH隧道,即设置“bind_address=localhost”)
A中建立SSH连接的命令如下:
1 | ssh -L localhost:5010:C:3306 B |
1.6、远端转发(bind_address=非localhost,host=非localhost)
1.6.1、环境设定
现在有A,B,C和D四台机器,在这四台机器的两两关系中,只有“A与B”和“C与D”能够直接连接,另外还有“半个连接”,即B处于公司内部网络中,没有自身的对外IP地址,C具有自身的对外IP(即B能够直接访问C,而C不能够直接访问B)。在B中运行SSH Client,在C中运行SSH Server,在A中运行Mysql服务,监听3306端口。在B中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。
1.6.2、具体应用
可以建立一个SSH连接的远端转发,使得监听C中的5010端口,将传输给该端口的数据通过B和C之间的SSH隧道转发给A中的3306端口,即在D中访问C中的5010端口就能够访问A中的3306端口,这样子就能使用A的Mysql服务。(要设定允许D可以访问C中的5010端口,可以配置“bind_address=D”或者“bind_address=*”)
B中建立SSH连接的命令如下:
1 | ssh -R D:5010:A:3306 C |
二、复杂例子
2.1、环境设定
现在有机器A和B,A处于公司内部网络中,没有自身的对外IP地址,B具有自身的对外IP(即A能够直接访问B,而B不能够直接访问A)。A中运行SSH Client和SSH Server,B中运行SSH Client和SSH Server。在A中的ssh_config文件中已经配置好“Host,HostName,User,Port,IdentityFile”。A中的SSH Server监听端口为22。
2.2、具体应用
可以建立一个SSH连接的远端转发,使得监听B中的5010端口,将传输给该端口的数据通过A和B之间的SSH隧道转发给A中的22端口,即访问B中的5010端口就能够访问A中的22端口,这样子就能使用A的SSH Server服务。(这里限制只有来自于B自身的对5010端口的访问才被允许通过SSH隧道,即设置“bind_address=localhost”)
A中建立SSH连接的命令如下:
1 | ssh -R localhost:5010:localhost:22 B |
然后在B中,执行如下命令:
1 | ssh -p 5010 -l loginuser -i identityfile A |
当然这些参数可以在B中的ssh_config文件中通过“Host,HostName,User,Port,IdentityFile”配置。
2.3、总结
以上是两层SSH连接,第一层SSH连接的身份是隧道,第二层SSH连接的身份是应用连接。
不过可以再增加第三层应用,此时第一层和第二层SSH连接的身份都为隧道。