多重 SSH TCP 隧道转发

熟悉我的人都知道,我的 homelab 网络环境灵车

过时记录

这套东西我从2020年用到现在,已经再熟悉不过了。
但因为这是2025年年末,所以是非常晚来的一篇 blog 来记录。

我们可以到处用到这个东西,适用面比较广,在遇到一些情况的时候……

ssh tcp 转发

几个例子

  1. 使用了 Django 写了点东西,交给客户看,然而 dev server 在家(可以使用 frp/tailscale 转出来),到了客户公司,怎么给他们看呢?

    访问开了 http 的端口。使用 Tailscale 时,正常直接使用分配的100开头ip+端口就好了;在使用 frp 时,转发对应的端口就好……

    问题在于 Django 的 dev server 默认有一个ip限制,在白名单之外的 ip 都不让访问,返回 HTTP 403。
    既然这样,如果没有提前修改白名单,这时候就不能以正常方式访问了。

  2. 使用了 docker 部署的 natfrp launcher,想访问 web 控制台。

    同理正常应该如上的方式访问7102端口,不过 launcher 限制只允许来自 localhost/127.0.0.1 的访问。

    如上,会返回 HTTP 400.

使用

转发的方式非常简单。只要能 ssh 连上远程的机器,就可以进行。

1
ssh -L <本地端口>:<目标主机>:<目标端口> <SSH服务器用户>@<SSH服务器地址>

如上面的第二个例子,我需要将远程的7102转到本地的7102端口上,那么:

1
2
# 在这里使用 Tailscale.
ssh -L 7102:localhost:7102 100.114.51.4

如果端口号小于1024,是一个已知端口,需要高权限才能创建转发。使用 root 权限

远程的用户必须具有使用 ssh 命令的能力,所以 login shell 不能是 nologin.

如果你使用某些共享 ip 的 frps,这些路子比较多日后再讨论。不过提供参考:

1
ssh -L 7102:localhost:7102 -p 11451 frp-homo.lab

区别就是加入了指定端口。

1
tcp 流量 -> remote -> frpc -> frps in port -> frps out port -> host -> host some port

多重转发

背景

这里也是在上文中使用 natfrp launcher 的过程中发生的事。

我有一台机器(A)有 Tailscale,另一台(B)没有。
A 是 headless 机器,我不能直接转发在它上面使用浏览器,也不能在 B 上使用浏览器访问这台机器的7102,因为 B 的 ip 不是 127.0.0.1(废话!)

假设 A : 192.168.114.51

实际操作

既然 remote 的7102被映射到了 A 的7102上,那么我们可以把 A 的7102再映射到 B 的7102上(实际,不一定要7102)。

在 ssh -L 执行时,会进入 shell 已经是最基础的了。

1
2
3
4
5
zlicdt@B $ ssh -L 7102:localhost:7102 192.168.114.51

zlicdt@A $ ssh -L 7102:localhost:7102 100.114.51.4

zlicdt@frpc $

这样,remote 的7102开的 control panel 会认为是从 localhost 来的流量,也就会放行了。


多重 SSH TCP 隧道转发
https://blog.zlicdt.top/2025/11/19/multiple-forward/
作者
zlicdt
发布于
2025年11月19日
许可协议