{"id":18602784,"url":"https://github.com/obgnail/nat-traversal-platform","last_synced_at":"2025-05-16T18:12:21.542Z","repository":{"id":112904329,"uuid":"494951512","full_name":"obgnail/nat-traversal-platform","owner":"obgnail","description":"内网穿透平台，支持多主机多应用穿透","archived":false,"fork":false,"pushed_at":"2022-07-21T08:13:47.000Z","size":17,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-18T01:41:59.680Z","etag":null,"topics":["frp","golang","nat-traversal","network","session"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/obgnail.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-22T03:42:34.000Z","updated_at":"2023-03-15T14:41:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"6f925470-8e17-4f90-ae38-911279f91528","html_url":"https://github.com/obgnail/nat-traversal-platform","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obgnail%2Fnat-traversal-platform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obgnail%2Fnat-traversal-platform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obgnail%2Fnat-traversal-platform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obgnail%2Fnat-traversal-platform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/obgnail","download_url":"https://codeload.github.com/obgnail/nat-traversal-platform/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254582909,"owners_count":22095519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["frp","golang","nat-traversal","network","session"],"created_at":"2024-11-07T02:12:31.772Z","updated_at":"2025-05-16T18:12:21.523Z","avatar_url":"https://github.com/obgnail.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nat-traversal-platform\n内网穿透平台，支持多主机多应用穿透\n\n## 时序图\n\n```mermaid\nsequenceDiagram\n\t\tautonumber\n    participant User\n    participant CommonServer\n    participant appGroup\n    participant appServer\n    participant Client\n    participant LocalApp\n\n    Note over CommonServer, Client: 准备阶段\n    CommonServer -\u003e\u003e CommonServer: 监听BindPort\n    Client -\u003e\u003e Client: 构建LocalApp对象\n    Client -\u003e\u003e CommonServer: 注册appGroup(写入readyGroup)\n    \n    Note over CommonServer, Client: 初始化阶段\n    Client -\u003e\u003e + CommonServer: 连接到Common conn，发送appGroup的信息\n    CommonServer -\u003e\u003e CommonServer: 根据已注册的readyGroup取出appGroup对象，校验\n    CommonServer -x appGroup: 通知appGroup,将此appGroup写入inUseGroup\n    appGroup -\u003e\u003e appGroup: 开启goroutine，监听heartbeat\n    appGroup -\u003e\u003e appServer: 通知所有的appServer开始监听端口\n    appServer -\u003e\u003e appServer: 开启goroutine，监听ProxyConn，等待User连接\n    CommonServer --\u003e\u003e - Client: 告知Client，该appGroup已经准备就绪，可以代理了\n    Client -\u003e\u003e Client: 存储appGroup在commonSever里监听的端口\n   \tpar par and loop\n   \t\tClient -\u003e\u003e CommonServer: 发送heartbeat\n   \t\tCommonServer -\u003e\u003e appGroup: 分发给appGroup\n   \t\tappGroup --\u003e\u003e Client: 响应heartbeat\n   \tend\n    \n    Note over User, LocalApp: 代理阶段\n    User -\u003e\u003e + appServer: User连接appServer，希望开始代理\n    appServer -\u003e\u003e appServer: 储存UserConn\n    appServer -\u003e\u003e appGroup: 通知appGroup\u003cbr/\u003e将「希望开启代理」的信号传给Client\n    appGroup -\u003e\u003e + Client: 告知Client「希望开启代理」\n    Client -\u003e\u003e Client: 从存储中找到「希望开启代理」的APP信息\n    Client -\u003e\u003e + LocalApp: 开启本地端口\n    LocalApp --\u003e\u003e - Client: 返回localConn\n    Client -\u003e\u003e appServer: 连接到appServer\n    appServer -\u003e\u003e appServer: 1.校验LocalAppConn和message\u003cbr/\u003e2.从存储中找到UserConn\n    par\n   \t\tappServer -\u003e\u003e appServer: Join LocalAppConn and UserConn\n   \tend\n\t\tappServer --\u003e\u003e Client: 返回remoteConn\n\t\tpar\n   \t\tClient -\u003e\u003e - Client: Join localConn and remoteConn\n   \tend\n    appServer --\u003e\u003e - User: 返回\n```\n\n- User：外部用户\n- CommonServer：负责 appGroup 的初始化，具体功能为 `控制信息的通讯` 和 `分发heartbeat` 。\n- appGroup：app 组。一个用户可能需要有多个 app 需要代理。每个用户使用一个 appGroup。不允许重名。\n- appServer：每个需要代理的 app\n- Client：转发来自代理服务器的信息给 LocalApp\n- LocalApp：处于内网的被代理的、提供实际业务功能的 app。\n\n\n\n## types\n\n```go\ntype GroupInfo struct {\n\tName string\n\tApps map[string]*AppInfo\n}\n\ntype CommonServer struct {\n\tName       string\n\tbindAddr   string\n\tlistenPort int64\n\n\tlistener *Listener\n\n\treadyLock  sync.Mutex // protect follow\n\treadyGroup map[string]*GroupInfo\n\n\t// 为了在断开连接时，快速找到并关闭appGroup\n  // CommonServer与appGroup互相引用\n\tinUseLock  sync.Mutex           // protect follow\n\tinUseGroup map[string]*appGroup // 对应appGroup的commonServer\n\tinUseConn  map[*Conn]*appGroup  // 对应appGroup的clientConn\n}\n\ntype appGroup struct {\n\tname          string\n\twantProxyApps map[string]*AppInfo\n\tonProxyApps   map[string]*appServer // appServer which is listening its own port\n\theartbeatChan chan *Message         // when get heartbeat msg, put msg in\n\tuserConnMap   sync.Map              // map[appServerName]UserConn\n\tclientConn    *Conn\n\tcommonServer  *CommonServer\n}\n\ntype appServer struct {\n\tname     string\n\tstatus   ServerStatus\n\tlistener *Listener\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobgnail%2Fnat-traversal-platform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobgnail%2Fnat-traversal-platform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobgnail%2Fnat-traversal-platform/lists"}