FRP-AUTOMAP · 全端口自动映射工具:给你的私有云无限近似公网体验
2026-09-05
给没有公网 IPv4 地址的设备用的全端口自动映射工具。租一台云服务器跑服务端, 本地设备跑客户端,之后本地每起一个服务,公网就能直接访问,不用为任何一个端口 手写配置。
与 frp 的关系
本项目基于 frp 的成熟架构与思路开发, 单连接复用、连接池、控制面与数据面分离等设计均借鉴自 frp。frp 功能全面, 但每条通道都要手工配置;FRP-AUTOMAP 把它收窄成一个目标:把登记这件事 完全自动化——自动发现本地正在监听的服务端口,自动登记、自动注销, 让维护工作从"配一堆条目"变成"什么都不用配"。
工作方式
- 周期读取系统端口表,自动发现本地正在监听的服务端口,并过滤掉系统进程端口;
- 新端口出现即自动登记,云端同步开放同号公网端口;
- 服务停止后自动注销,公网端口同步关闭;
- 断线后自动重连,重连成功按当前状态重建全部登记。
核心设计
两端之间只维持一条常活 TCP 连接,所有端口的通信复用这条连接上的逻辑流; 每个端口维护一个小型连接池,空闲连接常驻,请求到达时直接从池中取用。 客户端运行在 Windows,服务端运行在 Linux,Go 语言编写。配置只有服务器地址、 端口和少量参数,首次运行自动生成配置文件。
代码片段
端口池维持逻辑,空闲时恒定保持目标数量的就绪流:
func (e *Engine) ensurePool(t *tunnel, target int) {
need := target - len(t.pipes) - t.connecting
if need > 0 {
for i := 0; i < need; i++ {
go e.buildPipe(t)
}
}
}
端口变化后的自动登记与注销:
added, removed := table.Diff(prev, cur)
for _, k := range added {
register(k)
}
for _, k := range removed {
unregister(k)
}
客户端配置文件(自动生成,按需修改):
[client]
server_addr = your-cloud-host
server_port = 500
data_conns_per_port = 4
detect_interval_ms = 500
项目持续迭代中,仓库整理好后会放上来。作者主页: github.com/adminmmakdbusb。