0%

ssh实现反向代理、正向代理、内网穿透

2019年12月18日 下午2:51
ssh 反向代理 - 不拨牙 - 博客园

相关知识:

  1. nat和内网穿透的概念:
    • nat(网络地址转换方法)_百度百科
    • 内网穿透_百度百科
    • 关键词是:地址转换。表示:公网ip和局域网ip进行对应关系,这个关系是:多对一(一个公网ip对应n个内网ip)。这也导致会有内网穿透这个说法:用于确定将一个公网ip:port对应到局域网中的ip。
    • nat与内网穿透的关系
      • ::逆过程:从nat的说明中可看出,nat其实指的是多对一编码这个过程,而内网穿透强调了是一对多的解码过程::
      • nat:出去的过程
      • 内网穿透:回来的过程
    • NAT网关的工作步骤:

  2. ssh 代理和 vpn代理的区别:
    1. 该使用 SSH 还是该使用 VPN?
    2. vpn:
      • VPN 是虚拟专用网络,它虚拟了一个网卡,类似于一个数据隧道,使用 VPN 后,你连接到了一个新的网络连接,这个网络连接和你所使用的宽带连接、局域网连接等是平级的,(但实际上数据是先加密,再通过你其它的网卡发送的),如果你使用这种方式连接了网络,你的所有网络数据包都将通过 VPN 加密隧道发送。
    3. SSH:
      1. ::他不是一个单独的网络连接,只是在现有网络连接内的一个协议::
    4. VPN 更接近底层,相当于一个新的虚拟网卡,更有“专用”的性质,而 SSH 更像加密的代理服务器,是在你现有的网络上的一个普通的连接。
  3. 为什么VPN比SSH繁荣?
    1. 因为ssh做不了的事情,VPN都可以做;而ssh能做的,VPN也统统能做。
    2. ssh和vpn哪个好,区别是什么? | Mujj博客
  4. 其他:
    1. 其实ssh只是代理的一种,代理有很多种,例如http代理,反向代理等,这些之所以在国内的网络环境里不堪大用,主要是因为他们内容传输都是使用明文,不加密的内容很容易被第三方嗅探,然后截断连接
    2. ssh和vpn都是加密传输,相对安全,在国内恶劣的网络环境下,总算能够生存。

注:

  • 如果抱着登录服务器的目的来说,最简单的方法就依然还是必须有A、B服务器,但是没不要设置啥代理,直接先从Cssh登录到B,再从B登录到A一样可以完成连接。
  • 所以说,如果简单的连接一下A服务器,没必要弄得这么复杂!!!

理解核心

::一台linuxA,它不仅可以主动的连接B,也可以命令B来连接自己::

  • 这就是linux反向代理最难理解的地方,这个命令B来连接自己这个动作有点反直觉,谁会想到linux有这功能,这也体现了linux中的确有很多的设计哲学在里面。
  • 这两种的结果虽然都是B->A,但是不同点是:反向代理会使B机器启动一个ssh连接(B->A)对应的端口号。如果正向连接B->A,这个ssh在B上没有启动一个对应的接口,不好之处是:无法将B机器其他端口的内容转接到B->A之间的连接(eg:无法再在B机器上进行正向代理端口映射到已有的连接中)。

利用SSH代理访问内网资源 - DTeam的团队日志 - SegmentFault 思否

另一种理解:

正向代理与反向代理的区别? - 个人文章 - SegmentFault 思否
正向代理:代理的是客户端(服务器并不知道真正的客户端到底是谁)
反向代理:代理的是服务端(客户端也不知道真正的服务器是谁)

参数说明:

  1. 反向代理
    • ssh -fCNR
  2. 正向代理
    • ssh -fCNL
  • -f 后台执行ssh指令
  • -C 允许压缩数据
  • -N 不执行远程指令
  • -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
    • 这就是反向两个字的意思!!!
  • -L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
    • 这就是正向两个字的意思!!!
  • -p 指定远程主机的端口

机器状况:

流程说明:

  1. 第一步:就是在机器A上做到B机器的反向代理
    1. 命令: ssh -fCNR 7280:localhost:22 root@123.123.123.123
    2. 步骤:
      1. 登录B机器:ssh root@123.123.123.123 注:这里是默认的22端口
      2. 在B机器中端口转发:B:7280->A:22,注:我认为这就是一个正向代理。也就说:反向代理中是正向代理的包装!
    3. 结果:
      1. 此时,AB之间的ssh连接一直保持(结果就像B ssh连接了A一样,只不过是由A要求B做的)
      2. 此时,可以在B机器中使用ssh -p 7280 localhost来登录
  2. 第二步:在B机器上做正向的代理实现本地端口的转发
    1. ssh -fCNL *:1234:localhost:7280 localhost
    2. 需要这次转发的原因是:B:7280是B机器与A进行通讯的ssh进程启动的端口(只有反向代理才会有),而不是登录B机器的端口,因此我们需要B机器上的另一个端口B:1234作为B机器的登录端口,并将此次登录的内容,转发到B:1234->B:7280
  3. 第三部:在另一台外网服务器C中通过B:1234端口来登录B
    1. ssh -p1234 gdut728@123.123.123.123

检验是否已经启动了可以使用ps aux | grep ssh指令来查看: