1 前言
自从购买了Racknerd的VPS,并完成了将容灾节点从腾讯云轻量服务器搬家到Racknerd芝加哥VPS的大工程之后(参见文章:家庭数据中心系列 博客架构的第二次重构:VPS搬家引发的服务迁移与双活容灾实践,数据中心搬家可不就是大工程),我还在思考如何能够充分利用这高价购买(39.88美金/年)的芝加哥节点(Racknerd_高配1_882),毕竟现在芝加哥节点的资源还大量闲置着:

转念一想,其实除了硬件资源,芝加哥节点每月流量高达8500G,而我现在主要是将它作为平时核心应用(博客)对Cloudflare的主回源站,这种用法根本用不了多少流量,等于说这么多月流量完全浪费了。
既然想充分利用流量,那自建科学节点就是首当其冲的用法了。可是因为我之前并没有境外的VPS,对这方面的知识也不怎么了解,所以,需要先梳理一下相关的知识点。
2 背景知识:现实网络环境下的访问困境
在当今的网络环境中,连接并不总是”通的”:某些网站明明在线,页面却打不开;一些软件默认配置正确,却无法正常使用;一些域名无法通过公共 DNS 正确解析;浏览器内置的加密 DNS(如 DoH 或 DoQ)无法正常启用……诸如此类的问题时有发生,原因常常不是服务端的故障,而是通信路径中存在一堵透明的”wall”。
在某些区域的网络中,出于内容合规、信息监管、数据审计等目的,运营商会对目标指向境外的通信数据进行智能识别与策略拦截。这类行为背后依赖的是一整套被称为深度包检测(Deep Packet Inspection, DPI)的机制,它并不需要解密内容本身,而是通过分析加密协议的握手元数据(如 TLS 的 SNI、JA3 指纹,QUIC 的初始数据包结构等),来对流量进行特征化识别,再基于匹配结果动态决定是否放行,这些干预行为都来自透明的”wall”。
值得注意的是,这类干预并不针对某一个具体协议、服务或应用,而是建立在”通信行为模式”的识别与封锁之上。这种策略天然带有不确定性,常常因出口链路不同、路径节点策略更新、服务部署方式变化而出现”时通时断”、”部分服务异常”的情况。于是,我们所面对的,不再是一个稳定的网络传输模型,而是一个充满变量的、动态博弈的现实环境。
举个简单的例子:你在浏览器中启用了”安全 DNS”功能(如 Cloudflare 或 Google 的 DoH),本意是提升解析隐私性和完整性,却可能在 TLS 握手阶段就被网络中间节点重置连接,导致”域名无法解析”甚至”网页无法打开”;又如,一些用户访问开发者社区网站(如 GitHub、Docker Hub、Stack Overflow 等)时,会遇到偶发的连接异常,这种现象既不容易排查,也缺乏规律可循。
对普通用户而言,这可能只是”偶尔打不开某个网站”——他们可以选择换个内容、避开问题;但对于技术用户、跨境办公者、自建服务的开发者来说,这背后带来的挑战是更深层次的:连接的不可预期性与通信的结构性不确定性。在这种背景下,如果仍然使用传统的”直接访问”模式来进行通信,那么,需要与境外服务器通信的朋友会变得举步维艰。
如何解决呢?最常见的方式,就是借助科学上网,通过构建一条绕开干预路径的”通信隧道”,从而避免访问境外内容时被透明的”wall”干扰。
目前,科学上网的方式大致可以分为两类:
第一类,是使用第三方提供的付费服务。
这类服务的特点是 “开箱即用” :用户只需购买账号、订阅配置,即可一键连接境外节点,无需关心底层协议、回源机制或流量分流等技术细节。它几乎是最省事的方案,门槛低、体验直观,深受新手用户欢迎。但与此同时,这种方案也存在一定的隐患:
- 一些廉价服务提供者的”跑路”现象屡见不鲜,用户资产和数据安全无法保障;
- 只是”跑路”还好,如果遇到官方主导的”钓鱼”类提供商,嘿嘿;
- 某些高端服务虽稳定但价格昂贵,长期使用成本较高;
第二类,则是自行搭建科学上网节点。
这种方式的核心在于:你拥有一个可控的境外 VPS,自己部署服务端程序(如 sing-box、xray、trojan-go 等),并自行管理连接协议与策略,这条路径的优势是明显的:
- 可自由选择协议类型、加密方式和传输路径,规避主流服务的流量特征;
- 可以按需部署多个节点、集成中转、接入 tunnel/CDN 等手段,实现更高的抗封锁性与灵活性;
- 成本上更具可控性:一般的VPS自带的月流量足够满足多人使用
但它的劣势同样明显:
- 需要有基础的网络知识,了解 VPS 管理、域名解析、证书申请等相关操作;
- 需要自行应对透明”wall”的策略更新,动态调整部署方式、协议配置与节点架构;
- 还需应对偶发的 IP 封锁、证书吊销、域名污染等问题,具备一定的故障排查能力。
因此,自建科学服务节点与使用第三方提供科学服务之间的选择,往往取决于用户对稳定性、安全性、成本与控制力的权衡。而本文的重点,也正是在于帮助有一定动手能力、希望构建更可靠通信环境的用户,理解并掌握”自建科学节点”的核心原则与演进方式。
本文不涉及”使用第三方提供科学服务”方面的内容,只谈谈为了学习和工作需要如何利用已有的境外VPS自建科学服务节点。总的来说,自行搭建科学上网节点有两大类选择:直连和非直连,这两种选择各有优劣势。
3 直连模式:源站直接暴露的科学方案
3.1 穿越透明的”wall”:直连模式的天然难题
在科学访问的场景中,所谓”直连模式”,并不是指用户直接访问目标网站,而是指用户通过一条自己建立的、与自己可控可信的境外 VPS 之间的通信链路,将后续的访问请求转交给境外 VPS,由它代为转发。这实际上可以拆解为两个关键阶段:
- 连接阶段:从本地设备直连境外 VPS,建立一条穿越透明的”wall”的通信通道;
- 转发阶段:把对目标网站、服务的访问请求发给境外 VPS,由它代为发出请求并将响应内容返回。
第二阶段容易实现,但是作为关键的第一阶段”连接阶段”却很困难:如何顺利”穿过”透明的”wall”?
3.2 连接阶段:能不能连上 VPS?
在国内网络环境下,客户端要想直接连接境外 VPS(通常是某个云服务上的公网 IP),必须经历一段”不可预测”的出境路径。在这个路径上,存在一种无形的机制,会对跨境流量进行实时筛查、判断和处理:你要连的服务是什么?协议看起来像不像 HTTPS?是不是最近在”滥用”这段链路?是否触发了既定规则?
这一机制表面无形,实则运行在骨干出口路由、运营商边缘网关等关键节点上,依赖的手段主要包括:
- 深度包检测(DPI):在 TLS 握手阶段分析 SNI 字段、JA3 指纹、ALPN 协议标志等,识别服务端类型与通信意图;
- 行为模式匹配:针对非标准协议(如伪装 HTTPS 的代理、QUIC 或 DoH)的行为建立特征库,进行投射性阻断;
- 路径压力监测:如果某段出口频繁出现非浏览器式连接请求,也可能被动态限速、重置连接、直接丢包。
这意味着:哪怕你把 VPS 的服务监听在 443 端口,使用 TLS 协议包裹通信内容,也不等于一定可以顺利连上;即便连上,也不等于一定稳定。
协议与端口:影响直连通行率的”形态特征”
在面对中间设备的策略识别时,通信协议的类型和使用的端口组合会直接影响数据包是否顺利穿越。透明的”wall”不会明说”封了谁”,但会在行为上对某些特征更敏感、更容易干扰。以下是目前网络环境中较常见的”放行优先级”:
- TCP 443 端口(HTTPS)
这是现代加密通信的主流端口,浏览器访问、系统更新、移动应用后台等大量流量都走这条路径。出于避免误伤合规通信的考虑,策略系统往往对 443 上的流量更为克制,具备最高”放行优先级”。因此,许多科学协议会主动”借壳”使用 443 端口来提高伪装性。 - TCP 80 端口(HTTP)
明文协议,但依然被广泛用于各类低安全要求的服务。尽管加密程度低,但由于使用普遍,也具备一定的”放行基础”。不过因为是明文,容易被完全解析,适合做混淆而不适合承载敏感流量本身。 - UDP 协议整体处于”高敏感区”
与 TCP 不同,UDP 是无连接、无状态的,天生更适合高速传输和即时通信,但也更容易被滥用。策略系统对 UDP 的默认策略通常更为激进,常见表现为:- QUIC(HTTP/3):明确基于 UDP,访问 Google、YouTube 等服务时常被用于提升性能。但也因其行为特征明显、启用初始握手明显,常常遭遇连接失败或降级回 TCP。
- WireGuard / OpenVPN(UDP 模式):早期是自建科学节点的主力,但这些协议握手固定、特征明显、指纹独特,已被 DPI 系统广泛掌握,导致容易被秒断、延迟高、稳定性差。
- Hysteria / TUIC 等新兴高性能隧道协议:虽然在 UDP 上传输,但设计上更强调防识别、防阻断能力,在一定程度上更具”抗扰动”属性,但仍需看实际部署方式与路径条件。
- “混合协议”或”TCP 协议模拟 UDP”
一些工具(如 Trojan-Go)虽然主要基于 TCP,但可以选配启用 UDP 转发功能。这种模式在策略判断上表现不一:未启用时相对安全,启用后则可能触发更多干扰。 - DoH(DNS over HTTPS)
实际是 DNS 查询通过 HTTPS 封装后的变体,走 TCP 443 端口。但因为其”非典型 HTTPS”行为(如极短的握手和小包交换),在部分路径上仍可能被判定为异常通信而被阻断。
因此,不能只看协议名或工具名称,还要关注其运行模式、使用端口、是否走 UDP、是否有典型握手特征等多个维度。真正影响穿越成功率的,不是”用什么协议”,而是你的协议行为是否”足够正常”、是否被透明的”wall”当作”应该放行的流量”。
3.3 常规流量伪装方案也未必把稳
为了通过第一阶段,市面上出现了很多”协议伪装”型方案,它们的核心思想是:让你的流量看起来就像是个普通人打开了一个网页(http + tls)。以下是不同协议的伪装方案对比:
| 协议 | 伪装能力 | 是否易被识别 | 更新活跃度 | 实际安全性 |
|---|---|---|---|---|
| Trojan | 依赖 TLS+HTTP 伪装 | 高(指纹明确) | 极低 | 中低 |
| VLESS | HTTP/WS 伪装 | 中高 | 高(sing-box 活跃) | 中 |
| Shadowsocks | 无伪装 | 极高 | 停止维护 | 低 |
| VMess | XTLS/WS | 中高 | 停止维护 | 中低 |
| Hysteria | QUIC 混淆 | 中 | 中高 | 中 |
这些方案在刚出现时确实能带来一些突破,但后续的缺点也很现实:
- 流量特征稳定,协议 fingerprint 被逐渐摸透,尤其如 Trojan 等协议,已有多年未更新,特征鲜明;
- DNS 污染、TLS Reset、主动探测(如探测回包行为)等干扰手段频繁命中;
- 即便开启 TLS,SNI(Server Name Indication)仍为明文,可被利用;
- 伪装策略多数依赖 HTTP Host Header 或流量 padding,在复杂 DPI 面前越来越脆弱。
- 源站 IP和服务端口长期暴露,易被探测与封禁;
3.4 别误会,连上 VPS ≠ 科学上网成功
需要强调的是,连上了境外 VPS,仅仅是科学访问的起点。科学上网的核心在于:能否通过 VPS 顺利访问境外被限制的资源,并把响应安全地带回本地。
而这一过程也同样受到各种干扰:
- VPS本身访问外网资源的路径是否可靠?比如访问 Google、YouTube、GitHub 时是否也被限制?
- 数据包是否因”流量特征异常”而在中途遭遇 reset?比如,明明只是打开一个普通网页,但页面加载过程中连接突然传回大量数据、长时间占用带宽,这种”行为与期望不符”的情况,可能会被识别系统视为”可疑通信”,进而通过发送 RST 来强行终止连接。
- 整体链路是否具备足够的稳定性和隐蔽性?比如,有些朋友配置了基于 Hysteria 或 WireGuard 的节点,测速时表现极佳,但一到实际使用时却频繁断流,甚至连接直接被重置。这往往不是 VPS 本身的问题,而是链路在穿越某些关键路由段时被检测出异常,遭到策略性干扰——例如握手特征异常、数据包突变、流量行为”不够自然”等,都会成为触发点。
这就是直连模式的天然限制:它太依赖”直接通信”,也太容易暴露目标。
注1:通常使用”直连”方式来搭建科学服务,一个潜在的要求就是直接访问 VPS 时的延迟。因此,节点的物理位置选择变得尤为重要——你不仅要考虑带宽、价格和地区,更需要考虑从你所在地出发的链路质量。否则,即使搭好了节点,客户端也会因为高延迟或丢包严重而得不到良好的使用体验。此外,”直连”方案也意味着服务端真实 IP 会直接暴露在公网之中,如果这个 IP 所属网络的抗干扰能力较差、运营商较小众、或行为模式过于”明显”,也很容易被精准识别并遭遇封锁,所以通常要求服务端VPS采用”精品线路”。这正是很多人开始考虑”非直连”方案的根源之一:不是直连不好,而是”直接暴露”在今天的环境下不够稳定、不够持久。
注2:尽管”直连 + TLS”本身已经具备一定的加密性,但这在当前的检测环境下往往还不够。所以,我们可以借助 Nginx、Caddy、HAProxy 等支持反向代理的中间层,在 VPS 上再”包一层正常 Web 流量的壳”,比如同时运行一个博客、CDN 缓存站,或返回一个静态网页响应,以此混淆流量特征,提高”看起来像正常 HTTPS 网站”的程度。这类”多层伪装”虽然不能完全避免识别,但能显著增加被动干扰时的容错性和稳定性。
注3:当然,不是说“直连”模式就不能用,毕竟目前采用“直连”模式自建科学节点的用户仍占了相当的比例。很多人依赖其配置简单、延迟低的特点,尤其是在早期节点不受限制或特定地区仍有较好效果的情况下,它依然是许多人的首选方案。但从趋势上来看,这种模式面临的困难会越来越大:一方面,运营商和平台对加密流量的识别与干扰手段在持续进化,简单的直连方式更容易被探测、限速甚至封禁;另一方面,越来越多的服务需要在抗审查性、稳定性和隐蔽性之间寻求更平衡的方案,这就意味着采用更复杂的架构,比如中转、隧道封装、异地分流等方式,将逐渐成为主流。
4 非直连模式:借助中转入口隐藏源站 IP
4.1 为什么需要”非直连”?
在”科学上网”的早期阶段,直连模式是一种看似简单直接的方式:只要将客户端连接到境外 VPS,通过一条受控通道转发请求,就能访问外部互联网。然而,这条”看似打通”的路径,实际上极为脆弱:一旦境外 VPS 的 IP 地址暴露在国内网络中,它就可能成为 DPI(深度包检测)系统、行为识别模型、关键字监听系统的重点关注对象。一旦被标记,连接会出现如下问题:
- 流量被限速、注入干扰、甚至直接 reset;
- VPS IP 被加入阻断名单,连接完全中断;
- 跨境通信”阶段性死亡”,但无明确错误信息,难以定位问题来源。
问题的核心:透明的”wall”并非针对某一个服务或站点,而是试图识别”异常的连接行为”。而当一个境外 VPS 被数十个客户端以相同方式访问,流量特征固定、访问频率异常时,这个 VPS 的”身份”就不再是一个普通 Web 服务器,而是一个可疑通信中转点。
在这种背景下,继续坚持”直连”的策略,就意味着:
- 不断更换 VPS;
- 随时应对连接不稳定;
- 每一位用户都要承担连接失败、流量被封的高风险。
而更根本的问题在于:如果用户的请求每次都直接指向目标服务的真实地址,那么服务端”藏不住”,识别系统永远有发挥空间。
4.2 “非直连”实现的关键:中转入口
事实上,非直连模式真正的意义,是让”源站”IP不再暴露在公网之下,这就需要配合中转入口使用。真正意义上的”非直连”方案,应该是这样一条链路:国内客户端──连接──> 中转入口 ──转发──> 真实 VPS / 源站服务。这种设计下,对于透明的”wall”而言,看到的永远是国内客户端在访问中转入口,至于对中转入口背后的源站,那是一无所知的。
如何寻找”中转入口”?
要能在今天的网络环境中作为一个”中转入口”,不是随便找台机器就能胜任的,它必须满足以下几个关键条件:
- IP 不会轻易被封杀:最好是大厂出身的 IP,具备”可信背景”,不会因为一点”非典型流量”就立刻遭到封锁
- 具备一定中立性:比如 CDN、分布式网络平台,墙对它们天然更”温和”,不会轻易出手
- 支持自定义流量转发:比如能建立反向隧道、WebSocket 转发、或者直接 TCP/QUIC 转发的能力
这些条件组合在一起,实际上已经排除了绝大多数个人服务器或便宜的商用 VPS :你要的不是”谁都能部署”的跳板,而是一个不会轻易出问题的”伪装点”。
现实中,中转入口的优选对象:Cloudflare,因为它恰好具备上述所有特质,这使得其本身成为一个极具潜力的中转入口:
- IP 稳定且信誉极高:其网络节点广泛服务全球百万网站,是现代 Web 世界的”基础设施”;
- 天然 CDN 平台:墙对 CDN 的策略处理更为克制,往往优先保障”可用性”;
- 支持灵活的反向代理逻辑:通过自家的入口网络,把公网流量中继回你的真实服务。
4.3 前置知识:Cloudflare反向代理功能的实现方式
当利用 Cloudflare 来构建”非直连”的中转入口时,真正发挥作用的,并不是它作为 CDN 的传统功能,而是它覆盖全球的边缘网络以及高度灵活的反向代理能力,所以需要先了解其提供的”反代”方式。
从整体机制上看,Cloudflare 提供了两种典型的”反代”方式:
- 公网回源(Public IP 回源)
在这种模式下,Cloudflare 作为边缘代理,仅仅转发来自客户端的请求,然后通过 DNS 指向你配置的 公网服务器 IP,回源取回内容。虽然部署简单,但也暴露了一个致命问题:你的真实服务器 IP 必须是公网可见的,而这恰恰是”非直连”想要规避的点。
- Cloudflare Tunnel(内网穿透式反代)
这是我们重点关注的方式:Tunnel 由你自己在服务端启动,主动向 Cloudflare 发起连接,创建出一个反向通道,让 Cloudflare 能够将用户请求安全地转发到内网/非公网 IP 的服务上。整个过程中,无需暴露源站 IP,也不需要开放任何公网端口。
从隐蔽性、安全性和可生存性来看,Tunnel 模式显然更符合”非直连”的设计目标:
- 源站 IP 永远不会暴露在 DNS、扫描器或直连测试中;
- 整个链路由内而外建立,避开传统连接方式所面临的干扰和封锁;
- 即便服务部署在家宽、NAT 内网甚至 IPv6-only 环境下,也能轻松连通。
因此,在当前复杂网络环境下,Cloudflare Tunnel 已经成为”非直连”模式的主流实现方式之一,尤其适合搭配自建代理服务共同使用。
4.4 “非直连”的代价与限制
在上一节中我们提到:Cloudflare Tunnel 已经成为”非直连”模式的主流实现方式之一,它隐藏了真实源站的 IP,只暴露 Cloudflare 的边缘节点,让很多自建方案在今天的环境中得以继续存活。
但遗憾的是,如果你想将现有的代理服务”无缝接入” Cloudflare Tunnel,会发现并非所有协议都能用——Tunnel 并不等于”万能反代”,它支持的只是极少数能够”顺利伪装”的协议栈。 这是因为Cloudflare Tunnel 的设计初衷是服务于 Web 应用,它默认期望你提供的是一个标准的 HTTP 或 HTTPS 服务,同时也在防着你乱用。这也就意味着:只有那些本身就”长得像 HTTP 服务”的代理协议,才有可能被 Tunnel 顺利接入并成功传输。 典型代表是 Trojan 和 VLESS ——它们本身就强调通过 TLS、WebSocket 等方式”伪装为浏览器访问”,而这刚好符合 Cloudflare 的流量策略。
因此,如果你要将代理协议通过 Tunnel 进行中转,推荐的组合是:
| 协议 | 是否兼容 Cloudflare Tunnel | 推荐搭配方式 |
|---|---|---|
| Trojan | 是 | TLS + WebSocket |
| VLESS | 是 | TLS + WebSocket(或 gRPC) |
| VMess | 否 | 需配合 WebSocket 且稳定性差 |
| Shadowsocks | 否 | 本质上不是 HTTP 请求,除非通过额外封装 |
| WireGuard / OpenVPN | 否 | 完全无法配合,需要额外中转 |
| Hysteria / TUIC 等 QUIC 协议 | 否 | 不支持非 Web 传输,不建议尝试 |
WebSocket 是什么?为什么我们需要它?
WebSocket 是一种运行在 HTTP 协议之上的”持久连接”机制,它的设计初衷是为了在 Web 页面和服务器之间建立一个可以双向实时通信的管道,它的魔力在于:
- 初始握手阶段看起来就是一个标准的 HTTPS 请求(这点对”伪装”至关重要);
-
成功建立连接后,可以在这个看似普通的”网页通道”里,传输任意类型的数据——包括我们要走的代理流量。
对于 Cloudflare Tunnel 而言,它默认期望代理的是网站请求,所以若想”偷偷”塞进其他非标准流量,就必须先把这些代理协议封装进 WebSocket,才能伪装成合规流量绕过检测。 这也是为什么 Trojan、VLESS 等协议往往推荐搭配 WebSocket:不仅能伪装得更像网站访问,还能穿过 Cloudflare Tunnel 的”Web 审查”。
4.5 “非直连”科学节点速度是否一定比”直连”科学节点慢?
这是很多自建用户心中的疑问,甚至是误区。直觉上,“非直连”方案在链路上绕了一道弯,必然导致性能下降。但事实是,这个判断在当下的网络环境中并不成立,甚至很多时候恰恰相反——“非直连”反而更快、更稳。 原因主要有以下几点:
1、直连≠畅通,很多时候是”被识别后不断阻断”
“直连”科学节点最大的问题,不在于带宽,而在于流量是否被完整、稳定地送达目标 VPS。现实中,很多所谓的”直连”连接并不是真正意义上的”畅通”:
- 数据包被中途丢弃(Drop)或主动重置(RST);
- 连接建立后能通信,但速度极慢、不稳定;
- 某些时间段突然无法连接,之后又神奇恢复。
这类现象并不罕见,背后反映的其实是链路并不可信。所以很多”直连”的速度慢,根本原因不是走了直通路线,而是这条路线根本不欢迎你。
2、“非直连”通过中转规避了流量识别,提高了整体链路质量
相比之下,”非直连”通过中转入口隐藏了真实源站,让链路前半段的流量看起来像是访问一个常规服务(比如 Cloudflare 节点、知名云厂商 IP、CDN 分发中心等),从而在接入侧获得了 更高的链路容错率与稳定性。
而且,中转入口与源站之间一般走的是标准国际线路,且不受中间干预,这段链路质量往往比”直连穿墙”要高得多。
3、延迟与吞吐并非只有”路径短”这一影响因子
很多人误以为”路径越短,延迟越低”,但在当下网络环境中:
- 路径是否被限速、干扰、压制
- 源站所在机房的出口质量
- 中转服务器的吞吐瓶颈
- 协议的连接恢复/重传效率
这些因素往往比路径长度更关键。比如一个”直连”VPS位于亚洲小机房,但出口糟糕、TCP handshake 频繁失败;而一个”非直连”VPS虽然绕路走了 Cloudflare Tunnel,但出口是 GCP、Azure 等优质大厂线路,反而稳定、快速得多。
4、“非直连”还可以轻松构建多点中转、负载均衡、故障转移等机制
这是”直连”模式难以实现的:一旦节点被识别、封锁,整个方案失效。而”非直连”由于天然具备灵活的入口配置和协议伪装能力,非常适合构建多链路并行、动态切换等更具工程弹性的架构。
结论:“非直连”不是”退而求其次”,而是在现代网络环境下更具隐蔽性、抗干扰性和扩展性的现实选择。其表现是否比”直连”慢,并不取决于”走没走直线”,而取决于链路整体的安全性、隐蔽性与调度能力。
4.6 Cloudflare Tunnel 与科学用途的合规性问题
虽然 Cloudflare Tunnel 几乎天生就是”非直连”模式的理想工具 —— 它稳定、全球分布广泛、不需要暴露公网 IP,还能无缝配合 VLESS/Trojan 等协议完成 TLS + WebSocket 的完整伪装链路 —— 但这里必须郑重提醒一点:Cloudflare 明确禁止将其服务用于代理、VPN、科学上网等用途。
Cloudflare的服务条款(https://www.cloudflare.com/terms/)中有多处提及禁止将其基础设施用于”绕过访问控制””未授权访问””违反当地法律或服务提供方政策”等行为。而在其社区、工单回复及实际封号案例中,也多次明确指出:
- 不允许通过 Cloudflare Tunnel 建立代理、VPN 或流量转发服务;
- 若发现有大量非典型流量或 Proxy 行为,可能会自动触发流控、封禁子域名甚至停用账号;
- 特别强调了对”与公众网络无关”的流量(如内网代理、翻墙用途)的高敏感度。
这就意味着,尽管技术上可行,实际上并不合规:能用,不等于该用。在目前环境下,Cloudflare Tunnel 确实是少数能稳定用于”非直连”科学链路的通道之一,但从服务协议和实际风险来看,它更适合作为开发、演示、远程管理等”合理用途”的隧道服务。
如果你执意将其用于科学服务:
- 建议仅限个人低频使用;
- 尽可能设置访问控制、隐藏路径,并规避大流量行为;
- 最重要的是,不要对外公开、传播使用方式或服务地址,避免波及整个 Tunnel 生态。
毕竟,Cloudflare 并不是来帮你”科学”的,它的目标是为 Web 应用提供安全、合规的加速和防护服务。
5 基于sing-box的科学节点搭建
5.1 sing-box介绍
其实,除了前面讲的一堆理论内容,我原本并不打算详细讲具体工具的使用。一方面是这类内容总归有些敏感,另一方面,工具和协议的选择本身也并没有绝对的”最优解”——更重要的是理解背后的原理和结构。不过,为了让这篇文章的结构更加完整,也为了帮助一些刚入门的朋友能更好地把前面讲的内容”落地”,我还是简单讲一下工具的配置示范。
目前比较主流的选择包括 Xray、Hysteria、NaïveProxy、tuic 等工具,每个都有各自的特色和使用场景。但考虑到稳定性、灵活性和更新活跃度,我最终还是选用了sing-box作为示例。
与传统的”一个协议跑到底”的思路不同,sing-box 更像是一个高度模块化的代理框架。它的定位非常清晰:融合多个代理协议,提供极强的可配置性,并为高级用户提供构建复杂科学场景的能力。
在协议支持上,sing-box 是目前少数同时具备广泛传入与传出协议支持的代理工具。它可以作为客户端运行,也可以作为远端服务端,甚至能用于构建分层的多级转发结构(比如”DNS 分流 + TLS 转发 + 多出口出站”)。常见的代理协议如 VLESS、Trojan、Shadowsocks、Hysteria2、Tuic、SOCKS、WireGuard 等都被完整支持,而出站协议甚至还包括 VMess(兼容模式)、HTTP、DNS 分流等,几乎囊括了所有主流需求。
除了协议本身,sing-box 对传输层的支持也很全面。它原生支持 TLS、Reality、WebSocket、gRPC、QUIC、XTLS 等传输机制,用户可以根据实际需求灵活组合,实现既隐蔽又稳定的流量伪装。
配置方面,sing-box 的优势在于”清晰而强大”。虽然没有像一些 GUI 客户端那样”一键配置”,但 JSON 配置文件结构明确,官方文档完善,支持注释,逻辑也高度自洽。它不像 Xray 那样将很多行为隐藏在”不说你就猜不到”的默认逻辑里,而是鼓励你显式地定义每一个行为细节。一旦理解了核心架构,就能写出完全可控、行为透明的配置文件。不仅如此,它还自带命令行调试工具,可以用于检查路由匹配、测试连接、分析链路,这对排障非常关键。
值得一提的是,在新协议的支持方面,sing-box 也明显领先于其它工具。例如,它是最早支持 Reality 的代理项目之一,这是一种不依赖证书、模拟真实 TLS 流量的新机制,极大提升了隐蔽性;又比如 Hysteria 2 和 Tuic 2,这些基于 QUIC 的抗干扰协议,也都在 sing-box 中得到了第一时间的支持。此外,它还内置混淆(obfuscation)插件系统,允许用户自定义混淆规则,进一步提升抗干扰能力。
总的来说,如果你希望自己可以完全掌控节点行为,灵活定义每一个出入站流量、精细控制伪装方式与协议细节,那么 sing-box 是目前最值得深入学习和使用的核心工具之一:它并不是为了”简化科学上网”而生,而是为了在复杂环境中依旧保持自由而生的。
5.2 安装sing-box
5.2.1 APT方式安装
mkdir -p /etc/apt/keyrings
curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc
chmod a+r /etc/apt/keyrings/sagernet.asc
echo '
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
' | tee /etc/apt/sources.list.d/sagernet.sources
apt-get update
apt-get install sing-box
检查版本及功能:
sing-box version

注:使用默认apt方式安装的只是最新release的正式版。
5.2.2 直接下载官方构建版本
除了apt方式,也可以直接使用官方构建的版本,还是以v1.11.10版本为例:
wget https://github.com/SagerNet/sing-box/releases/download/v1.11.10/sing-box-1.11.10-linux-amd64.tar.gz
tar -xzf sing-box-1.11.10-linux-amd64.tar.gz
cp sing-box-1.11.10-linux-amd64/sing-box /usr/local/bin
chmod +x /usr/local/bin/sing-box
5.2.3 docker方式安装
5.2.3.1 docker run方式:
docker run -d \
-v /etc/sing-box:/etc/sing-box/ \
--name=sing-box \
--restart=always \
ghcr.io/sagernet/sing-box \
-D /var/lib/sing-box \
-C /etc/sing-box/ run
5.2.3.2 docker compose方式的配置文件
version: "3.8"
services:
sing-box:
image: ghcr.io/sagernet/sing-box
container_name: sing-box
restart: always
volumes:
- /etc/sing-box:/etc/sing-box/
command: -D /var/lib/sing-box -C /etc/sing-box/ run
5.3 创建配置目录与配置文件
5.3.1 碎碎念
sing-box有一点比较坑,不同版本之间的配置文件可能存在较大差异,因为它的开发节奏非常快,更新频繁,很多功能在不断重构与重命名。例如,一些旧版本中的字段在新版本中被合并或拆分,某些模块的行为逻辑也会随着版本迭代发生变化。这就导致网上很多教程、甚至是官方文档中,不同时间撰写的示例配置彼此不兼容,初学者很容易踩坑。
特别是当你参考他人配置时,如果两边的版本号差距较大(其实未必较大时才有问题,那么就相差一个小版本一样难说~),很可能出现”配置看起来没错,但根本跑不起来”的情况。因此,使用 sing-box 时一定要注意确保教程示例、自己的程序版本、官方文档三者的一致性,否则调试过程可能会变得非常痛苦。
友情提醒:如果你追求稳定,建议在验证过可用配置后锁定版本使用;如果你想用上最新特性,比如 Reality、Tuic2 等高级功能,那就要做好跟着版本日志不断更新配置的心理准备。
5.3.2 Server端配置示范(v1.11.10)
新建目录并创建config.json配置文件:
mkdir -p /etc/sing-box
vim /etc/sing-box/config.json
采用”vless+tls+websocket”方式,填入如下配置(server端配置):
{
"log": {
"level": "info" // 设置日志等级,可选: trace/debug/info/warn/error。这里设为 info,表示输出一般运行信息。
},
"inbounds": [
{
"type": "vless", // 入站协议类型为 VLESS
"listen": "0.0.0.0", // 监听所有网卡的 IP 地址
"listen_port": 8443, // 监听端口为 8443,客户端需连接此端口
"users": [
{
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // 用户认证使用的 UUID,客户端配置中需保持一致
}
],
"tls": {
"enabled": true, // 启用 TLS 加密
"server_name": "xxx.exapmle.com", // SNI(Server Name Indication),应与证书中的域名一致
"certificate_path": "/etc/certs/xxx.exapmle.com/fullchain.pem", // TLS 证书路径
"key_path": "/etc/certs/xxx.exapmle.com/key.pem" // TLS 私钥路径
},
"transport": {
"type": "ws", // 使用 WebSocket 作为传输层
"path": "/websocket" // WebSocket 的访问路径,客户端需匹配
}
}
],
"outbounds": [
{
"type": "direct" // 出站类型为直接连接(不代理),表示这是一个终端节点(非转发代理)
}
]
}
上面配置中的uuid可以用在线工具生成,也可以使用我这个:uuid在线生成工具。
运行sing-box server端:
sing-box run -c /etc/sing-box/config.json
注1:本例中因为这是部署在海外VPS节点,所以”outbounds”采用direct方式直接出站即可;如果你打算让这个服务端将接收到的流量继续代理出去,那”outbounds”就不是 direct,而应该是指向其他代理节点(比如一个 shadowsocks、vless 或 trojan 的出站配置)。
注2:除了vless,还可以用trojan,这个看大家喜好,在Cloudflare Tunnel加持下,使用vless还是trojan其实都没啥区别(TLS都由Cloudflare来完成),vless只是稍微轻量了一点点。
5.3.3 Client端配置示范(v1.11.10)
新建目录并创建config.json配置文件:
mkdir -p /etc/sing-box
vim /etc/sing-box/config.json
采用”vless+tls+websocket”方式,填入如下配置(client端配置):
{
"log": {
"level": "info" // 设置日志等级,这里为 info,表示输出常规信息
},
"inbounds": [
{
"type": "http", // 入站类型为 HTTP 代理
"tag": "http-in", // 标记名称,可用于路由等功能中引用
"listen": "0.0.0.0", // 监听所有网卡地址
"listen_port": 8080 // HTTP 代理监听端口为 8080
},
{
"type": "socks", // 入站类型为 SOCKS5 代理
"tag": "socks-in", // 标记名称
"listen": "0.0.0.0", // 监听所有网卡地址
"listen_port": 1080 // SOCKS5 代理监听端口为 1080
}
],
"outbounds": [
{
"type": "vless", // 出站协议类型为 VLESS,用于连接服务端
"tag": "vless-out", // 出站标记,可用于路由匹配
"server": "xxx.exapmle.com", // VLESS 服务端域名或 IP 地址
"server_port": 443, // 服务端监听的端口,配合 TLS 使用
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // 身份验证用 UUID,需与服务端配置一致
"tls": {
"enabled": true, // 启用 TLS 加密
"server_name": "xxx.exapmle.com" // TLS 握手时使用的 SNI,应与服务端证书一致
},
"transport": {
"type": "ws", // 使用 WebSocket 传输方式
"path": "/websocket" // WebSocket 的路径,应与服务端配置一致
}
}
],
"route": {
"auto_detect_interface": true, // 自动检测默认网络接口(比如出口网卡)
"final": "vless-out" // 所有未被其他规则匹配的流量最终走 "vless-out" 这个出站
}
}
这份配置适合用于将本地的 HTTP/SOCKS 请求统一转发到远程 VLESS 服务端,适合作为家庭内网中浏览器或局部应用的科学代理入口。
运行sing-box client端:
sing-box run -c /etc/sing-box/config.json
注:Client端UUID要和Server端UUID一致。
5.4 配置开机自动启动
创建service文件:
vim /etc/systemd/system/sing-box.service
粘贴并保存以下内容:
[Unit]
Description=Sing-box Service
After=network.target
[Service]
ExecStart=/usr/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=5s
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
启用并启动服务:
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable --now sing-box
检查服务状态:
systemctl status sing-box
6 总结
其实,无论你采用的是”直连”模式还是”非直连”模式,在 sing-box 的 server/client 配置层面几乎不需要做任何区别化的调整。决定访问方式的核心,往往只在于配置文件中 xxx.example.com 这个域名的解析指向。
以一个托管在 Cloudflare 上的域名为例:
- 如果你关闭了 Cloudflare 的代理功能(即关闭了那个”小橙云朵”图标),让域名通过 A 记录直接解析到 sing-box 部署节点的公网 IP,同时该节点开放并监听相应的端口,那么客户端访问该域名时,实际上就是直接连接节点,属于典型的”直连”模式。
- 相反,如果你开启了 Cloudflare 的代理功能(打开”小橙云朵”),那么域名就不会暴露真实的 IP,而是通过 Cloudflare 的边缘网络进行回源。这时有两种形式:
- 传统代理方式:Cloudflare 通过公网回源到你的节点(公网 IP + 监听端口);
- Tunnel 模式:你在节点端运行了 Cloudflare Tunnel 客户端,Cloudflare 通过 tunnel 的专用隧道进行回源。
这两种方式都属于典型的”非直连”模式,因为访问链路中总有一段是”非真实 IP”的中转层。因此,可以说:“直连”还是”非直连”的区别,关键并不在 sing-box 本身的配置内容,而在于你如何通过 DNS 和 Cloudflare 控制访问流量的入口路径。
注:如果采用基于cloudflare tunnel的”非直连”模式,会有几个配置注意点,参见我另一篇文章:dnscrypt-proxy(v2.1.8) 多场景配置指南:从上游部署到下游集成。
上次搭梯还是大三,下午闲着没事干买了23黑五套餐又搭了一遍~
FakeIP + CDN + Websocket + TLS 的方案依旧稳定,以前的 fall-back dns 已经被各种 rule-set 覆盖了
outbounds 我用 wireproxy 的 socks5 代理又套了一层 warp,速度上没有影响
目前遇到的问题: sing-box 的 wireguard 配置目前没法指定 endpoint ip,而 Los DC3 机房直连 engage.cloudflareclient.com 一直卡在初始化握手阶段
我理解你这个用法了,不过你这个场景其实不太需要在 VPS 上再套一层 WARP。你现在本身就是走 Cloudflare Tunnel / CDN 进来的,入口已经是 Cloudflare 网络了,VPS 只是一个中转节点,这种架构下再用 WARP,相当于是 Cloudflare → VPS → 再回 Cloudflare,其实有点“套娃”,收益不大,反而容易引入不稳定(你现在这个 handshake 卡住就是典型情况)。一般在 VPS 上用 WARP,更多是为了“洗出口 IP”或者访问特定资源,但如果你只是做代理中转,其实可以不加这一层,会更简单也更稳定。你现在这个问题,本质还是机房对 Cloudflare UDP 的限制导致的,不是配置问题。如果不是刚需,可以考虑把 WARP 这一层去掉,整体稳定性反而会更好。
可能是强迫症发作,ip.gs 看到 VPS IP了,以及测试流媒体解锁和其他套 CF 盾站点不弹 turnstile 验证
晚高峰真是减速带啊(不套 warp 也是 2M
tunnel 方案是不是不需要在 server 端的配置文件写 tls 部分
是的,TLS 是由 Cloudflare 处理的,所以 VPS 上的 sing-box 不需要再配置 TLS。服务端只需要提供明文的 VLESS 入口(比如走 WS 或 HTTP),由 Tunnel 转发过来就可以了。
你好,请问能否提供一份Cloudflare Tunnel代理Sing-box Trojan的完整教程?我测试了很久都没有成功:Trojan服务端使用域名并配置证书,Cloudflare代理使用另一个有效的域名,反代到 https://localhost:8443 或 https://valid-name.example.com:8443 不成功;Trojan不使用证书,反代到 tcp://localhost:8443 也不成功。只有通过公网直连的那个Trojan端口可以正常访问。
完整配置示范其实没必要写,因为你遇到的问题根本不在 CF Tunnel,而是在 Trojan 默认的工作机制上。我文章里用 CF Tunnel + VLESS,是因为 VLESS + WebSocket 本来就和 CF Tunnel 天然兼容,直接能跑通。
你用的 Trojan 是默认的 TLS 模式,这种模式是纯 TCP + TLS 握手,相当于让 CF Tunnel 这个专门做 HTTP/WS/GRPC 反代的工具去转发裸 TCP 流量,协议层完全对不上,自然不可能成功,只能靠直连。并不是说 Trojan 不能配合 CF Tunnel,而是你得把 Trojan 改成 WebSocket 或 gRPC 模式,这样外层就变成 HTTP 流量了,CF Tunnel 才能正常转发。至于具体怎么改,那就是 Sing-box 的配置问题了。我个人实话实说:Sing-box 配置项实在太复杂,我自己也是固定用某个版本,能跑就不敢乱折腾 😂。
顺带提醒一句,如果只是为了配合 CF Tunnel,其实直接用 VLESS 会比折腾 Trojan 省心得多。
非常感谢您的指导,帮我指明了关键的问题点。我已经成功实现了通过 CF Tunnel 转发 VLESS + TLS + WS 流量,好处是不用在公网暴露端口,缺点是速度较慢,无法满足日常使用的需要,只能作为备用。
我也是用来做备用的,因为是备用,所以更不想暴露vps的公网IP了。不过我可能因为是cloudflare pro,所以感觉速度还行~。
我是用的 CF 免费版,暂时不考虑升级付费。我准备慢慢把您网站上的 CF 教程看完,了解一下大概的用法。再次感谢。
cloudflare的功能主要还是用于建站,不过,了解一下还是很有好处的。有一点你要注意,最近几个月cloudflare的仪表盘界面发生了较大的改变,我懒得去更新了,所以我教程的有些功能的截图和现在的不一样了,当然,思路是一样的,就是有些功能要找找新位置了。
对于你的配置文件有一点疑问?
服务端配置监听的端口是8443,客户端配置的服务端口是443,这在直连的情况下可行吗?
如果是在dns记录上开启了代理,客户端使用域名而不是IP地址,然后把服务端配置监听的端口和客户端配置的服务端口设置成同一个值,似乎也不可以。
另外在 Tunnel 模式下,tls 的证书该如何设置呢?证书不是cloudflare提供的吗?
服务端监听8443端口,客户端访问443端口,这个配置是本文中讲的”非直连”场景下才适用:因为客户端访问的是cloudflare的443端口,而cloudflare通过边缘网络的反向代理功能,指向了服务端本地的8443端口。如果是直连模式,当然是客户端访问的端口和服务器监听的端口必须一致。
至于tunnel模式,其实tls证书无所谓,自签的都行,cloudflare又不会验证证书的真实性,我文中说到的使用cloudflare提供的证书,只是图方便而已,实际上随便找个自签的就行了。这个其实就是cloudflare tunnel回源和其传统的公网IP地址回源的差别所在:tunnel方式回源走的是cloudflare的内部网络直通源站所在内网,因此不需要真的校验证书,只要随便有个证书和key完成tls流程即可;而传统的公网IP地址回源走的是公网,在公网环境下肯定需要校验源站的可信度,所以要么证书是合法的,要么是cloudfalre自签证书,要能证明源站身份。
修改了配置文件,直连模式是可以联通的。tunnel模式我还没有试,那么cloudflare边缘网络的反向代理功能是如何开启的呢?是指在dns记录里开启proxy模式吗?我试过了不管用。是不是服务端也要使用443端口?443端口是被nginx占用的,那就是要通过nginx再转发一下咯。
dns记录开启小橙云是开cloudflare反代的一种模式,但是这种方式来实现比较麻烦,因为默认cloudflare采用公网回源这时方式时,只会监听特定的一些源站端口,如果要用这种方式,需要你的VPS将服务监听端口设置为的这些特定的端口,其次防火墙规则还要开放监听的端口,当然,也可以随意设置监听端口,但是在cloudflare上使用规则来指定源站端口,不过总体上来说,就是折腾。而另一种开cloudflare反代的模式,就是tunnel了,在公共主机名里直接就可以指定源站的端口,比如”https://localhost:8443“,这种方式简单不知道多少。所以我现在关于回源模式的选择,只推荐cloudflare tunnel方式,至于传统的公网地址回源(DNS A记录指向VPS公网IP然后开启小橙云)的方式,我觉得真的没什么必要了。
没有用tunnel的方式。客户端连接域名加443端口,cloudflare dns记录上开启“代理”模式,vps 通过 web服务器 nginx 使用 WebSocket 代理转发到singbox服务端的自定义端口,是可行的。 https://nginx.org/en/docs/http/websocket.html
当然是可行的,只不过你需要用到443端口,用公网回源这种方式其实多反代了一次(nginx),用tunnel方式的话是直接指向sing-box的监听端口,不需要在nginx上再过一次的。
如果你sing-box服务端直接用443端口,那倒是不用折腾,dns直接开橙云朵应该就可以了,我之所以文章中用8443,是因为我服务端的443端口已经用了。
说到自建科学节点, 我的经验是 cdn路子(我是用 websocket+tls) + tcp路子(reality) + udp路子 (hysteria2) 同时搭着, 端口互相不冲突就能同时共存. 对于使用者来说, 哪个好就用就哪个.
用到的github项目
https://github.com/crazypeace/v2ray_wss
https://github.com/crazypeace/xray-vless-reality
https://github.com/crazypeace/hy2
没毛病,我只是不喜欢开放端口而已,所以直连方式的tcp和udp都不想弄,只是着重介绍一下你说的cdn路子(严格意义上说和cdn无关,只是利用了其中的反向代理功能而已)。