SSH: ssh隧道
简介
- Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。
- SSH隧道是SSH技术的扩展,可以将其看作一条加密隧道。本文将介绍它的几种用法,其中我在工作中用的最多的是将其作为跳板机的加密通道,在jenkins调用ansible部署和 jumpserver https://www.cnblogs.com/William-Guozi/p/jumpserver.html 网域中均有应用,也即是,所有底层基于ssh的技术均可使用该隧道技术。
- 其优点是提高数据传输的安全性(数据加密和隐藏主机公网地址)和管理的方便性,所谓管理的方便性,即所有主机均通过内网IP访问,不用记忆和管理外网地址,好处多多。
SSH Local 模式
语法
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
范例
逻辑图如下:

在B主机上执行下面命令,C.ip为C主机的IP地址,B主机将监听在12340端口
ssh -C -f -N -g -L 12340:C.ip:22 root@0.0.0.0
在A主机上执行下面命令,可直接登录C主机
ssh -p 12340 root@B.ip
参数注解
相关参数的解释:
-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-C Enable compression.
压缩数据传输。
-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。注:这个参数我在实践中似乎始终不起作用。
SSH Remote 模式
语法
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
范例
逻辑图如下:

在B主机上执行下面命令,C主机将监听在12340端口
ssh -C -f -N -g -R 12340:localhost:22 root@C.ip
在A主机上执行下面命令,可直接登录B主机
ssh -p 12340 root@C.ip
SSH dynamic 模式
语法
ssh -C -f -N -g -D listen_port user@Tunnel_Host
范例
逻辑图如下:

在C主机上执行下面命令,C主机将监听在12340端口
ssh -C -f -N -g -D 12340 root@0.0.0.0
作为客户端A需要配置浏览器代理配置,下图需要填写C的ip地址

此刻会发现自己的公网IP为C的ip了,就可以科学上网了

SSH在跳板机中的应用
在当前用户的根目录下添加如下配置,就可以实现直接内网访问,当前本公司的项目发布就是采用jenkins调用ansible的方式,而ansible底层为ssh。
即从该主机上访问172.16.0.0/16的网段就会通过与跳板机1建立的通道传输,访问172.31.16.0/24、172.31.17.0/24网段会通过与跳板机2建立的通道传输。
配置如下:
cat >> /root/.ssh/config <<"EOF"
##aliyun beijing
Host 172.16.*.*
ProxyCommand ssh -p 22 -W %h:%p root@***跳板机1公网IP***
#指定私钥的位置
IdentityFile /root/.ssh/id_rsa
##Aliyun huadong
#如果是多段IP,可以用空格隔开
Host 172.31.16.* 172.31.17.*
ProxyCommand ssh -p 22 -W %h:%p root@***跳板机2公网IP***
IdentityFile /root/.ssh/id_rsa
EOF
参考文档
- SSH Tunnel扫盲:https://blog.csdn.net/blade2001/article/details/8877250
- SSH隧道与端口转发及内网穿透:http://blog.creke.net/722.html
- SSH 隧道转发实战:http://chenweiguang.blogspot.com/2009/03/ssh.html
SSH: ssh隧道的更多相关文章
- 利用SSH反向隧道,连接内网服务器
前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...
- SSH实现隧道功能穿墙
Putty和SSH tunnel 目前寻求FQ的方式无非就几种: 寻找web代理(这个可以进我放置的在线代理进行测试) 自行寻找http/sock5代理(这个可以去网上搜索代理ip) vpnFQ(目前 ...
- 【Linux】ssh建立隧道tunnel连接到内网设备
root@192.168.1.105 建立隧道: ssh -l root -N -f -R 9103:127.0.0.1:2222 work@11.11.13.17 解析:把本地127.0.0.1:2 ...
- 两步建立 ssh 反向隧道
因为需要在寝室访问实验室的内部网络,刚好自己购买了阿里云,因此,可以远端干活了,mark下方法: 第一步:在内网的服务器上,使用ssh 命令建立反向隧道 publicUserName@publicIp ...
- 在Mac OSX下使用ssh建立隧道(在Windows下建立隧道可以使用putty,其间会用到ppk文件)
在Windows下建立隧道可以使用putty,其间会用到ppk文件.在Mac OSX下,同样的功能可以用ssh命令实现.具体是: ssh -D 8088 -Nf user@ip -i myppk.ss ...
- linux命令--ssh创建隧道
工作应用场景 在工作中,总会连接到各种不能直接访问的环境,所以我们必须使用ssh隧道进行访问. 原理简介 ssh隧道:https://www.jianshu.com/p/20600c91e656
- 使用ssh建立隧道和web代理
动态端口转发(socket4/5代理): 通过ssh监听本地端口并把数据转发至远程动态端口 转发local port 至 ssh Server ssh -D ssh -qfTnN -D 本地目标端口 ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
- [SSH] SSH学习笔记 - 远程登录
1.SSH登陆/登出命令 $ ssh <hostname> #登入 $ exit #登出 known_hosts 每个用户都有自己的known_hosts文件,路径:(username)/ ...
随机推荐
- 常用加密算法-Delphi XE 10.3.3
主要用到 DELPHI XE 10.2新增HASH函数 class function TUtils.GetStringMD5(const AInPut: string): string; begin ...
- Springboot2.1.1下的自定义拦截器而静态资源不能访问的问题
1.项目结构 2.自定义拦截器 public class LoginHandlerlnterceptor implements HandlerInterceptor { //目标方法执行之前 @Ove ...
- Java零基础搭建实时直播平台
https://www.cnblogs.com/scywkl/p/12101437.html
- 生产环境中使用docker注意点
是否对容器使用的资源进行合理限制,比如内存 CPU 网络带宽等. 是否设置合理的网络访问限制,如 非root用户 iptables. 是否有在docker无法使用时的备选方案,如提供非docker环境 ...
- Python中url标签使用详解
url标签: 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性.当然如果通过硬编码的方式直接将这个url固定在里面也是可以的,但是这样的话,对于以后进行 ...
- P2756 飞行员配对方案问题 二分图匹配 匈牙利算法
题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...
- Mysql连接出现时区问题
错误提示: The server time zone value '¥x¥_¼Ð·Ç®É¶¡' is unrecognized or represents more than one time zon ...
- Unity事件系统EventSystem简析
相关组件和类 EventSystem 1.负责InputModule的切换(因为现在游戏大部分都只有一个StanaloneInputModule,所以切换这部分可以先不考虑). 2.负责InputMo ...
- 嵩天老师python网课爬虫实例1的问题和解决方法
一,AttributeError: 'NoneType' object has no attribute 'children', 网页'tbody'没有子类 很明显,报错的意思是说tbody下面没有c ...
- Docker windows nanoserver/mysql镜像root用户密码错误
由于需要在Windows server上的Docker中部署mysql服务,为了方便起见所以在Docker hub找到了nanoserver/mysql (https://hub.docker.com ...