ssh反向代理及其应用


简介

我们在工作中经常使用ssh,但大多数人很少用到反向代理的功能,本文介绍反向代理的概念以及使用反向代理来访问内网的服务器,在一些特殊的情况下(例如公司的VPN不能用了)会很有帮助。


概念

我们一般说的代理,都是正向代理,例如内网的服务器通过代理服务器访问公网。而反向代理则相反,可以访问公网的客户端通过反向代理服务器访问内网的服务器。
而在ssh命令中,反向代理是指将远程主机的某个端口转发到本地端指定机器的指定端口,以实现通过远程主机的端口来访问本地端口,这种反向代理的特点是:

  • 该操作是在被代理主机上执行的
  • 正常情况下被代理主机可以访问反向代理服务器,反向代理服务器不能访问被代理主机
  • 执行反向代理之后,反向代理服务器可以访问被代理主机

以下结合两个具体的实验来说明反向代理的作用,实验1通过远程端口转发实现了ssh连接内网服务器,实验2在实验1的基础上增加动态端口转发以访问内网的网站。


实验1: 远程端口转发

  1. 准备三台主机,分别是:

    • 内网服务器AA可以访问公网,不能从公网被访问
      • IP: 172.16.150.244
      • 端口: 20183
      • 用户名: cdg_dev
    • 公网服务器B
      • IP: 161.179.121.89
      • 端口: 22
      • 用户名: user2
      • 密钥文件: key.pem
    • 本地主机C,可以访问公网,不能访问A所在的内网
  2. A上开启反向代理:

    • 在可以访问A的环境中登录A,然后执行以下命令
      ssh -i key.pem -fCNR 1127:localhost:20183 ec2-user@161.179.121.89
    • 注意命令中的1127是把B1127端口转发到了A20183端口
  3. B上验证:

    • 执行netstat -antpul | grep 1127,可以看到1127端口处于监听状态
      [user2@B ~]$ netstat -antpul | grep 1127
      tcp 0 0 127.0.0.1:1127 0.0.0.0:* LISTEN -
      tcp6 0 0 ::1:1127 :::* LISTEN -

    • 执行ssh -p 1127 cdg_dev@127.0.0.1可以登录到A

  4. C上执行以下命令可以一步登录到A:
    ssh -i key.pem -t user2@161.179.121.89 ssh -p 1127 cdg_dev@127.0.0.1


实验2: 动态端口转发

  1. 在完成实验1步骤3的基础上,在本地主机C执行以下命令,开启本地端口转发,将本地12345端口通过B转发到127.0.0.1:1127:
    ssh -i key.pem -Nf -C -L 12345:127.0.0.1:1127 user2@161.179.121.89

  2. C上验证,输入以下命令可以直接访问A:
    ssh -p12345 cdg_dev@127.0.0.1

  3. C上输入以下命令,开启动态端口转发,即在本地起了一个端口是23456的代理服务器,转发给127.0.0.1:12345,相当于转发给了A:
    ssh -Nf -C -D localhost:23456 cdg_dev@127.0.0.1 -p 12345

  4. 通过代理在C上访问内网域名,http响应正常:
    curl --socks5 127.0.0.1:23456 172.16.150.244:8088/login/