ssh程序是SSH Client中的客户程序,下面根据不同应用场景中ssh程序的使用来介绍ssh程序。
一、基本应用场景
在本应用场景中,建立SSH连接,允许进行“用户登录,命令执行等”操作。
1.1、建立ssh连接命令
在本场景中,使用ssh程序建立SSH连接的命令如下:
1 | ssh -l dslztx -i ~/.ssh/id_dsa -p 22 192.168.1.5 |
1.1.1、选项的含义
1、“-i”
指定私钥文件
2、“-p”
指定SSH Server监听端口
3、“-l”
指定SSH连接登录用户
4、“192.168.1.5”
表示SSH Server所在机器的IP地址
1.1.2、ssh_config文件中对应的配置
以上这些参数值可在“ssh_config文件”中配置,配置后内容如下:
1 | Host RemoteHost #指定配置匹配条件 |
现在执行ssh RemoteHost
命令,即可达到跟执行原来命令相同的效果。
二、SSH隧道应用场景
在本应用场景中,建立SSH连接,将SSH连接作为隧道。在继续之前,首先进行以下几点说明:
- SSH Client端所在的机器称为“本地机器”,SSH Server端所在的机器称为“RemoteHost”
- “-l,-i,-p,域名或者ip地址”这些参数的参数值已经在“ssh_config文件”中配置
- 根据《SSH协议》,ssh连接必须由SSH Client请求建立,但是一旦得以建立,数据通信请求既可由SSH Client发起,也可由SSH Server发起,即在SSH连接建立后,可由任意端发起数据通信请求
使用SSH隧道的应用具体又可细分为4种形式,下面分别进行介绍。
2.1、SSH Client端设定被监听的应用转发端口——本地转发
2.1.1、建立ssh连接命令
在本场景中,使用ssh程序建立SSH连接的命令如下:
1 | ssh -L [bind_address:]port:host:hostport RemoteHost |
2.1.1.1、选项的含义
1、“port”
本地机器的端口号,被监听的应用转发端口
2、“host”
当其值为“localhost”或者“127.0.0.1”时,相当于一个“相对地址”,它的绝对地址是“RemoteHost”;否则,它的绝对地址就是“host”值。(即以“RemoteHost”为参照基准)
3、“hostport”
“host”所表示机器上的端口号
4、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是本地机器,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“本地机器”为参照基准)
2.1.1.2、ssh_config文件中对应的配置
“[bind_address:]port:host:hostport”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“LocalForward”。
2.1.2、原理分析
建立的SSH连接被应用作为隧道,由于SSH Client端设定被监听的应用转发端口,因此应用连接必须由本地机器上的应用程序发起建立,称为本地转发。
具体的数据流图如图1所示。
图1
有以下几点需要注意:
- 执行
ssh -L [bind_address:]port:host:hostport RemoteHost
建立SSH连接隧道,设置好被监听的转发端口,转发目标地址和端口等参数 - 应用连接由本地机器上的应用程序发起建立
- 在应用连接由本地机器上的应用程序发起建立之后:
当“bind_address”为“127.0.0.1/localhost”,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道5。依此类推
2.2、SSH Server端设定被监听的应用转发端口——远端转发
2.2.1、建立ssh连接命令
在本场景中,使用ssh程序建立SSH连接的命令如下:
1 | ssh -R [bind_address:]port:host:hostport RemoteHost |
2.2.1.1、选项的含义
1、“port”
“RemoteHost”上的端口号,被监听的应用转发端口
2、“host”
当“host”值为“localhost”或者“127.0.0.1”时,相当于一个“相对地址”,它的绝对地址是“本地机器”;否则,它的绝对地址就是“host”值(即以本地机器为参照基准)
3、“hostport”
“host”所表示机器上的端口号
4、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是“RemoteHost”,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“RemoteHost”为参照基准)
2.2.1.2、ssh_config文件中对应的配置
“[bind_address:]port:host:hostport”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“RemoteForward”。
2.2.2、原理分析
建立的SSH连接被应用连接作为隧道,由于SSH Server端设定被监听的应用转发端口,因此应用连接由“RemoteHost”上的应用程序发起建立,称为远端转发。
(注意,SSH连接隧道由SSH Client发起建立,但是一旦得以建立SSH Client和SSH Server都可在SSH连接隧道上发起数据通信请求。因而“RemoteHost”上的应用程序发起建立应用连接的请求,进而由SSH Server在SSH连接隧道上发起相应的数据通信请求是可行的)
具体的数据流图如图2所示。
图2
有以下几点需要注意:
- 执行
ssh -R [bind_address:]port:host:hostport RemoteHost
建立SSH连接隧道,设置好被监听的转发端口,转发目标地址和端口等参数 - 应用连接由“RemoteHost”上的应用程序发起建立
- 在应用连接由“RemoteHost”上的应用程序发起建立之后:
当“bind_address”为“127.0.0.1/localhost”,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道5。依此类推
2.3、动态转发
2.3.1、建立ssh连接命令
在本场景中,使用ssh程序建立SSH连接的命令如下:
1 | ssh -D [bind_address:]port RemoteHost |
2.3.1.1、选项含义
1、“port”
本地机器的端口号,被监听的动态转发端口
2、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是本地机器,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“本地机器”为参照基准)
2.3.1.2、ssh_config文件中对应的配置
“[bind_address:]port”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“DynamicForward”。
2.3.2、原理分析
建立的SSH连接被应用作为隧道,由于SSH Client端设定被监听的应用动态转发端口,因此应用连接必须由本地机器上的应用程序发起建立,但是跟“本地转发”不一样的是,转发目标地址和转发目标端口都根据应用协议动态获得。这被称为动态转发。
其实在动态转发的过程中,主要应用的协议是“SOCKS4”或者“SOCKS5”,而不是“SSH”,此时SSH Client和SSH Server的身份分别是SOCKS Client和SOCKS Server。(OpenSSH默认不仅支持实现了SSH协议,还支持实现了SOCKS4和SOCKS5协议)。
具体的数据流图如图3所示。
图3
有以下几点需要注意:
- 执行
ssh -D [bind_address:]port RemoteHost
建立SSH连接隧道,设置好被监听的转发端口等参数 - 应用连接由本地机器上的应用程序发起建立
- 在应用连接由本地机器上的应用程序发起建立之后:
当“bind_address”为“127.0.0.1/localhost”,“转发目标地址和目标端口”为http://127.0.0.1/localhost:8080
时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“转发目标地址和目标端口”为http://www.youtube.com:80
时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道4。依此类推
2.4、图形界面扩展应用场景
2.4.1、建立ssh连接命令
在本场景中,使用ssh程序建立SSH连接的命令如下:
1 | ssh -X RemoteHost |
2.4.1.1、选项含义
1、“-X”
表示允许图形界面扩展
2.4.1.2、ssh_config文件中对应的配置
“-X”允许图形界面扩展,可以在“ssh_config文件”中配置,具体配置选项是“ForwardX11”。
2.4.2、原理分析
建立的SSH连接被应用连接作为隧道,允许打开SSH Server所在机器上的图形界面应用程序并在SSH Client所在机器上显示,本应用场景的另外一个称呼是建立“X11”SSH连接。
在本场景中,X Client和X Server并没有通过X Protocol直接连接传输数据,而是通过SSH连接隧道传输数据,因而也属于SSH隧道应用范畴。
具体的数据流图如图4所示。
图4
有以下几点需要注意:
- SSH Client开启“-X”选项需要SSH Server的支持,SSH Server可以在“sshd_config文件”中配置是否开启支持“-X”选项。详细内容可参见“man 5 sshd_config”中关于“X11”的内容
- 执行
ssh -X RemoteHost
建立“X11”SSH连接隧道 - 根据“X Window System”的介绍,X Server由“DISPLAY”这个环境变量指定,在建立“X11”SSH连接的过程中,会自动配置“RemoteHost”上的“DISPLAY”环境变量,并最终使得SSH Server被作为一个虚拟的X Server。此时SSH Client被作为一个虚拟的X Client
- 在“X11”SSH连接建立之后,即SSH连接隧道得以建立,此时由SSH Client发起打开“RemoteHost”上的图形界面应用程序的请求(必须由SSH Client发起,因为SSH Client并没有作为虚拟的X Server),接下来应用程序的图形数据从“RemoteHost”上相应的X Client传递到“RemoteHost”上的SSH Server(虚拟X Server),接着通过SSH隧道传递到本地机器上的SSH Client(虚拟X Client),最后传递给本地机器上的真实X Server。数据流通道为:数据通道2——SSH隧道——数据通道1
三、其他
3.1、打印日志信息
在执行ssh命令的时候,可以加入“-v”选项,“-v”选项表示打印日志信息,这有助于我们进行调试,解决遇到的问题。最多可以加入3个“-v”选项,“-v”选项越多,表示打印的日志信息越详细。
3.2、端口选择原则
不管是在本地转发,远端转发还是动态转发中,被监听的用来转发的端口的端口号必须大于1023(否则需要root权限),并且该端口不被其他程序所占用。
3.3、关于在“本地转发,远端转发,动态转发”中提及到的“[bind_address:]port”的几点注意事项
1、“bind_address”值为“*”或者“为空”中的“为空”,是指这样的形式“:port”,而不是这样的形式“port”
2、在“ssh_config文件”(在远端转发中,相应的是“sshd_config文件”)中可以配置“GatewayPorts”参数值。当该值为“yes”时,“port”等价于“*:port”;当该值为“no”时,“port”等价于“localhost:port”
3、在执行ssh命令时,加入“-g”选项,等价于“*:port”的形式
4、为了更好的可读性和更精准的定义,“bind_address”还是显式配置比较好
参考文献: [1]man ssh [2]http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch09_03.htm [3]http://blog.csdn.net/dslztx/article/details/46654383