用花生壳做内网穿透,花生把本地 8080 端口的壳穿 Web 服务映射出去,结果浏览器一打开就报错——这事我遇到过不止一次。支持花生壳的问方免费版和部分付费版,压根就不支持 HTTP 以外的花生 Web 访问方式,或者说,壳穿它对 Web 流量的支持处理方式跟你想象的不一样。
先搞清楚一个基本事实:花生壳本质上是问方一个 TCP/UDP 隧道工具,它帮你把内网机器的花生某个端口映射到公网域名上。但“映射”不等于“代理”。壳穿很多人以为映射完就能像访问普通网站一样打开,支持实际上花生壳对 80/443 端口的问方 Web 请求做了额外限制。免费版直接屏蔽 80 端口,花生你只能走非标准端口,壳穿比如 8080、支持8443。就算你用了非标准端口,花生壳的转发通道也可能对 HTTP 头部做手脚,导致页面加载一半、CSS 丢失、接口跨域报错。
我拿自己的一台树莓派做过测试。本地跑了一个 Flask 应用,监听 0.0.0.0:5000。花生壳客户端里添加映射,内网主机填 127.0.0.1,内网端口 5000,外网域名用花生壳送的 xxx.vicp.net,外网端口随机分配了一个 12345。映射状态显示“在线”,用 curl 访问 http://xxx.vicp.net:12345,返回的是花生壳的拦截页面,不是我的 Flask 首页。
换到 3389 端口做远程桌面,完全正常。换到 SSH 的 22 端口,也正常。唯独 HTTP 流量被识别并拦截。花生壳的文档里写得很含糊,只说“部分端口不支持 Web 访问”,实际测试下来,只要你的流量里带有明显的 HTTP 特征——比如 GET / HTTP/1.1 这样的请求行——就会被阻断或重定向。
另一个坑是 HTTPS。你本地用自签名证书跑 443,花生壳转发过去,浏览器会报证书错误。这不是花生壳的问题,但叠加起来就是“Web 访问不可用”的体验。花生壳自己的 HTTPS 证书只用于它自己的管理页面,不会给你的内网服务用。
如果你非要用花生壳跑 Web,有几个绕法。第一,把 Web 服务伪装成非 HTTP 流量。比如用 WebSocket 或者 gRPC,花生壳对这类长连接的拦截没那么严。我试过把 REST API 改成 gRPC-Web,通过花生壳转发,居然能通。第二,用花生壳的“自定义端口”映射到本地一个反向代理(比如 Nginx),让 Nginx 去处理 HTTP,花生壳只负责 TCP 转发。但这个方法不稳定,花生壳偶尔会重置连接。
更实际的做法是换工具。frp、ngrok、Cloudflare Tunnel 对 Web 访问的支持都好得多。frp 需要自己有公网服务器,但配置一次就一劳永逸。Cloudflare Tunnel 免费,直接给你一个 HTTPS 域名,连证书都不用管。我现在的做法是:花生壳只用来做 SSH 和远程桌面,Web 服务一律走 Cloudflare Tunnel。分工明确,谁也不耽误谁。
花生壳不是不能用,而是你要清楚它的边界。它适合做简单的 TCP 端口转发,不适合直接暴露 Web 服务。如果你看到“花生壳穿透不支持 web 访问方式”这个报错,别怀疑自己的配置,那是产品设计上的限制。换条路走,比死磕一个不支持的场景要省时间得多。