GITEE 开源 · 内网穿透反向转发

把内网流量塞进一条隧道,公网凭空多出几个端口

TSM Travel = Tunnel + Session Multiplexer + travel。对标 frp 的内网穿透反向转发系统—— 客户端只主动出站,路由器不用碰、端口映射不用做;同一份程序装好后,在 Web 面板里自助选角色。

  • Gitee 开源
  • Linux · Windows 双平台
  • Python 3.11+
  • TLS 1.3 加密
tsmtravel — server
$ bash deploy.sh --role server → 创建虚拟环境 · 安装依赖 → 初始化数据目录 · 写入角色与鉴权 ✓ 角色已写入:server ✓ 管理面板  http://0.0.0.0:1237 ✓ 控制端口  8000 ✓ 证书指纹  A3:9F:2C:71:... ! 别忘记放行 1237 / 8000 与每个转发端口
Core Features

四件事,是它想解决的核心问题

成熟架构原样承接 frp —— 双端模型、控制连接与数据连接分离、工作连接池、token 鉴权;真正下手改的,是「人怎么用它」。

01

一键直连

客户端只做一件事:主动向外连服务端。路由器不用碰、光猫不用设、端口映射不用做,也不借助任何第三方中转平台。插上就能通。

02

傻瓜式部署

Windows 双击脚本即启动;Linux 一条命令走完建环境、装依赖、初始化数据目录、写入角色与鉴权的全流程。不要求任何编程基础。

03

可视化操作

隧道建几条、端口怎么分配、客户端接进来没有、证书指纹是多少——全在 Web 面板里看得见、点得到,不用打开配置文件对着行号改。

04

双平台 · 免安装

完整支持 Linux 与 Windows。Windows 端可一键打包为免安装独立程序,目标机器连 Python 都不用装,整包拷走即可完成迁移。

frp → TSM Travel

对标 frp,差异只有三处

不是重造一套协议,而是在同一个成熟模型上,把「部署与运维的门槛」拆掉。

frp传统方案
管理界面
简单的 dashboard,配置仍主要靠命令行与文件
配置存储
散落的 ini / toml 文件,改一处要找半天
角色设定
frps 与 frpc 两个程序,装之前就得想清楚
TSM Travel本方案
管理界面
完整 Web 管理面板(FastAPI,端口 1237),全部操作在浏览器里点鼠标完成
配置存储
统一落到 SQLite 数据库,只存低频配置,存得住、查得到
角色设定
同一份程序,装好后访问管理端口自助选择角色,部署门槛砍掉大半
Architecture

管理面与数据面,硬分离

外部用户 浏览器 / 手机 / 客户端 公网服务器(服务端) 公网 IP · 对外提供服务 1237 面板 8000 控制 900+ 转发 管理进程(FastAPI)+ 转发内核(asyncio) TLS 1.3 单隧道 · 多路复用 内网机 A 客户端内核 不暴露任何端口 内网机 B 客户端内核 不暴露任何端口 内网机 N 客户端内核 不暴露任何端口 所有连接均由内网侧主动发起,公网侧只负责把流量送出去
Topology · 一条隧道 · N 个内网服务
IPC 边界 · 两个进程只在这条线上握手
管理面监听 127.0.0.1:1237 只处理交互、配置与日志
数据面监听 8000 + N 个转发端口 只搬流量,零业务逻辑
进程模型 管理 1 + 内核 1 同一份数据目录,互不内嵌
交互通道 127.0.0.1 IPC 只交换指令与状态快照

箭头只有一条,方向只有一个:内网侧主动出站。公网侧不接受任何入站反向连接,管理面与数据面之间也没有第二根线可以走。

架构上划了一条硬线:管理进程只管交互,压力小;转发内核独立扛流量。 两者仅通过 127.0.0.1 上的 IPC 交换指令与状态快照,转发逻辑一行都不写进管理进程。

进程 1 · 管理面

Web 管理面板

  • 技术栈 FastAPI + SQLite,默认监听 1237
  • 登录鉴权 · 隧道与服务器配置 · 接入信息与证书指纹
  • 日志查看与自动清理 · 转发内核看护(10 秒巡检)
进程 2 · 数据面

转发内核

  • 技术栈 asyncio + uvloop,控制端口 8000 与 N 个转发端口
  • 控制连接与数据连接分离 · 工作连接池 · token 鉴权
  • TLS 1.3 出站握手 · 断线重连 · 客户端离线后释放端口
单内核红线 —— 同一份数据目录下只允许一个转发内核。内核启动前会检查 core-<角色>.pid 里的进程是否还活着、本机 IPC 端口是否已被占用,任一命中就直接退出并报错,绝不降级运行。 在面板点一次「停止内核」,即可把本机所有残留内核连同 pid 文件一并清理干净。
Use Cases

两个最典型的落地场景

一个解决「家里那台设备出不去」,一个解决「项目还没上线就被备案卡住」。

内网 NAS 通过隧道连接公网服务器
SCENARIO 01

让没有公网 IP 的 NAS 真正走出去

运营商的大内网 NAT 已成常态,绝大多数家庭宽带拿不到独立公网 IPv4。家里那台群晖、威联通、绿联只能在局域网里转圈,人在外地想看张照片、取份文件都做不到。

现在做法很简单:一台有公网 IP 的云服务器当服务端,家里的 NAS 装成客户端。管理后台、私有云盘、相册、下载器想开几个服务,就开几条隧道。

  • NAS 本身不对公网暴露任何端口
  • 光猫与路由器一个字都不用改
  • 在外用手机或笔记本访问,体验与公网服务无异
海外节点与国内服务的隧道连接
SCENARIO 02

借海外节点免备案,用域名直连国内服务

国内服务器做网站通常要先走 ICP 备案,周期长、材料多,很多个人开发者与小团队在项目还处于验证阶段时就被卡在这一关。

TSM Travel 给出另一条路径:海外服务器架成服务端、国内服务器装成客户端,隧道把国内服务转发到海外节点,域名直接指向海外端口对外提供服务——不备案也能访问,项目当天就能上线跑起来。

  • 整条隧道 TLS 1.3 加密传输
  • 国内服务与数据始终留在本地机房、不出境
  • 跨境部署、内容分发、网络加速同样受用
Security & Engineering

安全方面也没有省事

面板有登录鉴权、密码有加盐哈希、传输有 TLS 1.3,工程化能力也一并补齐。

Quick Start

两条命令,一台内网服务就出去了

需要 Python 3.11 及以上(Debian 12 / Ubuntu 22.04 自带即为 3.11)。

Linux · 源码部署deploy.sh
# 公网机:一条命令装成服务端
bash deploy.sh --role server

# 内网机:带上服务端地址与 token
bash deploy.sh --role client \
  --server-addr 1.2.3.4 --token <服务端 token>

# 常用选项
--venv /opt/venvs/tsmtravel     # 指定虚拟环境
--mirror https://pypi.tuna...    # 国内镜像
--offline                        # 从 wheelhouse 离线装
--tune                           # 顺带系统调优(需 root)
--service                        # 装成 systemd 服务
Windows · 一键脚本desktop\
desktop\启动桌面控制台.bat    双击即启动图形控制台
desktop\package.bat           一键打出免安装发行版
desktop\package.bat onefile   主程序打成单个 exe

打包产物 → dist\tsmtravel\
  tsmtravel-desktop.exe   桌面控制台(推荐双击)
  tsmtravel.exe           主程序:内核 + Web 面板
  启动管理面板.bat         只启面板,浏览器自动打开
  使用说明.txt

整个文件夹拷到任意 x64 机器即可运行,
数据写在同级 data\,换机器整包带走即迁移。
STEP 1

放行端口

云厂商安全组与本机防火墙同时放行 1237、8000,以及每一个转发端口(900 / 901 / …)——这一步最容易漏。

STEP 2

建隧道

面板「隧道管理 → 新建隧道」,填隧道名、公网端口 remote_port、内网端口 local_port 与绑定客户端。

STEP 3

客户端接入

内网机跑同一份程序,填服务端地址、控制端口与 token,校验方式选 ca_file 或证书指纹,隧道名与端口保持一致。

Newsroom

最新动态

进入新闻中心 →

内网服务原地不动,公网凭空多出几个端口

TSM Travel 全部源码已在 Gitee 开放,欢迎下载试用、提交 Issue、参与共建。