{"id":13826002,"url":"https://github.com/lubyruffy/tcptunnel","last_synced_at":"2025-04-30T11:09:40.660Z","repository":{"id":78835137,"uuid":"117319657","full_name":"LubyRuffy/tcptunnel","owner":"LubyRuffy","description":"将本地内网服务器映射到公网。","archived":false,"fork":false,"pushed_at":"2018-03-18T05:38:10.000Z","size":92,"stargazers_count":88,"open_issues_count":2,"forks_count":25,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-11-20T04:33:27.699Z","etag":null,"topics":["debug","frp","go","nat","ngrok","proxy","reverse-proxy","security","tunnel"],"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/LubyRuffy.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.md","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}},"created_at":"2018-01-13T06:19:02.000Z","updated_at":"2024-09-13T21:21:35.000Z","dependencies_parsed_at":"2023-04-13T05:49:15.970Z","dependency_job_id":null,"html_url":"https://github.com/LubyRuffy/tcptunnel","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LubyRuffy%2Ftcptunnel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LubyRuffy%2Ftcptunnel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LubyRuffy%2Ftcptunnel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LubyRuffy%2Ftcptunnel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LubyRuffy","download_url":"https://codeload.github.com/LubyRuffy/tcptunnel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227196114,"owners_count":17746178,"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":["debug","frp","go","nat","ngrok","proxy","reverse-proxy","security","tunnel"],"created_at":"2024-08-04T09:01:30.608Z","updated_at":"2024-11-29T19:18:32.589Z","avatar_url":"https://github.com/LubyRuffy.png","language":"Go","funding_links":[],"categories":["\u003ca id=\"01e6651181d405ecdcd92a452989e7e0\"\u003e\u003c/a\u003e工具"],"sub_categories":["\u003ca id=\"9d6789f22a280f5bb6491d1353b02384\"\u003e\u003c/a\u003e隧道\u0026\u0026穿透"],"readme":"# tcptunnel\n用于两种场景：\n1. 直接的端口转发，这个好理解\n2. 做内网服务器到公网的映射访问，用于解决内网服务器没有公网IP或者无法进行端口映射的场景\n\n想要完成ngrok和lcx等类似的功能，对于lcx定义的slave啊，listen啊，tran啊我觉得很大歧义，半天理解不了。所以我发明了三个简单易懂的连接方式：\n* 公网服务器： publicserver，用于做转发的，监听一个对外开放的端口就行（对，我这里只要一个端口就行）\n* 内网服务器：natserver，也就是实际希望被外网访问的局域网服务器（或者是局域网代理）\n* 客户端：client，连接客户端，这个很好理解，实际的访问者，本地启动后，通过其他客户端连接本地监听的端口就相当于访问内网服务器\n\n是不是更容易理解？是的话直接夸我。\n\n**注意：没有经过大量实际测试，请谨慎用于生产环境。**\n\n## 编译\n由于用到了1.9才有的sync.Map, 所以编译环境必须是1.9+，见谅见谅 ；）\n```\ngit clone https://github.com/LubyRuffy/tcptunnel\ngo get\ngo build\n```\n生成tcptunnel文件\n\n跨平台编译，比如到NAS服务器或者树莓派等ARM平台，执行：\n```\nGOOS=linux GOARCH=arm GOARM=5 go build\n```\n\n## 运行\n直接执行是读取config.toml配置文件中的内容，最主要的是Mode和对应的配置内容，后续在配置文件中说明。\n```\n./tcptunnel \n```\n\n### 作为内网映射运行：\n- 作为publciserver执行，放到公网服务器\n```\n./tcptunnel -m publicserver\n```\n- 作为natserver执行，放到内网的服务器\n```\n./tcptunnel -m natserver\n```\n- 作为client执行，放到需要访问内网服务器的客户端\n```\n./tcptunnel -m client\n\n然后连接本地端口就相当于连接natserver里面对应的服务器了\n\n```\nnatserver 和 client 通信是通过约定好一致的唯一ID来进行。\n\n### 作为tcpproxy执行，也就是端口转发\n```\n./tcptunnel -m tcpproxy\n```\n\n## 配置文件说明\n默认读取config.toml文件，\n```\n# 模式： 支持publicserver，natserver，client，tcpproxy。可以通过命令行的-m参数覆盖\nMode = \"publicserver\"\n\n# 连接公网服务器的地址，格式为 host:port\n# 在Mode为 natserver 和 clientconnect 时有效\nPublicServerAddr = \"127.0.0.1:10011\"\n\n# 端口转发模式，仅仅在Mode为 tcpproxy 时有效\n[TcpProxies]\n    # 数组，可以多个映射关系\n    [TcpProxies.proxy80]\n    LocalBindAddr = \"127.0.0.1:1234\"\n    RemoteServerAddr = \"192.168.1.1:80\"\n    Type = \"http\"\n\n    [TcpProxies.proxy22]\n    LocalBindAddr = \"127.0.0.1:1235\"\n    RemoteServerAddr = \"192.168.1.1:22\"\n\n# 公网服务器监听的地址，仅仅在Mode为 publicserver 时有效，格式为 ip:port\n[PublicServer]\nLocalBindAddr = \"127.0.0.1:10011\"\n\n# 端口转发模式，仅仅在Mode为 natserver 时有效\n[NatServer]\n    # 数组，可以多个映射关系，ID用于注册，客户端连接的时候直接通过ID来进行查找\n    [NatServer.test]\n    RemoteServerAddr = \"192.168.1.1:80\"\n    ID = \"test\"\n    Type = \"http\"\n\n    [NatServer.test1]\n    RemoteServerAddr = \"192.168.1.1:22\"\n    ID = \"test1\"\n    \n# 端口转发模式，仅仅在Mode为 client 时有效\n[ClientConnect]\n    # 数组，可以多个映射关系，ID用于标示连接时指定NAT后的服务器对象\n    [ClientConnect.test]\n    LocalBindAddr = \"127.0.0.1:1234\"\n    ID = \"test\"\n```\n\n## 流程说明\n```\nnatserver    REGISTER   -\u003e publicserver\n                           publicserver \u003c- CONNECT client \u003c- application tcp connect\nnatserver NEWDATASTREAM \u003c- publicserver\nnatserver   DATASTREAM  -\u003e publicserver\n                           publicserver -\u003e 200 OK client \u003c-\u003e application tcp connect\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flubyruffy%2Ftcptunnel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flubyruffy%2Ftcptunnel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flubyruffy%2Ftcptunnel/lists"}