尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Sunny-Ngrok实战指南:内网穿透原理、配置与避坑全攻略

Sunny-Ngrok实战指南:内网穿透原理、配置与避坑全攻略 讲真内网穿透这需求早几年我都是自己拿公网服务器搭反向代理硬扛麻烦不说光证书和安全组就能折腾一晚上。后来项目里频繁要给客户演示本地Demo、调微信小程序回调、连家里NAS才正儿八经把Sunny-Ngrok这类工具用起来。Sunny-Ngrok说白了就是一个内网穿透服务你本地起了个服务别人在公网上通过一条隧道就能直接访问不用公网IP、不用改路由、不用备案前提是域名合规。这篇文章就把我实际使用Sunny-Ngrok的经验、配置步骤、踩过的坑一次性写清楚新手照着做就能把本地服务安全地暴露到公网。1. 内网穿透这回事搞懂原理再动手1.1 为什么需要内网穿透NAT和公网IP的问题先解决一个最基本的问题为什么你的本地服务别人访问不到绝大多数家庭和办公网络运营商分配给你的IP是内网IP或者动态公网IP你在路由器后面设备地址是192.168.x.x这类保留段。公网上的用户要访问你的电脑首先得找到你但路由器背后有NAT网络地址转换挡着外部请求根本不知道往哪里转发。即便你有公网IP运营商默认屏蔽了80/443端口自己搭服务还得过备案、安全组、防火墙这一关。内网穿透的本质就是你的设备主动向公网上的一个中转服务器建立长连接中转服务器再把这个连接转发给真正想访问你的人。这样你不需要公网IP不需要在路由器上做端口映射只要你能主动访问外网就能让别人通过外网访问你。1.2 Sunny-Ngrok和官方ngrok的差异官方ngrok海外节点在国内访问速度很不稳定免费域名还会随机变化每次重启隧道URL都会变。Sunny-Ngrok在国内部署了多个服务器节点而且提供免费和付费两种模式。免费用户也能拥有相对固定的域名配合国内节点速度靠谱很多这是当时我选它而不是自己搭frp的关键原因。实际上Sunny-Ngrok底层用的也是ngrok的技术方案服务端和客户端协议兼容这就意味着官方ngrok的很多参数、文档思路同样适用网上搜ngrok教程时大部分内容都能参考。如果你对数据隐私特别敏感内网穿透的数据流量都会经过Sunny-Ngrok的服务器所以不要在隧道里传密码、密钥这类敏感信息自己测试用没问题生产环境建议加HTTPS和鉴权。1.3 适用场景与使用边界Sunny-Ngrok适合的几种典型场景我列一下本地开发微信公众号或小程序回调、给异地同事演示本地项目、SSH连回家里电脑、游戏联机、调试支付宝/微信支付回调。不适合的场景也有大量文件传输、视频流媒体、高并发生产业务。免费版带宽一般限制在1Mbps到2Mbps看个接口返回没问题推流或者传大文件会很痛苦。另外强调一点用内网穿透把服务暴露到公网等于把一台内网设备开放给了外网务必只在需要时开启隧道用完就关服务本身要加密码、Token这类鉴权尽量别裸奔。2. 开工前的准备工作账号、隧道与客户端2.1 注册账号并获取authtoken使用Sunny-Ngrok前先去官网注册一个账号。注册后进入管理后台找到“访问端”或“认证信息”页面里面有一串authtoken这是你本地客户端连接服务器的凭证等同于你的身份ID。获取authtoken后建议先复制保存后面配置客户端要用到。如果你用的是开源ngrok客户端这里的逻辑完全一致authtoken对应的是ngrok config add-authtoken这个命令里的那串token。这里有个小坑authtoken一旦泄露别人就能用你的身份建立隧道消耗你的流量甚至借用你的免费域名做违规内容。所以token不要提交进Git仓库也不要随手贴到群里。我习惯把token直接写进配置文件然后设置文件权限为600避免同机其他用户读取。2.2 创建隧道与参数说明Sunny-Ngrok需要先在Web后台创建一条“隧道”确定你要映射的协议、本地端口和域名。以我常用的HTTP隧道为例需要在后台填写隧道名称随便填方便自己识别协议类型HTTP或TCPHTTP用于网页和接口TCP用于SSH、数据库等通用TCP服务本地端口填服务在本机监听的端口比如Spring Boot项目是8080前端Vite开发服务器是5173域名类型免费用户一般选二级域名付费用户可以绑定自己的域名。创建完成后后台会分配给你一个访问地址形如xxx.sunnyos.cn。这个地址就是别人访问你本地服务的入口。这里建议先在本机启动一个简单的HTTP服务测试连通性比如Python的python -m http.server 8080或者python3然后再去配置Sunny-Ngrok避免后面排查时分不清是本地服务的问题还是隧道的问题。2.3 下载对应平台客户端Sunny-Ngrok官网提供Windows、macOS、Linux三个平台的客户端压缩包本质上是ngrok客户端的定制版解压后是一个可执行文件。Windows用户下载后得到一个sunny.exe或ngrok.exeLinux用户得到的是一个二进制文件。下载后建议把可执行文件放到一个固定目录比如/usr/local/bin方便在任意路径执行。Windows用户有一点要特别留意首次运行可能会被SmartScreen拦截提示“已保护你的电脑”。因为这类工具没有做代码签名。这时候需要点击“更多信息”然后“仍要运行”。不想每次弹窗可以在文件属性里勾选“解除锁定”。如果公司电脑是严格管控环境可能需要找IT加白名单。3. 实操本地服务通过Sunny-Ngrok暴露公网3.1 最简单的一次会话启动拿到客户端和authtoken之后最快验证的方式是命令行直接启动。Linux/macOS下进入客户端所在目录执行./sunny authtoken xxxxxxxx ./sunny tunnel http --hostname xxx.sunnyos.cn 8080或者直接用老版本风格的命令./sunny -authtokenxxxxxxxx -server_addrtunnel.sunnyos.cn:4443 -tunnel_http8080以上命令的作用是本地把8080端口暴露出去公网通过xxx.sunnyos.cn访问。执行后终端会打印隧道状态显示Forwarding字样后面跟一个公网地址。此时用手机4G网络不要连着同一个WiFi访问这个地址如果能看到本地服务内容说明隧道已经通了。为什么强调用4G测试因为你和本机在同一个局域网时访问公网地址可能会经过NAT回环部分路由器处理不好会误判为隧道失败。这种命令行方式适合临时测试缺点是不能后台运行关掉终端隧道就断了而且每次都要敲参数很烦。所以我更推荐下面这种配置文件方式。3.2 配置文件方式把参数固定下来在客户端同目录下创建sunny.yml或ngrok.yml取决于你的客户端版本内容大概是这样server_addr: tunnel.sunnyos.cn:4443 authtoken: xxxxxxxx tunnels: web: proto: http: 8080 hostname: xxx.sunnyos.cn ssh: proto: tcp: 22 remote_port: 6000然后启动时指定配置文件./sunny -config sunny.yml start web如果同时启动多个隧道./sunny -config sunny.yml start web ssh这种方式的好处是配置可复用项目换台电脑复制这个文件改一下token和域名就能用。多隧道场景尤其方便我经常同时开一个HTTP隧道给前端联调开一个TCP隧道给后端SSH调试数据库。注意TCP隧道映射的是你本机的SSH端口22公网访问时用远程服务器IP:6000这里的remote_port是Sunny-Ngrok服务器上的公网端口具体能不能自定义要看你购买的套餐免费版通常随机分配付费版才固定。配置文件里还可以设置更多高级参数比如HTTP代理模式、请求头修改、HTTPS重定向等。常用的几个web: proto: http: 8080 hostname: xxx.sunnyos.cn inspect: false auth: user:password其中inspect: false关闭了ngrok的请求查看面板auth为隧道增加HTTP Basic认证别人访问时得先输入用户名和密码这是一个很轻量但很有效的保护强烈建议公网测试时加上。3.3 后台运行与开机自启开发过程中隧道要长时间保持在线不应该一直占着一个终端窗口。Linux下用nohup或systemd都能实现。最简单的是nohup ./sunny -config sunny.yml start web sunny.log 21 然后通过tail -f sunny.log监控日志。这种方式重启服务器后要手动再跑一遍所以我后来改用systemd。在/etc/systemd/system/sunny.service中写[Unit] DescriptionSunny Ngrok Tunnel Afternetwork-online.target [Service] ExecStart/usr/local/bin/sunny -config /etc/sunny/sunny.yml start web Restartalways RestartSec10 Usernobody [Install] WantedBymulti-user.target执行systemctl enable --now sunny开启开机自启。这里要留意Usernobody可能导致客户端无法读取某些目录下的文件所以配置文件路径要确保服务用户有权限。如果日志报permission denied直接改成你自己的用户名就行内网穿透进程本身需要的权限很低不会引入太多安全风险。Windows用户想后台运行可以把客户端注册成Windows服务用nssm工具Non-Sucking Service Manager最省心。下载nssm后执行nssm install sunny nssm set sunny Application C:\sunny\sunny.exe nssm set sunny AppParameters -config C:\sunny\sunny.yml start web nssm start sunny这样关掉命令行窗口隧道依然在线。nssm的好处是崩溃后能自动重启服务日志也有落盘比塞个bat文件到启动目录严谨得多。4. 踩坑实录常见问题与排查技巧4.1 启动报错与身份验证失败启动时最常见的报错是Failed to authenticate to server或者Unauthorized。这通常说明authtoken错了或者过期了。回到Web后台重新复制token注意不要复制多余空格。第二种情况是Failed to resolve tunnel name说明你配置的域名已经在别处被占用或者你没有权限使用这个域名回到后台检查隧道是否创建成功、域名是否填写完全比如漏了.sunnyos.cn后缀。还有一类启动即崩的情况大概率是端口被占用了。本地8080被另一个进程占用隧道自然起不来。排查命令Linux/macOSlsof -i :8080查看占用进程Windowsnetstat -ano | findstr :8080再到任务管理器结束对应PID。另外如果配置文件里填写的server_addr不对客户端会一直卡在Establishing connection。Sunny-Ngrok的服务器地址和端口在后台“客户端下载”页面有明确标注照着复制别按老教程里默认的ngrok.xxx填。4.2 网页可以访问但接口请求异常这是高频问题。隧道通了浏览器打开页面正常显示但页面上AJAX请求全部返回502或504。我踩过一次原因是前端接口请求的地址是http://localhost:8080/api写死了。浏览器加载前端页面来自xxx.sunnyos.cn当你把页面发给别人时别人浏览器执行JS请求却发到对方的localhost自然失败。这个问题的解法和内网穿透本身无关就是把前端接口地址改成相对路径或者改成你穿透后的公网域名。另外一种情况是本地服务绑定的IP问题。如果你启动后端服务时绑定的是127.0.0.1只有本机可以访问sunny客户端转发数据到8080端口也会被拒绝。建议本地开发时把服务绑定到0.0.0.0比如Spring Boot配置server.address0.0.0.0Pythonapp.run(host0.0.0.0, port8080)。内网穿透只是管道管道另一端必须真的有服务在听。如果你遇到页面加载极慢图片半天出不来大概率是免费版带宽瓶颈试着把图片压缩一下或者切换一个负载低的服务器节点重新创建隧道。4.3 免费版限制与稳定性处理免费版Sunny-Ngrok主要限制在带宽和隧道数量通常只能同时创建一两条隧道速率在1Mbps左右。这个速度调试接口完全够做正式演示有点卡。还有一点容易忽视免费隧道域名有效期可能只有几天到期后域名被回收你本地配置文件里的域名就失效了。解决办法是定期回后台看域名状态或者直接升级付费套餐付费用户还能绑定自己的域名走HTTPS证书也要方便很多。稳定性方面进程长时间挂着连接可能会因为网络切换、路由器断电等原因断开。这时客户端未必会自动重连表现为网页打不开。我用的办法是守护进程定期探测Linux下写个简单脚本#!/bin/bash if ! pgrep -f sunny -config /dev/null; then /usr/local/bin/sunny -config /etc/sunny/sunny.yml start web /tmp/sunny.log 21 fi配合crontab每5分钟执行一次隧道断了能自动拉起来。Windows用户可以计划任务定时检查sunny进程是否存在不存在则启动。这种“土办法”很笨但实测比某些客户端自带的心跳重连靠谱。4.4 隧道安全加固与扩展玩法隧道一旦建立你的本地服务就是在公网裸奔。我见过不少开发者把调试面板、数据库端口直接映射出去结果被人扫描爆破。这里分享几个我后来一直遵守的安全习惯隧道启用HTTP Basic认证参数auth至少挡一批扫描器服务本身要带登录态和权限校验绝对不要把无鉴权的管理后台暴露只映射必要端口用TCP隧道时远程端口不要用常见端口可以设成60000以上的高位端口减少被扫描概率访问日志定期翻一翻发现异常IP大量请求立刻关隧道排查。除了常规Web调试Sunny-Ngrok还能搭配SSH做穿透这样我在外面也能连回家里电脑。配置方式前面提过用TCP隧道把本地22端口映射出去。这里有个安全细节SSH的密码认证很容易被暴力破解建议穿透前先在本地开启SSH密钥登录关闭密码认证。不然隧道地址一旦暴露在公网上你面对的将是脚本的疯狂扫描。还有一类玩法是在隧道后面套Cloudflare CDN起到隐藏源站的作用。不过这一步涉及DNS和CDN配置不是必须小白用户先学会基础穿透就够了。最后分享一个个人经验Sunny-Ngrok这类工具定位是“开发调试的辅助工具”不是“生产环境的长期方案”。项目真正上线还是老老实实用云服务器加对象存储加CDN稳定性和可控性完全不是一个级别。但如果是临时演示、异地联调、给客户看效果这种场景它是我目前用过配置门槛最低、最不折腾的方案。按照上面的步骤操作10分钟内就能把本地服务暴露到公网省下的时间和精力拿去改bug这才是它最大的价值。
返回列表