一 前言
原帖来自Nodeseek:https://www.nodeseek.com/post-295115-1。
在复杂多变的网络环境中,我们常常面临各种连接难题:防火墙限制、NAT穿透、安全性隐患……这些问题是否让你感到困扰?现在,NodePass带着其独特的新特性,如闪电般的速度、坚如磐石的安全防护、智能连接池和卓越的可靠性,为你带来了全新的解决方案!
NodePass,这款从备受赞誉的Passport项目中脱胎换骨的开源软件,不仅继承了Passport的优秀基因,更在性能和功能上实现了质的飞跃。它是一个优雅、高效的TCP隧道解决方案,能够在网络端点之间建立安全的通信桥梁,轻松穿越各种网络障碍。更值得一提的是,Passport项目也将迎来一次彻底的革新,敬请期待!
NodePass的出现,旨在简化复杂的网络连接,让开发人员和系统管理员能够专注于更重要的任务,而无需为网络问题烦恼。无论你是需要安全地访问内部服务、绕过网络限制,还是构建高可靠性的微服务通信,NodePass都能为你提供强大的支持。让我们一起探索NodePass的无限可能,开启网络连接的新篇章!
项目地址,欢迎STAR关注:https://github.com/yosebyte/nodepass
image
NodePass是一个优雅、高效的TCP隧道解决方案,可在网络端点之间创建安全的通信桥梁。通过建立使用TLS加密保护的控制通道,NodePass能够在受限网络环境中实现无缝数据传输。其服务器-客户端架构允许灵活部署,使服务能够穿越防火墙、NAT和其他网络障碍。凭借智能连接池、最小资源占用和简洁的命令语法,NodePass为开发人员和系统管理员提供了一个强大且易用的工具,可以解决复杂的网络挑战,同时不影响安全性或性能。
1✨ 功能特点
🔄 双重操作模式: 可作为服务器接受连接或作为客户端发起连接
🔒 TLS加密通信: 所有隧道流量均使用TLS加密确保安全
🔌 高效连接池: 优化的连接管理,支持可配置的池大小
📊 灵活的日志系统: 可配置的五种不同日志级别
🛡️ 弹性错误处理: 自动连接恢复和优雅关闭
📦 单一二进制部署: 简单分发和安装,依赖项极少
⚙️ 零配置文件: 所有设置通过命令行参数和环境变量指定
🚀 低资源占用: 即使在高负载下也能保持最小的CPU和内存使用
♻️ 自动重连: 从网络中断中无缝恢复
🧩 模块化架构: 客户端、服务器和公共组件之间清晰分离
🔍 全面调试: 详细的连接追踪和信号监控
⚡ 高性能数据交换: 优化的双向数据传输机制
🧠 智能连接管理: 智能处理连接状态和生命周期
📈 可扩展信号量系统: 防止高流量期间资源耗尽
🔄 基于URL的信号协议: 端点间优雅且可扩展的通信
🛠️ 可配置池动态: 根据工作负载调整连接池行为
🔌 一次性连接模式: 通过非重用连接增强安全性
📡 动态端口分配: 自动管理安全通信的端口分配
2📋 系统要求
Go 1.24或更高版本(从源代码构建时需要)
服务器和客户端端点之间的网络连接
绑定1024以下端口可能需要管理员权限
二📥 安装方法
1💾 方式1: 预编译二进制文件
从我们的发布页面下载适合您平台的最新版本。
2🔧 方式2: 使用Go安装
go install github.com/yosebyte/nodepass/cmd/nodepass@latest
3🛠️ 方式3: 从源代码构建
克隆仓库
git clone https://github.com/yosebyte/nodepass.git
构建二进制文件
cd nodepass
go build -o nodepass ./cmd/nodepass
可选: 安装到GOPATH/bin
go install ./cmd/nodepass
4🐳 方式4: 使用容器镜像
NodePass在GitHub容器注册表中提供容器镜像:
拉取容器镜像
docker pull ghcr.io/yosebyte/nodepass:latest
服务器模式运行
docker run -d --name nodepass-server -p 10101:10101 -p 8080:8080 \
ghcr.io/yosebyte/nodepass server://0.0.0.0:10101/0.0.0.0:8080
客户端模式运行
docker run -d --name nodepass-client \
-e MIN_POOL_CAPACITY=32 \
-e MAX_POOL_CAPACITY=512 \
-p 8080:8080 \
ghcr.io/yosebyte/nodepass client://server.example.com:10101/127.0.0.1:8080
三 🚀 使用方法
NodePass可以使用直观的URL风格命令在服务器模式或客户端模式下运行:
1🖥️ 服务器模式
nodepass server://<tunnel_addr>/<target_addr>?log=
tunnel_addr: TLS隧道端点地址(例如, 10.1.0.1:10101)
target_addr: 要进行隧道传输的服务地址(例如, 10.1.0.1:8080)
log: 日志级别(debug, info, warn, error, fatal)
示例:
nodepass server://10.1.0.1:10101/10.1.0.1:8080?log=debug
2📱 客户端模式
nodepass client://<tunnel_addr>/<target_addr>?log=
tunnel_addr: NodePass服务器隧道端点地址(例如, 10.1.0.1:10101)
target_addr: 要连接的本地地址(例如, 127.0.0.1:8080)
log: 日志级别(debug, info, warn, error, fatal)
示例:
nodepass client://10.1.0.1:10101/127.0.0.1:8080?log=info
3⚙️ 配置选项
NodePass采用命令行参数和环境变量的极简方法:
1)📝 日志级别
debug: 详细调试信息 - 显示所有操作和连接
info: 一般操作信息(默认) - 显示启动、关闭和关键事件
warn: 警告条件 - 仅显示不影响核心功能的潜在问题
error: 错误条件 - 仅显示影响功能的问题
fatal: 致命条件 - 仅显示导致终止的严重错误
2)🔧 环境变量
变量 描述 默认值 示例
SEMAPHORE_LIMIT 最大并发连接数 1024 export SEMAPHORE_LIMIT=2048
MIN_POOL_CAPACITY 最小连接池大小 16 export MIN_POOL_CAPACITY=32
MAX_POOL_CAPACITY 最大连接池大小 1024 export MAX_POOL_CAPACITY=4096
REPORT_INTERVAL 健康检查报告间隔 5s export REPORT_INTERVAL=10s
SERVICE_COOLDOWN 重启尝试前的冷却期 5s export SERVICE_COOLDOWN=3s
SHUTDOWN_TIMEOUT 优雅关闭超时 5s export SHUTDOWN_TIMEOUT=10s
三📚 使用示例
1🔐 基本服务器设置
启动一个隧道到本地Web服务器的服务器
nodepass server://0.0.0.0:10101/127.0.0.1:8080?log=debug
启动一个增加连接限制的服务器
export SEMAPHORE_LIMIT=2048
nodepass server://10.1.0.1:10101/10.1.0.1:5432?log=info
2🔌 连接到NodePass服务器
连接到远程NodePass服务器并在本地公开服务
nodepass client://server.example.com:10101/127.0.0.1:8080
为高吞吐量场景连接并优化池设置
export MIN_POOL_CAPACITY=32
export MAX_POOL_CAPACITY=2048
nodepass client://10.1.0.1:10101/127.0.0.1:3000?log=debug
3🗄️ 通过防火墙访问数据库
服务器端(位于安全网络内)
nodepass server://0.0.0.0:10101/db.internal:5432?log=info
客户端(位于防火墙外)
nodepass client://server.example.com:10101/127.0.0.1:5432
本地连接到数据库
psql -h 127.0.0.1 -p 5432 -U dbuser -d mydatabase
4🔒 安全的微服务通信
服务A(提供API)
nodepass server://0.0.0.0:10101/127.0.0.1:8081?log=warn
服务B(消费API)
nodepass client://service-a:10101/127.0.0.1:8082
服务C(消费API)
nodepass client://service-a:10101/127.0.0.1:8083
所有服务通过加密通道通信
5📡 物联网设备管理
中央管理服务器
nodepass server://0.0.0.0:10101/127.0.0.1:8888?log=info
物联网设备1
nodepass client://mgmt.example.com:10101/127.0.0.1:80
物联网设备2
nodepass client://mgmt.example.com:10101/127.0.0.1:80
所有设备可从管理界面安全访问
6🧪 多环境开发
生产API访问隧道
nodepass server://0.0.0.0:10101/api.production:443?log=warn
开发环境
nodepass client://tunnel.example.com:10101/127.0.0.1:3000
测试环境
nodepass client://tunnel.example.com:10101/127.0.0.1:3001
两个环境都可以安全访问生产API
7🐳 容器部署
为容器创建网络
docker network create nodepass-net
部署NodePass服务器
docker run -d --name nodepass-server \
--network nodepass-net \
-p 10101:10101 \
ghcr.io/yosebyte/nodepass server://0.0.0.0:10101/web-service:80?log=info
部署Web服务作为目标
docker run -d --name web-service \
--network nodepass-net \
nginx:alpine
部署NodePass客户端
docker run -d --name nodepass-client \
-p 8080:8080 \
ghcr.io/yosebyte/nodepass client://nodepass-server:10101/127.0.0.1:8080?log=info
通过http://localhost:8080访问Web服务
四🔍 工作原理
NodePass创建带有安全控制通道的网络隧道:
1 服务器模式:
设置三个监听器: 隧道(TLS加密)、远程(未加密)和目标
接受隧道端点上的传入连接
当客户端连接到目标时,通过安全隧道向客户端发送信号
然后客户端建立到远程端点的连接(未加密)
在目标和远程连接之间交换数据
2 客户端模式:
使用TLS连接到服务器的隧道端点(加密控制通道)
通过此安全通道监听来自服务器的信号
收到信号后,连接到服务器的远程端点(未加密数据通道)
建立到本地目标地址的连接
在远程和本地目标连接之间交换数据
3 安全架构:
只有服务器和客户端之间的隧道连接(tunnelConn)使用TLS加密
携带实际数据的远程连接(remoteConn)是未加密的TCP
信号和协调通过安全TLS隧道进行
此设计在高吞吐量场景中平衡了安全性和性能
五🏗 架构原则
NodePass基于几个核心架构原则构建,确保其可靠性、安全性和性能:
1. 关注点分离
代码库在以下方面保持清晰分离:
命令层: 处理用户输入和配置(在cmd/nodepass中)
服务层: 实现核心客户端和服务器逻辑(在internal中)
公共层: 提供客户端和服务器组件之间的共享功能
2. 基于上下文的流控制
使用Go的context包进行正确的取消传播
在请求终止时启用所有组件的清洁关闭
防止服务终止期间的资源泄漏
3. 弹性错误处理
实现可配置冷却期的自动重连
无需用户干预即可优雅处理网络中断
使用全面的错误日志进行故障排除
4. 安全优先设计
对所有隧道流量使用TLS加密
需要时生成内存中的TLS证书
在网络通信中遵循最小权限原则
5. 资源效率
使用连接池以最小化连接建立开销
实现信号量模式进行并发控制
提供可配置限制以防止资源耗尽
六🔄 数据传输流程
NodePass通过其隧道架构建立双向数据流:
1 服务器端流程
1)连接初始化:
[目标客户端] → [目标监听器] → [服务器: 创建目标连接]
2)信号生成:
[服务器] → [生成唯一连接ID] → [通过TLS加密隧道向客户端发送信号]
3)连接准备:
[服务器] → [在池中创建未加密的远程连接] → [等待客户端连接]
4)数据交换:
[目标连接] ⟷ [conn.DataExchange] ⟷ [远程连接(未加密)]
2 客户端流程
1)信号接收:
[客户端] → [从TLS加密隧道读取信号] → [解析连接ID]
2)连接建立:
[客户端] → [从池中检索连接] → [连接到远程端点(未加密)]
3)本地连接:
[客户端] → [连接到本地目标] → [建立本地连接]
4)数据交换:
[远程连接(未加密)] ⟷ [conn.DataExchange] ⟷ [本地目标连接]
3 双向交换
conn.DataExchange()函数实现并发双向数据管道:
为每个方向使用单独的goroutine
同时高效处理两个方向的数据传输
正确传播连接终止事件
六📡 信号通信机制
NodePass通过TLS隧道使用基于URL的复杂信号协议:
1信号类型
1)远程信号:
格式: remote://
目的: 通知客户端关于服务器的远程端点端口
时机: 在健康检查期间定期发送
2)启动信号:
格式: launch://<connection_id>
目的: 请求客户端为特定ID建立连接
时机: 当收到新的目标服务连接时发送
2信号流程
1)信号生成:
服务器为特定事件创建URL格式的信号
信号以换行符终止以便正确解析
2)信号传输:
服务器将信号写入TLS隧道连接
使用互斥锁防止并发写入隧道
3)信号接收:
客户端使用缓冲读取器从隧道读取信号
信号被修剪并解析为URL格式
4)信号处理:
客户端将有效信号放入缓冲通道(signalChan)
专用goroutine处理通道中的信号
信号量模式防止信号溢出
5)信号执行:
远程信号更新客户端的远程地址配置
启动信号触发clientOnce()方法建立连接
3信号弹性
具有可配置容量的缓冲通道防止高负载期间信号丢失
信号量实现确保受控并发
错误处理用于格式错误或意外信号
七🔌 连接池架构
NodePass实现高效的连接池系统来管理网络连接:
1池设计
1)池类型:
客户端池: 预先建立到远程端点的连接
服务器池: 管理来自客户端的传入连接
2)池组件:
连接存储: 线程安全的连接ID到net.Conn对象的映射
ID通道: 可用连接ID的缓冲通道
容量管理: 基于使用模式的动态调整
连接工厂: 可定制的连接创建函数
2连接生命周期
1)连接创建:
创建连接直到配置的容量
每个连接分配唯一ID
ID和连接存储在池中
2)连接获取:
客户端使用连接ID检索连接
服务器从池中检索下一个可用连接
返回前验证连接
3)连接使用:
获取时从池中移除连接
用于端点之间的数据交换
不重用连接(一次性使用模型)
4)连接终止:
使用后关闭连接
适当释放资源
错误处理确保清洁终止
3池管理
1)容量控制:
MIN_POOL_CAPACITY: 确保最小可用连接
MAX_POOL_CAPACITY: 防止过度资源消耗
基于需求模式的动态缩放
2)池管理器:
ClientManager(): 维护客户端连接池
ServerManager(): 管理服务器连接池
3)一次性连接模式:
池中的每个连接遵循一次性使用模式:
创建并放入池中
为特定数据交换检索一次
永不返回池(防止潜在数据泄漏)
使用后适当关闭
4)自动池大小调整:
池容量根据实时使用模式动态调整
如果连接创建成功率低(<20%),容量减少以最小化资源浪费
如果连接创建成功率高(>80%),容量增加以适应更高流量
渐进缩放防止振荡并提供稳定性
尊重配置的最小和最大容量边界
在低活动期间缩小规模以节省资源
流量增加时主动扩展以维持性能
适应不同网络条件的自调节算法
为客户端和服务器池提供单独的调整逻辑以优化不同流量模式
5)效率考虑:
预先建立减少连接延迟
连接验证确保只使用健康连接
适当的资源清理防止连接泄漏
基于间隔的池维护平衡资源使用与响应能力
具有最小开销的优化连接验证
八💡 常见使用场景
🚪 远程访问: 从外部位置访问私有网络上的服务,无需VPN基础设施。适用于从远程工作环境访问开发服务器、内部工具或监控系统。
🧱 防火墙绕过: 通过建立使用常允许端口(如443)的隧道,在限制性网络环境中导航。适合具有严格出站连接策略的企业环境或连接有限的公共Wi-Fi网络。
🏛️ 遗留系统集成: 安全连接现代应用程序到遗留系统,无需修改遗留基础设施。通过在旧应用组件和新应用组件之间提供安全桥梁,实现渐进现代化策略。
🔒 安全微服务通信: 在不同网络或数据中心的分布式组件之间建立加密通道。允许微服务安全通信,即使在公共网络上,无需实现复杂的服务网格解决方案。
📱 远程开发: 从任何地方连接到开发资源,实现无缝编码、测试和调试内部开发环境,无论开发人员位置如何。支持现代分布式团队工作流和远程工作安排。
☁️ 云到本地连接: 无需将内部系统直接暴露给互联网,即可将云服务与本地基础设施连接起来。为需要环境之间保护通信通道的混合云架构创建安全桥梁。
🌍 地理分布: 从不同位置访问特定区域的服务,克服地理限制或测试区域特定功能。对于需要在不同市场一致运行的全球应用程序非常有用。
🧪 测试环境: 创建到隔离测试环境的安全连接,而不影响其隔离性。使QA团队能够安全访问测试系统,同时维护测试数据和配置的完整性。
🔄 API网关替代: 作为特定服务的轻量级API网关替代方案。提供对内部API的安全访问,而无需全面API管理解决方案的复杂性和开销。
🔒 数据库保护: 启用安全数据库访问,同时使数据库服务器完全隔离,免受直接互联网暴露。创建一个安全中间层,保护宝贵的数据资产免受直接网络攻击。
🌐 跨网络物联网通信: 促进部署在不同网络段的物联网设备之间的通信。克服物联网部署中常见的NAT、防火墙和路由挑战,跨多个位置。
🛠️ DevOps管道集成: 将CI/CD管道安全连接到各种环境中的部署目标。确保构建和部署系统可以安全地到达生产、暂存和测试环境,而不影响网络安全。
九🔧 故障排除
1📜 连接问题
验证防火墙设置允许指定端口上的流量
检查客户端模式下隧道地址是否正确指定
确保TLS证书生成正确
增加日志级别到debug以获取更详细的连接信息
验证客户端和服务器端点之间的网络稳定性
如果在不同网络间运行,检查NAT穿越问题
如果在负载下遇到连接失败,检查系统资源限制(文件描述符等)
如果使用主机名作为隧道或目标地址,验证DNS解析
2🚀 性能优化
1)连接池调优
根据预期的最小并发连接调整MIN_POOL_CAPACITY
太低: 流量高峰期延迟增加,因为必须建立新连接
太高: 维护空闲连接浪费资源
推荐起点: 平均并发连接的25-50%
配置MAX_POOL_CAPACITY以处理峰值负载,同时防止资源耗尽
太低: 流量高峰期连接失败
太高: 潜在资源耗尽影响系统稳定性
推荐起点: 峰值并发连接的150-200%
根据预期峰值并发隧道会话设置SEMAPHORE_LIMIT
太低: 流量高峰期拒绝连接
太高: 太多并发goroutine可能导致内存压力
推荐范围: 大多数应用1000-5000,高吞吐量场景更高
2)网络配置
优化客户端和服务器上的TCP设置:
调整长寿命连接的TCP保活时间间隔
考虑高吞吐量应用的TCP缓冲区大小
如可用,启用TCP BBR拥塞控制算法
3)资源分配
确保客户端和服务器上有足够的系统资源:
监控峰值负载期间的CPU使用率
跟踪连接管理的内存消耗
验证端点之间有足够的网络带宽
4)监控建议
实现连接跟踪以识别瓶颈
监控连接建立成功率
跟踪数据传输率以识别吞吐量问题
测量连接延迟以优化用户体验
5)高级场景
对于高吞吐量应用:
export MIN_POOL_CAPACITY=64
export MAX_POOL_CAPACITY=4096
export SEMAPHORE_LIMIT=8192
export REPORT_INTERVAL=2s
对于低延迟应用:
export MIN_POOL_CAPACITY=32
export MAX_POOL_CAPACITY=1024
export SEMAPHORE_LIMIT=2048
export REPORT_INTERVAL=1s
对于资源受限环境:
export MIN_POOL_CAPACITY=8
export MAX_POOL_CAPACITY=256
export SEMAPHORE_LIMIT=512
export REPORT_INTERVAL=10s
十 省流总结
NodePass是一个内网穿透工具,单文件兼具服务端和客户端功能,两端会首先建立一条tls连接用户通信,随后会打时间差,提前建立若干tcp连接,形成一次性连接池,并且会根据负载情况动态调整连接池容量,这样的穿透设计节省了大量的tcp握手时间,另外还有很多实用的技术保障了目标服务穿透的稳定性和可靠性。
十一 具体用法
最基础的用法
server://:12345/目标服务外部地址A
client://server:12345/目标服务内部地址B
之后就可以通过访问A来实现访问B
评论 (0)