通过 Chisel 在客户端之间进行端口转发:没有 L3 的精简隧道

当两个设备位于 NAT 或严格的防火墙后面并且无法直接“看到”对方时,VPN 似乎是标准解决方案。但成熟的 L3 隧道(如 WireGuard 或 OpenVPN)通常是多余的:它需要 root 权限、设置虚拟接口,并且可能与现有路由冲突。

在这种情况下,使用 Chisel 会很方便 – 一种在 HTTP 之上运行并使用 WebSocket 进行数据传输的 TCP/UDP 隧道。在这篇文章中,我将展示如何通过中间服务器将端口从一个客户端“转发”到另一个客户端。

它是如何工作的?

想象一下这种情况:您有 客户端 A(例如,您的家庭服务器)、客户端 B(您的工作笔记本电脑)和具有公共 IP 地址的 VPS。客户端A和B可以访问VPS,但不能互相访问。

转发方案将如下所示:
1. 客户端 A 连接到 VPS 并在服务器上打开“反向”端口。现在,到达服务器端口 X 的所有内容都会转到客户端 A 的端口 Y。
2. 客户端 B 连接到 VPS 并将端口 Z 从其本地计算机转发到服务器的端口 X。
3. 结果,客户端 B 访问 localhost:Z 并最终到达 客户端 A:Y

当与 VPS 的通信未实现 L3 层或无法在客户端之间配置路由时,此方法是解决方案之一。我们专门从事应用程序和端口级别的工作。

第 1 步:启动服务器

在您的 VPS 上,只需在服务器模式下运行 Chisel 即可。需要 --reverse 标志来允许客户端打开服务器端的端口。

chisel server --port 8080 --reverse

第 2 步:连接客户端 A(源)

假设客户 A 希望在端口 3000 上开放对其本地 Web 服务器的访问。他连接到 VPS 并说:“在服务器上保留端口 2000,并将其转发给我到 3000。”

chisel client vps-ip:8080 R:2000:127.0.0.1:3000

现在,VPS 上的端口 2000(在环回接口上)通向客户端 A。

第 3 步:连接客户端 B(消费者)

现在客户端B想要访问这个资源。它连接到同一个VPS并将其本地端口8080转发到服务器的端口2000。

chisel client vps-ip:8080 8080:127.0.0.1:2000

准备好!现在,当您在客户端 B 上打开 http://localhost:8080 时,您将看到该服务在客户端 A 上运行。

安全性和细微差别

Chisel 支持通过 --auth 标志进行身份验证,在通过公共服务器工作时强烈建议这样做。您还可以使用 TLS 证书来加密流量。

这种方法的主要优点是不需要 TUN/TAP 设备和复杂的路由表。这是一个精简的隧道,只做一件事:通过 WebSocket 连接绑定端口。如果您将 Chisel 配置为通过端口 443 工作,这甚至可以通过公司代理工作。

输出

Chisel 是用于特定网络任务的实用程序。当您需要在隔离节点之间转发端口而不设置成熟的 VPN 时,通过中继服务器的正向和反向隧道组合是完全可行的解决方案。

链接

https://github.com/jpillora/chisel