博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ssh tunnel
阅读量:6991 次
发布时间:2019-06-27

本文共 1748 字,大约阅读时间需要 5 分钟。

相关概念

  • 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

参考资料

转载地址:http://gjzvl.baihongyu.com/

你可能感兴趣的文章
病历问题
查看>>
多线程下的单例模式
查看>>
Ansible批量部署工具的安装
查看>>
面经中高频知识点归纳(五)
查看>>
[转] 对 forEach(),map(),filter(),reduce(),find(),every(),some()的理解
查看>>
Dubbo 是一个分布式服务框架
查看>>
js数组排序实用方法集锦
查看>>
calculate the time of methods
查看>>
python与正则表达式
查看>>
删除多个附件
查看>>
目标检测之显著区域检测---国外的一个图像显著区域检测代码及其效果图 saliency region detection...
查看>>
Laravel之路——事务
查看>>
WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back)....
查看>>
python的struct模块
查看>>
python进程和线程中的两个锁
查看>>
Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库
查看>>
(最小生成树 次小生成树)The Unique MST -- POJ -- 1679
查看>>
括号匹配(二) -- 经典动态规划
查看>>
在jsp中的css
查看>>
Issue 3:数据处理基本认识
查看>>