ssh 是如何工作的?

在 terminal 中 ,当我们输入 ssh username@remote_host 时,terminal 程序调用 ssh client ,ssh client 发起网络请求 ,请求 remote_host 的默认22端口,远端服务器22端口收到请求后,将请求转发到本地的 ssh server 程序。然后 ssh server 和 ssh client 交换 公钥、私钥、cipher suite info。在 ssh server 主机创建 shell 进程。这样 ssh 加密通道就创建完成了。后续的 shell 命令和命令的响应都将通过这个通道传输。

例如,当 ssh 通道建立后,在本地输入 ls 命令,那么 ls 命令将通过通道发送到 ssh server 所在的服务器,并且在 ssh server 中执行。ssh server 的 shell 进程在执行完命令后,将命令所有的输出,重定向到管道,通过管道传递给 ssh-client 的另一端。另一端进行解密并打印到 terminal application 上。

ssh 端口转发,或者 ssh 隧道?

The SSH protocol requires that requests for services on a remote machine be made over channels. A single SSH connection may contain multiple channels, all run simultaneously over that connection.

Each channel, in turn, represents the processing of a single service. When you invoke a process on the remote host with Net::SSH, a channel is opened for that invocation, and all input and output relevant to that process is sent through that channel. The connection itself simply manages the packets of all of the channels that it has open.

This means that, for instance, over a single SSH connection you could execute a process, download a file via SFTP, and forward any number of ports, all (seemingly) at the same time!

Naturally, they do not occur simultaneously, but rather work in a “time-share” fashion by sharing the bandwidth of the connection. Nevertheless, the fact that these channels exist make working with the SSH protocol a bit more challenging than simpler protocols (like FTP, HTTP, or Telnet).

本地转发到远端

本地转发就是通过跳板机将本地的端口转发到远端服务器。本地使用 ssh 程序监听指定端口,并将这个端口的所有请求转发到远端的指定端口。

例如 将 127.0.0.1(local host) 的 1234 (local port) 端口转发到 www.leorain.cn (remote host) 的 80 (remote port) 端口。所有对于 127.0.0.1 的 1234 端口访问都将转发到 www.leorain.cn 的 443 端口。

命令示例:

ssh -i .ssh/jumpserver/jumpserver_tunnel_id_rsa tunnel@123.123.123.123 -L 127.0.0.1:5600:172.16.0.18:5601 -N

本地 ssh-client 与跳板机建立 ssh 隧道,将本地的 5600 端口通过跳板机转发到 172.16.0.18 的 5601 端口上。

  • -i 指定私钥文件

  • -L 定义本地端口转发到远端。格式: -L [本地主机:]本地主机端口:远程网络主机:远程网络主机端口

  • -N 不执行远端命令。仅做端口转发。如果连接跳板机的用户是禁止登录的,会在发起连接后直接关闭连接。

    ps. 一般跳板机都有自己的一套登录、转发程序。如果要自己进行转发,最好的做法是在跳板机创建一个禁止登录的用户(例子中的 tunnel 用户),该用户仅可以发起 ssh 隧道。具体做法: www.leorain.cn

远端转发到本地(内网穿透)

Forwarding remote connections to the local host is also straightforward; simply call the #remote_to method of the #forward service. This takes three (or four) parameters: the local port and host to be forwarded to (in that order), and the remote port to listen on. The fourth parameter is optional, and is the bind address on the remote machine; this defaults to “127.0.0.1”.

假设有这样一个场景:

内网有两个服务器: A 和 C ,远端有一个阿里云服务器 B 。其中内网的 A 可以连接远端的 B,A 可以访问内网 C 的 10808 端口,该端口提供梯子功能。现在 远端的 B 服务器需要使用内网 C 的 10808 端口。由于 C 处于内网,B 不能直接访问,需要由 A 对 B 发起 ssh 连接,并将 B 的 7998(自定义端口) 转发到 C 的 10808 端口上。这样,在 B 服务器内访问 7998 端口,就相当于访问了 C 的 10808 端口。

实际场景:我有一个阿里云服务器(B),要在阿里云服务器内下载一个国外的学术文档。但由于众所周知的原因,阿里云服务器无法直接访问 墙外的狗狗 . 我的本地电脑 (A) 可以直接连接 B 。本地电脑(A) 可以访问局域网电脑 C 的代理端口 10808 。通过远端转发可以将 B 的指定端口通过 A 转发到 C 的 10808 端口。

命令示例:

ssh -R 123.123.123.123:7998:192.168.0.194:10809 ubuntu@123.123.123.123 -N

本地主机 A 对 B 发起 ssh 连接,并将 B 的 7998 端口通过 A 转发到 C 的 10809 上。

  • -R 远程转发通过参数 -R 指定,格式:-R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口

sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。B 服务器默认监听在 127.0.0.1 上,如果需要绑定0.0.0.0上,让其他主机可以访问B的端口,可以设置sshd_config配置文件 的 GatewayPorts ,或者在 B 服务器内使用 ssh -L 将本地的端口转发到 0.0.0.0 上。连接建立后,在 B 服务器内设置 http_proxy

export http_proxy=http://127.0.0.1:7998
export https_proxy=https://127.0.0.1:7998
w3m www.狗狗.com # 测试一下连接

一切顺利的话,

ssh隧道原理及三种隧道转发模式相关推荐

  1. LVS三种请求转发方式和八种调度算法简介

    1. LVS的结构 LVS方式的cluster从结构上可分为两部分:前端的负载均衡器(称之为director)和后端的真实服务器(称之为real server).cluster前端的director将 ...

  2. 详谈RDMA技术原理和三种实现方式

    ​导读:远程直接内存访问(即RDMA)是一种直接内存访问技术,它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入.RDMA最早在Infiniband传输网络上实现,后来业界厂家把 ...

  3. Redis三种集群模式介绍

    三种集群模式 redis有三种集群模式,其中主从是最常见的模式. Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的.哨兵顾名思义,就是用来监控的,主要作用就是 ...

  4. redis 三种集群模式详解

    概念:redis有三种集群模式,分别为主从模式,哨兵模式以及集群模式,其中主从是最常见的模式 三种集群模式说明 **·**Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性 ...

  5. VMware虚拟机的三种网络连接模式的特点

    在VMware Workstation中创建虚拟机后,配置虚拟机的网络连接有3种模式,分别是: 1.桥接模式(VMnet0) 2.NAT模式(VMnet8) 3.仅主机模式(VMnet1) 这三种网络 ...

  6. 虚拟机三种网络连接模式桥接网络配置Linux

    虚拟机三种网络连接模式桥接网络配置Linux 桥接模式 桥接,相当于虚拟机设置为一台真实的服务器,主机和虚拟机之间以通讯并且,虚拟机可以访问网络资源.一定局域网内其他主机可以访问虚拟机 桥接模式需要自 ...

  7. VMware Workstation三种网络连接模式说明(Bridged,NAT,Host-only networking)

    VMware Workstation三种网络连接模式说明(Bridged,NAT,Host-only networking) VMware Workstation 提供 三种基本的网络连接 模式 : ...

  8. 简单区分Vmware的三种网络连接模式(bridged、NAT、host-only)

    from https://www.slyar.com/blog/vmware-bridged-nat-hostonly.html Vmware在安装时默认安装了两块虚拟网卡,VMnet1和VMnet8 ...

  9. STM32三种BOOT启动模式详解(全网最全)

    一.三种boot启动模式 一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式. ...

最新文章

  1. GPU与CPU交互技术
  2. 响应式 媒体查询 盒模型
  3. build muduo网络库undefined reference to问题
  4. “拯救网站运维经理赵明”有奖方案征集启事
  5. android生成png图片,Android 中将 base64图片 解码为.png图片
  6. C 语言中的内存分析
  7. statement执行insert into语句_【图文并茂】源码解析MyBatis ShardingJdbc SQL语句执行流程详解...
  8. python求梅花数_python 算法
  9. 为什么最近「骚扰电话」明显越来越多了?
  10. nginx详解反向代理,负载均衡,LNMP架构上线动态网站
  11. 使用Java复制文件并在控制台显示文件进度
  12. Python3.8场景式编程学习与训练- 第1章 入门基础 沙箱技术与虚拟环境创建
  13. react18的SSR
  14. 分析方法--FMEA,6sigma,脑力激荡法
  15. iTunes只能装C盘吗_为什么电脑软件喜欢默认安装在C盘呢?
  16. Virtual Vertex Muster9—3D渲染农场管理软件
  17. 【转】移动端地图技术分享
  18. oracle中prot是什么意思,Oracle 10g及pro*c相关问题及解决方法
  19. Unity PC 打包后文件夹
  20. linux查看cpu核数命令,centos查看CPU以及核数命令

热门文章

  1. SAP系统 月结步骤
  2. linux内存和磁盘空间不足解决办法
  3. 如何使用商业图像设计软件ConceptDraw DIAGRAM简化流程图?
  4. oracle的mysql_Oracle与MySQL的区别简析
  5. JAVA实训-连连看(二)
  6. mybatis 常见错误:Mapped Statements collection does not contain value for com.*
  7. 浅析MOS管开关速度影响因素-KIA MOS管
  8. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)
  9. Anaconda 安装python第三方库的各类方法
  10. 操原作业(一)Ubuntu系统编译一个新的内核