SSH的隧道学习

应用数据通过ssh,完成加密,转发,解密,通讯。

ssh连接方向和应用连接方向相同,就是本地端口转发,不同就是远程端口转发。

ssh功能


  • 第一个就是端口转发命令
    转发控制的命令,实现远程控制。
  • 第二个就是代理上网
    制定本地的一个端口映射到服务器的某一个特定端口。ssh服务使得本地运行一个代理服务器。然后本地代理服务器负责数据请求的转发。

端口转发

1.加密SSH Client 端至SSH Server 端之间的通讯数据
2.突破防火墙的限制完成一些之前无法建立的TCP 连接

  • 端口本地转发(出口隧道)
    将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口.
    ssh -C -f -N -g -L 本地端口:目标IP:目标端口 用户名@目标IP

    • 本地端口转发,是将本地端口转发到指定的远端端口.
      例如, 将所有发送到本地机器10000端口的请求,都转发至远端机器的22端口.
    • 通过家庭电脑,访问办公室的服务器,可以通过ssh连接办公室的服务器,设置本地端口转发实现.
      home$ ssh [email protected] -L 10000:172.16.10.10:22
  • 端口远程转发(入口隧道)(相对于设置命令的电脑:家庭电脑地址:192.168.10.10)
    将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口.
    ssh -C -f -N -g –R 本地端口:目标IP:目标端口 用户名@目标IP

    • 它将远端端口的请求,转发至本地机器的指定端口. 例如将服务器上22端口的请求,全部转发至本地机器的10000端口.
    • 如果想要在公司,访问家里的电脑,这个时候,就可以使用远端端口转发了. 在家庭电脑上使用如下命令:
      ·home$ ssh [email protected] -R 10000:192.168.1.10:22
      现在能登录到你公司电脑的同事, 就可以直接通过ssh访问你的家庭电脑了.通过以下命令:
      work.example.org$ ssh user@localhost -p 10000
      如果要想通过办公室同一子网内的其它电脑,访问你的家庭电脑, -g 选项是不行的.因为远端端口转发是没有-g选项的.你需要修改公司机器(work.example.org)上的sshd_config 文件.
      GatewayPorts yes
  • 动态转发
    指定一个本地机器 “动态的” 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接,该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS 协议, ssh 将充当 SOCKS 服务器.只有 root 才能转发特权端口.
    ssh-D 1080 root@sshserver
    假设主机A想要访问受限网络所限制访问的主机C、D、E等(但是主机B可以访问),或者想要访问主机B上的“SB”内容。则可有D选项建立动态隧道
    ssh -CfNg -D 8888 lige@host-B

上网代理


如果我们需要借助一台中间服务器访问很多资源,一个个映射显然不是高明的办法(事实上,高明确实没有用这个方法)。幸好,SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。

当本地1080端口受到外部网站请求会转发到外部服务器上面去,代理服务器通过1080端口把请求转发到站点服务器上面去

附隧道原理


对网络原理不太懂或不感兴趣的可以忽略此部分

总的来说:Tunnel实际上是一个TCP连接,这个连接和普通的SSH登录的连接并没有本质上的区别
假设有两台主机A和B,IP分别是IP_A和IP_B,是要把主机A的22端口映射到主机B的10022端口
连接的建立过程是这样的:

  1. 建立TUNNEL (在A主机上执行命令)
    ssh命令,把A的端口映射到B主机(ssh -NfR 10022:localhost:22 USER_B@IP_B)
    这个步骤实际上是这样的:
    (1)ssh命令是ssh客户端,这条命令是指在A主机上登录B主机,并且A主机请求将A主机的22号端口映射到B主机的10022端口。
    (2)B主机接受远程登录请求后,检测发现用户的权限足以创建10022端口,且10022端口并未使用。则B主机开启一个监听端口:10022
    (3)这条命令成功结束后,A主机有了一个后台进程登录到B主机,这个登录的连接正是“TUNNEL”。
    而B主机相应也有这么一个后台进程,此外B主机还增开了一个监听端口:10022
    (4)在这个过程中,B是Server,A是Client。那么A是以一个任意端口连接到B的ssh监听端口。所设这个连接是
    IP_A:12345 —— IP_B:22
  2. 连接映射端口 (在B主机上执行命令)
    连接映射端口 ( ssh USER_A@localhost -p 10022)
    这个步骤实际上是这样的:
    (1)主机B连接自己的一个监听端口10022
    于是主机B以一个任意的端口连接10022: IP_B:23456 ——- IP_B:10022
    (2)10022端口实际是由主机B的sshd来维护的,sshd发现有连接到10022的端口的数据。
    将数据封装成ssh包,通过已经建立好的TUNNEL传输到对端主机A的12345端口(TUNNEL建立时的初始端口)
    (3)主机A的12345端口收到数据后,经过TUNNEL的建立进程的处理(解开ssh包),把数据转到主机A的端口22(建立TUNNEL时指定的端口)
    (4)因此,这个反向的连接就建立起来了
  3. TUNNEL与TCP连接的关系
    (1)TUNNEL本质是一个TCP连接
    (2)TUNNEL的作用用于传输其它TCP连接的数据
    (3)对用户而言,TUNNEL就是它们可见的TCP连接传输的一个“隧道”
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章