{"id":13776082,"url":"https://github.com/longxboy/lunnel","last_synced_at":"2025-10-10T19:14:14.994Z","repository":{"id":144205129,"uuid":"76718858","full_name":"longXboy/lunnel","owner":"longXboy","description":"fast reverse-proxy","archived":false,"fork":false,"pushed_at":"2017-08-21T08:34:38.000Z","size":8146,"stargazers_count":301,"open_issues_count":6,"forks_count":61,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-04-09T15:05:53.064Z","etag":null,"topics":["ngrok","proxy","reverse-proxy","tunnel"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/longXboy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2016-12-17T10:54:50.000Z","updated_at":"2025-02-22T18:33:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"f58d12f3-2d7e-47a5-bd3e-9cda7536b9eb","html_url":"https://github.com/longXboy/lunnel","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/longXboy%2Flunnel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/longXboy%2Flunnel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/longXboy%2Flunnel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/longXboy%2Flunnel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/longXboy","download_url":"https://codeload.github.com/longXboy/lunnel/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248055284,"owners_count":21040157,"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":["ngrok","proxy","reverse-proxy","tunnel"],"created_at":"2024-08-03T17:01:59.881Z","updated_at":"2025-10-10T19:14:09.939Z","avatar_url":"https://github.com/longXboy.png","language":"Go","funding_links":[],"categories":["\u003ca id=\"01e6651181d405ecdcd92a452989e7e0\"\u003e\u003c/a\u003e工具"],"sub_categories":["\u003ca id=\"e9f97504fbd14c8bb4154bd0680e9e62\"\u003e\u003c/a\u003e反向代理"],"readme":"中文 | [English](README_en.md)\n\n# Lunnel\nlunnel 是一款简单易用的内网NAT穿越、反向代理软件，支持 HTTP, HTTPS, UDP, TCP、Unix socket 协议。\n\n## Feature\n\n1. 隧道连接默认使用 TCP、KCP 自动切换模式，隧道传输协议可以任意替换。\n2. 支持 AES、TLS 加密，客户端与服务器端建立隧道只需一次密钥交换握手，建立连接速度更快。\n3. 自建隧道连接池，保证高并发下的访问通畅。\n4. 单个连接支持多路并发(类似http 2.0)，更节省资源。\n\n## QuickStart\n\n### 为 docker daemon 配置 HTTP API 访问\n\n1. 修改服务端配置：\n\n```yaml\nserver_domain: example.com\nport: 8080\naes:\n  secret_key: password\ntls:\n  cert: ./example.crt\n  key: ./example.key\n```\n\n2. 在公网启动服务端程序：`sudo ./lunnelSer -c ./config.yml`\n3. 修改客户端配置并保存：\n\n```yaml\nserver_addr: \u003cyour_server_ip\u003e:8080\ntunnels:\n  docker:\n    schema: http\n    local: unix:///var/run/docker.sock\n    host: docker.exmpale.com\naes:\n  secret_key: password\nenable_compress: true\n```\n\n4. 在本地启动客户端程序：`./lunnelCli -c ./config.yml`\n5. 在浏览器中访问 docker.example.com 即可通过 http api 来控制 docker\n\n### 为 2048 小程序反向代理\n\n1. 使用上一例中服务端的配置并启动服务端程序：`sudo ./lunnelSer -c ./config.yml`\n2. 使用 docker 启动 2048 程序，并运行在本地 32768 端口：`docker run -d -p 32768:80 daocloud.io/sakeven/2048`\n3. 修改客户端配置并保存：\n\n```yaml\nserver_addr: \u003cyour_server_ip\u003e:8080\ntunnels:\n  2048:\n    schema: http\n    local: http://127.0.0.1:32768\n    http_host_rewrite: www.2408.com\ntls:\n  trusted_cert: ./cacert-example.pem\nserver_name:  example.com\n```\n\n4. 在本地启动客户端程序：`./lunnelCli -c ./config.yml`\n5. 通过观察客户端日志，找到外网公开访问地址后在浏览器中访问（因为本例没有为该代理隧道指定 host，所以由服务端分配远程公开访问地址）\n\n## Q\u0026A\n\n\u003e **Q: 在示例配置中客户端使用的是 TLS 加密方式，需要 CA 签发的 SSL 证书，如果没有的话怎么办?**\n\u003e \u003cbr\u003e**A: 可以使用 OpenSSL 自签名证书，请参考：[基于 OpenSSL 自建 CA 和颁发 SSL 证书](http://seanlook.com/2015/01/18/openssl-self-sign-ca/)、[OpenSSL 生成 SSL 证书](http://blog.sina.com.cn/s/blog_4fd50c390101891c.html)；\u003cbr\u003e或者您也可以在客户端以及服务端配置文件中指定 `aes.secret_key` 从而使用 aes 加密。**\n\n\u003e **Q: 启动程序的时候为何报错 `found character that cannot start any token`？**\n\u003e \u003cbr\u003e**A: YAML 格式的配置文件每一行的开头不允许出现 tab 字符，请将所有的 tab 换成空格。**\n\n## Config Reference\n\n- [客户端配置说明](https://github.com/longXboy/lunnel/blob/master/cmd/lunnelCli/config-full-example.yml)\n- [服务端配置说明](https://github.com/longXboy/lunnel/blob/master/cmd/lunnelSer/config-full-example.yml)\n\n## TODO\n\n- [x] 持久化客户端获得的远公开访问地址，不再因为暂时失联而重新分配公开访问地址\n- [x] 使用 HTTP API 实时修改客户端的代理隧道支持，不需要重启客户端\n- [ ] 优化隧道连接池算法\n- [ ] 底层传输协议支持 QUIC\n- [ ] 提供 Dashboard 管理界面，开放 HTTP 接口\n- [ ] 集成raft一致性协议，服务端可横向伸缩扩展\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flongxboy%2Flunnel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flongxboy%2Flunnel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flongxboy%2Flunnel/lists"}