内网穿透小记

Posted on Feb 22, 2026

生命在于折腾。。。

一、前言:V2Ray中级技师的倔强

事情要从一台VPS说起。之前我买的是镇江的BGP NAT小鸡,结果突然被通报,老板紧急把用户迁移到江苏常州,换成了电信单线,配置加量不加价——独立IP,2C4G还带一块500GB的硬盘。这简直是为我量身定做的下载机啊!我立刻计划装上qBittorrent做种,再搞个Filebrowser管理文件,美滋滋。

但问题来了:国内宽带封死了80/443端口。我虽然有固定公网IP,但想在上面挂一个正经网站?没门。问了下服务商,备案流程要手工上传身份证照片、等审核、还得交钱。隐私劝退+嫌麻烦,作为一名V2Ray中级手艺人,我果断选择——自己动手,丰衣足食。

最初的妥协方案极其粗暴:在本地V2rayN加一条路由,对指定域名使用常州电信进行代理,同时在常州VPS内写死Host,把域名指向localhost。配合路由规则,直接用"域名+端口号"强访内网服务。结果呢?浏览器左上角永远挂着血红的"不安全",那个本该存在的绿色小锁头就像别人的女朋友——看得见摸不着。
(这什么奇怪的比喻啊我摔)
(虽然我没女票但我相信我能找到)

作为强迫症患者,这能忍?必须折腾一下。

二、架构设计:理想很丰满

  • 香港端(Portal):一台香港VPS,暴露443端口。前端用Caddy自动申请证书、处理TLS卸载,然后把流量分发给后端的V2Ray(挂起状态,等待对接)。
  • 常州端(Bridge):V2Ray主动发起出站连接,通过gRPC协议连上香港端的V2Ray,建立一条加密的反向隧道。内网的各种服务(qBittorrent、Filebrowser等)的流量全部走这条隧道"倒灌"回本地处理。

理论上,只要隧道建好,我在外面访问https://xxx.wanger.cc,就能直接操作常州的服务,全程加密,HTTPS小锁头闪闪发光。

三、踩坑记录:“单行道拥堵”

隧道建好后,起初一切正常,但没过两天,灵异事件出现了:

  • 我同时打开qBittorrent网页端和Filebrowser,必定有一个页面卡死
  • 仔细观察,卡死的页面里,CSS、JS等静态资源永远处于Pending状态,最后加载失败。
  • 但只要关掉其中一个,另一个立刻流畅运行。

找原因

问题出在我选择的传输协议上——gRPC基于HTTP/2

由于HTTP/2的长轮询请求长期占用资源,加上V2Ray默认的连接管理方式,导致其他请求无法获得并发处理,触发了类似队头阻塞的现象。简单说就是:qBittorrent网页端为了实时刷新下载速度,搞了个长轮询,像一辆半挂堵住了唯一的车道,Filebrowser的静态资源只能干瞪眼。

解决方案:多路复用(Mux)

在常州端连接香港的gRPC出站中,开启V2Ray的多路复用功能,把一条物理连接虚拟成多条逻辑通道。

"outbounds": [{
    "protocol": "vless",
    "settings": {},
    "streamSettings": {
        "network": "grpc",
        "mux": {
            "enabled": true,
            "concurrency": 8   // 同时允许8条逻辑流
        }
    }
}]

加了这行配置后,长轮询和静态资源互不干扰,并发问题瞬间消失。

四、深入思考:gRPC与WebSocket的性能差异

隧道稳定后,我把目前使用的BWH美西传输方式由WebSocket换成gRPC,发现一个有趣的现象:

  • 用gRPC传输时,单线程下载速度死活上不去,始终徘徊在130Mbps左右。
  • 换成WebSocket(无Mux),开多线程测速却能轻松跑到500Mbps。

为什么?

gRPC(HTTP/2):强依赖单条TCP连接。在跨国线路上,一旦某个数据包丢失,TCP的拥塞控制会让整条连接停下来等待重传,造成"一损俱损"。优点是非常节省资源,适合低频请求(比如网页浏览、挂机做种)。

WebSocket(原生TCP):多线程测速时会同时建立几十条独立的TCP连接。即使部分连接丢包,其他连接依然能跑满带宽,最大程度压榨物理线路。但代价是TCP握手开销巨大,且每条连接都需要独立维护,对系统资源不友好。

五、架构的终极哲学:为什么放弃固定IP直连

写到这里,可能有人会问:“你不是有固定公网IP吗?直接在常州服务器上开一个高位端口(比如54321),跑VMess正向代理,不就不用折腾内网穿透了吗?”

这个问题问得好。如果只是为了通,确实可以这么干。但这里有个隐蔽性问题:Vmess固然能通,但是不隐蔽

在伟大的墙看来,这是一条和随机加密数据流。又有同学要问,那为什么不搞Vmess+TLS?

TLS本身只是个加密层,可以承载任何TCP协议。但伟大的墙的探测手段不仅仅是看端口,它会尝试与你的TLS服务器进行应用层交互——比如发一个HTTP GET请求。如果服务器返回的不是标准网页,而是一堆乱码或协议报错,就会被判定为"可疑",轻则打标签,重则封IP。 (当然这只是我的推测,对于伟大的墙我们仍旧一无所知)

为了应对探测,我必须在那个高位端口上挂一个真实的HTTP网站做伪装。但问题又绕回来了:国内建站要备案啊!不备案就不能起HTTP服务,没有网页做伪装,TLS就显得很突兀。

所以,用香港VPS做中转的思路就通了:

  1. 常州端主动连接香港的443端口,在伟大的墙眼里就是普通网民访问海外网站
  2. 香港端有Caddy挂着真实网页,任何探测都会被优雅地挡回去
  3. 真实的业务流量(qBittorrent、Filebrowser)封装在TLS隧道里,内外浑然一体

(其实朋友说国内机只要你不用80和443就问题不大,但HTTP不跑在标准端口上本身就很奇怪,而且目前大有抓HTTP未备案越来越严厉,通报越来越狠的趋势,还是稳一点好。)

六、总结:折腾的意义

罗老师说法无禁止即许可。在各种一刀切甚嚣尘上的今天,我们无力改变现状。君不见国内某机房已经开始清退对等流量,凡是同账号下上传量=下载量的一律清退。甚至默认封一切海外流量,想解封要写保证书和申请才行。

在这样的时代,折腾就是为了获得那一点点的自由,一点点喘息的机会,一丝丝的生机。


(当然了,除了V2Ray,内网穿透其实有很多种实现方法,比如Tailscale、Cloudflare Tunnel这些,但V2Ray组gRPC隧道+TLS的特征应该是最不明显的,而且作为V2Ray中级选手,那必须得用V啊。&& 谨以此文 致敬V2Ray作者 Victoria Raymond 虽然您已神隐,但您的作品将在社区维护的氛围下继续发光)