logo
0
0
WeChat Login

Rust 反向端口转发 (Reverse Port Forwarding)

基于 Tokio 实现的反向端口转发系统,隧道转发地址由服务端控制。 expose 1 2099 127.0.0.1:80 2098 expose 1 2099 127.0.0.1:6080 2098 expose 1 2099 127.0.0.1:8686 2098

cargo build --release --target mipsel-unknown-linux-musl

cargo install cross cross build --target mipsel-unknown-linux-musl --release

架构说明

该系统包含两个主要组件:

客户端 (Client)

  • 连接到 WebSocket 服务器
  • 接收来自服务端的转发配置
  • 根据服务端的配置建立到目标地址的连接
  • 通过 WebSocket 隧道双向转发数据

服务端 (Server)

  • 监听外部连接
  • 控制客户端的转发配置(目标地址)
  • 将外部连接的数据通过 WebSocket 转发给客户端
  • 接收客户端的数据并转发给外部连接

特性

  • 🔄 反向端口转发:客户端在内网,服务端在公网
  • 🎛️ 服务端控制:隧道的目标地址由服务端动态配置
  • 🚀 异步高性能:基于 Tokio 和 futures
  • 🔌 WebSocket 隧道:使用 WebSocket 作为传输协议
  • 💬 JSON 协议:使用 JSON 格式的控制消息

构建和运行

构建项目

cargo build --release

启动服务端

cargo run --example server

服务端默认监听 0.0.0.0:8080 (WebSocket 端口)

启动客户端

cargo run -- ws://localhost:8080/ws client1

参数:

  • ws://localhost:8080/ws: WebSocket 服务器地址
  • client1: 客户端唯一标识符

控制消息协议

注册消息

{ "type": "register", "client_id": "client1" }

转发配置消息 (服务端 → 客户端)

{ "type": "forward_config", "tunnel_id": "client1:8080", "target_host": "localhost", "target_port": 22 }

停止转发消息 (服务端 → 客户端)

{ "type": "stop_forward", "tunnel_id": "client1:8080" }

数据消息

{ "type": "data", "tunnel_id": "client1:8080", "data": "base64_encoded_data" }

关闭连接消息

{ "type": "close", "tunnel_id": "client1:8080" }

错误消息

{ "type": "error", "tunnel_id": "client1:8080", "message": "Error description" }

使用场景示例

场景 1: 访问内网 SSH

  1. 在内网机器运行客户端:
cargo run -- ws://your-server.com:8080/ws office-pc
  1. 服务端配置转发 (在代码中添加或通过 API):
{ "type": "forward_config", "tunnel_id": "office-pc:2222", "target_host": "localhost", "target_port": 22 }
  1. 服务端监听 2222 端口,外部可通过 SSH 连接:
ssh -p 2222 user@your-server.com

场景 2: 访问内网 Web 服务

{ "type": "forward_config", "tunnel_id": "office-pc:8080", "target_host": "localhost", "target_port": 3000 }

访问 http://your-server.com:8080 即可访问内网的 Web 服务。

配置说明

客户端参数

参数说明示例
server_urlWebSocket 服务器地址ws://server.com:8080/ws
client_id客户端唯一标识client1

服务端参数

参数说明默认值
ws_portWebSocket 监听端口8080

安全建议

  1. 使用 wss:// (WebSocket Secure) 加密连接
  2. 实现客户端认证机制
  3. 使用 API Key 或 Token 进行身份验证
  4. 限制服务端监听的 IP 地址范围
  5. 添加连接速率限制

扩展功能

可以添加以下功能:

  • 多客户端管理和监控
  • Web 管理界面
  • TLS/SSL 支持
  • 客户端认证
  • 流量统计和日志
  • 自动重连机制
  • 配置持久化
  • REST API 控制接口

技术栈

  • tokio: 异步运行时
  • tokio-tungstenite: WebSocket 支持
  • serde/serde_json: JSON 序列化
  • anyhow: 错误处理
  • log/env_logger: 日志记录

许可证

MIT License