零下三度 2019-06-21
ssh 一种对数据进行加密安全传输的协议
ssh tunnel ssh隧道,通过ssh连接建立起来的一条加密安全通道
ssh port forwarding ssh端口转发,通过ssh隧道把tcp连接转发出去
参数 | 说明 |
---|---|
C | 压缩数据传输 |
g | 允许远程主机连接到转发的端口,只对本地转发有效 |
f | 认证成功后,后台运行 |
N | 不执行脚本或命令,通常和f 连用 |
o | 指定配置选项 |
L | 本地转发或正向转发 |
R | 远程转发或反向转发 |
D | 动态转发 |
把本地主机的本地端口转发到远程主机的远程端口上
工作原理:本地主机
分配一个socket侦听本地端口,一旦该本地端口有了连接,该连接就通过加密安全通道转发出去,同时和远程主机的远程端口建立起了连接。
X:Y:Z 把本地主机的X端口通过ssh隧道映射到远程Y主机的Z端口上
把远程主机的远程端口转发到本地主机的本地端口上
工作原理:远程主机
分配一个socket侦听远程端口,一旦该远程端口有了连接,该连接就通过加密安全通道转发过来,同时和本地主机的本地端口建立起了连接。
X:Y:Z 把远程主机的X端口通过ssh隧道映射到本地Y主机的Z端口上
一个本地动态的
应用程序级端口转发,可以充当socks代理服务器,支持socks协议(socks5和socks4)
工作原理:本地主机
分配一个socket侦听本地端口,一旦该本地端口有了连接,该连接就通过加密安全通道转发出去,根据应用程序的协议决定连接去向。
隧道会因某些原因被断开,如主机重启、断网、长时间没有通讯而被路由器切断等等,因此需要依赖外界某种机制使隧道重新连接。
注意:要避免隧道重新连接时的认证交互,以防ssh程序被卡死。
有些路由器会把长时间没有通讯的连接断开,ssh客户端的TCPKeepAlive
选项可以避免该问题。
隧道会因某些原因通信不畅而卡死,如传输数据量太大被路由器带入stalled状态等等,这时ssh程序并不终止退出,因此需要依赖某种机制使隧道断开。
隧道状态检查可以通过ssh客户端心跳或ssh服务端心跳来判别:
ssh客户端心跳 通过ServerAliveInterval
和ServerAliveCountMax
选项来实现,ssh客户端会在隧道无通讯后的ServerAliveInterval时间后发送一个请求给服务器要求服务器响应,服务器在ServerAliveCountMax次请求后都没能响应,ssh客户端就断开连接并退出。
ssh服务端心跳 通过ClientAliveInterval
和ClientAliveCountMax
选项来实现,ssh服务端会在隧道无通讯后的ClientAliveInterval时间后发送一个请求给客户端要求客户端响应,客户端在ClientAliveCountMax次请求后都没能响应,ssh服务端就断开连接并退出。
隧道端口对应主机的绑定规则:在没有明确指定绑定主机的情况下,这时候取决于参数g
和GatewayPorts
选项,有参数g
或GatewayPorts=yes
的情况绑定到0.0.0.0
,否则绑定到127.0.0.1
。
建议:要明确指定绑定主机。
# 本地转发 ssh -CfN -o TCPKeepAlive=yes -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -L listenHost:listenPort:remoteHost:remotePort sshServer # 远程转发 ssh -CfN -o TCPKeepAlive=yes -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -R listenHost:listenPort:localHost:localPort sshServer # 动态转发 ssh -CfN -o TCPKeepAlive=yes -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -D sshServer