laverne_guo

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ssh tunnel

相关概念
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

posted on 2020-04-10 17:26  laverne_guo  阅读(1070)  评论(0编辑  收藏  举报