本地转发

基本概念

本地转发可以在两台机器之间开启一个通道,其中一台机器的流量都会通过另一台机器进行发送

场景

最常见的场景在于,有一台机器A,出于安全访问的要求,只开放了一部分ip白名单访问,不对所有网络节点开放,其中ip白名单里有B机器,也就是B机器可以畅通无阻地访问A,我们自己的开发机可能是C、D、E … 总之没有访问A的权限;(假设我们的开发机是C)借助ssh tunnel,我们可以把机器B当做一台代理机器,在C和B之间开启一条ssh tunnel,让所有C对A的请求都先发送到B,由B代理发送给A,这样一来就达到了C访问A的目的;

命令

假设:

  1. A提供的服务位于 http://serviceA.com (默认80端口)
  2. B机器的地址为 serviceB.com
  3. 我们当前是C机器,没有访问A服务权限
$ ssh -L localhost:3000:http://serviceA.com:80 root@serviceB.com

该命令即表示在localhost:3000(即C本地) 和 http://serviceA.com:80 之间开通一条ssh tunnel, 之前我们没有权限访问 http://serviceA.com ,现在通过访问 localhost:3000 即可让B机器帮助我们代理请求,在A看来就是B发出的请求, 而对于C,访问本地的 localhost:3000 就像访问A的服务 http://serviceA.com 一样,就像任意门一样;

远程转发

基本概念

远程转发和本地转发的过程类似,只不过请求的方向大致上可以认为是相反的过程,远程转发同样是为两台机器开通了一个ssh隧道进行通信,但远程转发是为远程的机器提供了访问本地服务的能力

场景

远程转发一个突出的场景是可以将本地的服务接入线上进行调试,假设以下场景:我们在开发一个功能模块M,在本地的版本为M_local,远程的为M_remote,M是一个类似于提供对象存储,文件操作的服务,是提供给别的上游服务调用的;某一天,这个服务出bug了,但根据日志又比较难定位问题,这时有一个方案就是将本地服务接入线上(测试/预发环境)的流程进行调试,这时我们就需要线上的服务访问M_local而不是 M_remote;

命令

$ ssh -R <remote addr>:<remote port>:<local addr>:<local port> root@remote_addr