V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
uid106
V2EX  ›  分享创造

NodePass - 轻量高效 TCP/TLS 隧道工具

  •  
  •   uid106 · 2 天前 via iPhone · 1984 次点击

    NodePass

    NodePass 是一款基于 Go 语言开发的开源 TCP 隧道工具,适用于在复杂网络环境下实现数据传输。项目设计上将控制通道和数据通道分离,控制通道使用未加密的 TCP 连接,而数据通道支持三种 TLS 模式(无加密、自签证书、定制证书),以满足不同的安全要求。

    NodePass CLI

    主要功能与特点

    • 双模式架构

      • 服务器模式:在指定地址上监听控制连接,同时在目标地址上接受 TCP/UDP 流量。收到连接后,通过控制通道发送信号,并按配置的 TLS 模式建立数据通道。
      • 客户端模式:连接服务器控制通道,接收建立数据通道的信号,并将数据转发至本地目标。
    • 协议支持
      同时支持 TCP 和 UDP 流量,确保大部分应用场景下的兼容性,既适合全双工的持久通信,也能处理无状态的单次数据交换。

    • 灵活加密选项
      通过命令行参数配置 TLS 模式,用户可以根据实际需求选择无加密、自签证书或自定义证书模式,从而在安全性和性能之间找到平衡。

    • 智能连接池
      内置连接池用于管理和复用连接,自动处理连接的创建、重连以及资源释放,从而降低系统开销并保证稳定性。

    • 零配置部署
      所有参数均通过命令行和环境变量设定,无需额外配置文件。单一二进制文件即可部署,大大简化了安装和升级过程。

    工作原理

    1. 控制通道
      用于客户端和服务器之间的信号传递,保持长连接状态。所有建立数据通道的指令均通过这一通道传递。

    2. 数据通道
      根据服务器配置的 TLS 模式为每个传入连接创建独立数据通道,实现数据传输。可根据实际场景选择不同加密级别。

    3. 连接管理
      通过内置的连接池,对连接进行预先建立和动态管理。连接在使用后会自动关闭,确保系统资源的有效利用。

    使用示例

    • 服务器模式

    nodepass server://:10101/127.0.0.1:8080?tls=1

    启动一个服务器,监听 10101 端口,并将接收到的流量转发到本地 8080 端口,同时采用自动生成自签证书的 TLS 模式。

    • 客户端模式

    nodepass client://server.example.com:10101/127.0.0.1:8080

    客户端连接到服务器的控制通道,并将流量转发至本地 8080 端口,自动匹配服务器的 TLS 配置。

    NodePass 针对高级网络环境做了充分优化,适合对网络性能和安全性有一定要求的用户使用。

    详细信息和最新版本请参考仓库: https://github.com/yosebyte/nodepass

    第 1 条附言  ·  2 天前
    架构简体可供参考:

    TARGET
    | |
    TCP/UDP
    | |
    CLIENT———
    | | |
    TCP/TLS TCP
    POOL CTRL
    | | |
    SERVER———
    | |
    TCP/UDP
    | |
    USERS

    未来开发计划:新增 master 模式,以 rest api 方式管理多个 server 和/或 client ,对接 web 前端
    16 条回复    2025-04-05 20:22:55 +08:00
    kk2syc
        1
    kk2syc  
       2 天前
    frp 高清重制?
    uid106
        2
    uid106  
    OP
       2 天前 via iPhone
    @kk2syc 跟大头没得比啊,只是这就是做了一些创意性的活,比如自适应一次性 tcp 或 tls 连接池来管理提前建立的连接以节省掉握手的时间
    dcsuibian
        3
    dcsuibian  
       2 天前
    第一反应是用 Node.js 开发的
    kekxv
        4
    kekxv  
       2 天前 via iPhone
    客户端到服务器的连接能用 websocket 吗?
    molezznet
        5
    molezznet  
       2 天前
    试试看,tls 三个月更新后会 hot reload 吗?
    uid106
        6
    uid106  
    OP
       2 天前 via iPhone
    @dcsuibian 可以理解为服务器节点之间的数据传输
    uid106
        7
    uid106  
    OP
       2 天前 via iPhone
    @kekxv 的客户端与服务器之间采用的是直接的 TCP 连接,而不是 WebSocket 。虽然理论上可以通过 WebSocket 来隧道 TCP 流量(有类似 wstunnel 的工具),但 WebSocket 是建立在 TCP 之上的额外协议,具有消息帧和握手的额外开销,主要适用于浏览器端等环境。对于 NodePass 这种后端隧道传输工具,直接使用 TCP 能够保证更低的延迟和更高的传输效率,而且可以更容易升级为 TLS 连接。
    uid106
        8
    uid106  
    OP
       2 天前 via iPhone
    @molezznet 目前的设计为了考虑通用性没有接管证书维护( acme ),可以通过手动 restart 来重新载入证书文件
    shakukansp
        9
    shakukansp  
       2 天前
    支持 ssh 的 proxycommand 吗
    uid106
        10
    uid106  
    OP
       2 天前 via iPhone
    @shakukansp 可以利用 NodePass 创建的隧道,与 SSH 的 ProxyCommand 选项配合,实现通过受限网络环境访问远程服务器的需求,实际上任何基于 TCP/UDP (协议层)的服务都可以被转发
    caola
        11
    caola  
       2 天前
    和 Frp 对比没什么优势啊
    uid106
        12
    uid106  
    OP
       2 天前 via iPhone
    @caola 感谢反馈,的确如此,面对大而全和小而精的选择 nodepass 选择了后者(不重复造轮子),个人认为这个项目存在的意义还是能换种思路、架构或者流程来完成最基本的 tcp/udp 协议层的数据转发的这项功能,以及围绕如何用最少的资源实现最大化的性能,如何用最简单的用户体验来实现最小用户感知的、安全的传输方式,其中不乏有一些创新小点,例如预建立、可自动调节容量的连接池,两端如何保持池连接的对应性和连接池的纯净度的方法,udp 穿透时与 tcp 之间的协议转换,以及灵活的 tls 加密策略等等,希望这些想法的实现能抛砖引玉。如果觉得想法还不错,可以尝试下这款轻量化的隧道小工具
    klxyy
        13
    klxyy  
       1 天前
    @uid106 就喜欢小而精的,话说,能正常过墙么
    uid106
        14
    uid106  
    OP
       1 天前 via iPhone
    @klxyy 最低要求:只需要一端(作为 client )能 dial 到另一端(作为 server )就可以。例如防火墙内部主动 dial 外部 server ,或者防火墙外部主动 dial 内部公网 v4 或者 v6 。灵活性比较大,可以组合出很多玩法
    uid106
        15
    uid106  
    OP
       1 天前 via iPhone
    @molezznet 研究了一番,理论上可以实现热加载,设置个时间间隔环境变量吧,0 的话不加载,默认 1 天重新载入证书一下。下个版本加上,感谢建议!
    molezznet
        16
    molezznet  
       1 天前
    @uid106 OK 不迫切 , 毕竟几个月一次, 不行就 crontab 里曲线救国
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2765 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:33 · PVG 08:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.