概述

之前我写过一个 SSH 隧道 Tips,介绍了一些关于 SSH 隧道的技术,但是这个缺乏上下文以及连贯性,所以这里我再整理了一下,并且给出一个网络 Topo 图更好地解释我在做的东西。

网络基础

假设我的网络情况是这样的一个简化 Topo:

图 1:简化网络拓扑

那么这里有几种可能的操作,分别是:

在这几个场景中,最简单实现的就是:从 Home PC SSH 到 VPS,这也是我们平时最常见的一个操作。只所以我们可以轻松地实现这个原理,是因为 VPS 拥有公网 IP,我们可以直接从 Home PC 中路由到 VPS,反之,因为我们得 Home PC 没有公网 IP,所以 VPS 无法直接 SSH 到我们的 Home PC。

那么这里就会有同学有想法了,那么我们的 Home PC 能不能有公网 IP,答案肯定是可以的,从上图中可以看到,简单来说,PC 和 VPS 的差异就在于 PC 还接了一次路由器,那么如果直接将 PC 介入 ISP 网络中,是不是就可以拥有公网 IP 了。这个问题很复杂,答案是可能是,这依赖于你的 ISP 如果提供网络给你,在以前 ADSL 时代,基本上都是可以提供公网 IP 的,但是,随着光纤的普及,即使你不使用路由器,你也不是直接介入 ISP 的骨干网了,而是 ISP 的一个分线器,例如 FTTB 系列。所以,这里设想让 PC(路由器) 拥有公网 IP 的想法不具有通用性,加上即使有,ISP 可能也会限制一些端口,因此用的也不多。

SSH 隧道

所以,终于进入到本文的主题了,既然没法直接连接到 PC,那么可不可以反过来,让 PC 自己主动来发起请求,这就是 SSH 隧道的原理了:

  1. [root@liqiang.io]# ssh -qngfNTR 9999:localhost:8888 root@192.168.29.48

命令行快速使用

  1. [root@liqiang.io]# cat ~/.ssh/config
  2. Host jump
  3. HostName 10.0.0.102
  4. Port 22
  5. User root
  6. IdentityFile /root/.ssh/id_rsa
  7. ForwardAgent yes
  8. Host 10.0.0.87
  9. HostName 10.0.0.87
  10. ProxyJump jump
  11. User zhangsan

Tips

反向隧道只监听 localhost

  1. [root@liqiang.io]# cat /etc/ssh/sshd_config
  2. GatewayPorts = yes

socat 代理:

  1. [root@liqiang.io]# socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672
  1. -d -d 前面两个连续的 -d -d 代表调试信息的输出级别。
  2. -lf /var/log/socat.log 指定输出信息的文件保存位置。
  3. TCP4-LISTEN:15672 在本地建立一个 TCP IPv4 协议的监听端口,也就是转发端口。这里是 15672,请根据实际情况改成你自己需要转发的端口。
  4. bind 指定监听绑定的 IP 地址,不绑定的话将监听服务器上可用的全部 IP。
  5. reuseaddr 绑定一个本地端口。
  6. fork TCP4:172.17.0.15:15672 指的是要转发到的服务器 IP 和端口,这里是 172.17.0.15 的 15672 端口。

代理 UDP

反向代理

Ref