ssh tunnel

零下三度 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客户端心跳 通过ServerAliveIntervalServerAliveCountMax选项来实现,ssh客户端会在隧道无通讯后的ServerAliveInterval时间后发送一个请求给服务器要求服务器响应,服务器在ServerAliveCountMax次请求后都没能响应,ssh客户端就断开连接并退出。

  • ssh服务端心跳 通过ClientAliveIntervalClientAliveCountMax选项来实现,ssh服务端会在隧道无通讯后的ClientAliveInterval时间后发送一个请求给客户端要求客户端响应,客户端在ClientAliveCountMax次请求后都没能响应,ssh服务端就断开连接并退出。

端口地址绑定

隧道端口对应主机的绑定规则:在没有明确指定绑定主机的情况下,这时候取决于参数gGatewayPorts选项,有参数gGatewayPorts=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

参考资料

相关推荐