前言
Cloudflare Tunnel是一个非常好用的内网穿透工具,无需服务器,仅仅需要一个Cloudflare账号就可以将无公网IP的内网服务穿透到外网去。但是有个相当致命的缺点:Cloudflare到中国大陆的网络情况不佳,分配到的EndPoint基本都在美西,速度慢不说,还经常炸。
最近一段时间,从移动分到的Cloudflare Tunnel EndPoint基本都是在洛杉矶LAX,但是移动到洛杉矶最近的网络炸的惨不忍睹,丢包70%,实属逆天:
这直接导致了本站的Smokeping服务离线数天。当你配置好了隧道,能基本正常工作,却时不时看到这个页面,伴随速度慢,就说明到Cloudflare 的网络连通性太差了。
网络连通性差,速度慢,给Cloudflare Tunnel配置一个前置代理不就能解决了吗?然而,Cloudflare Tunnel本身并不支持前置HTTP/Socks5代理,官方的意见是不会支持:https://github.com/cloudflare/cloudflared/issues/350#issuecomment-1706842883
官方不支持,我们就给Cloudflare Tunnel想办法套一个前置透明代理。下面本文就记述如何使用V2Ray/Xray Core配合iptables实现为Cloudflare Tunnel提供透明代理,提高速度。
你可能会问下列问题,我的回答是:
Q1: 要使用V2Ray/Xray Core就需要服务器,自己有服务器为什么不使用类似FRP的自建内网穿透服务?
Q2: 不可以自选EndPoint的IP来达到较好的效果吗?
A1: 使用Cloudflare Tunnel可以更有效隐藏服务器的IP,防止被攻击;也不一定非要有服务器才能自建V2Ray,例如Edge Tunnel. 当然执意选择自建的肯定不会看我这篇文章了。(之前用过FRP,但是Cloudflare Tunnel真香)
A2: Cloudflare Tunnel通过连接到EndPoint的7844端口来工作,只有198.41.192.0/24和198.41.200.0/24这两组IPv4地址开放了7844端口,绝大多数加速443端口的自选IP都没开放7844端口,都不能用。
正文,开搞
本文默认你已经在需要穿透的内网设备上配置好了Cloudflare Tunnel并能基本正常工作,只是因为网络问题速度慢,需要前置代理来提速。
Step1. 安装Xray-core
首先,安装Xray-core. 不要觉得这是一件能简单完成的任务,国内机器上安装Github上的软件是很痛苦的问题。Xray-install的GitHub issue中有人提到前置代理...那么这就是一个先有鸡还是先有蛋的问题。一般过一会儿多试试总能安装上。
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
Step2. 配置Xray-core
本地客户端中新起一个dokodemo-door
的inbound,注意不要开始流量探测。 路由模块 routing
中的domainStrategy
最好设置为 AsIs
.
//客户端配置
"inbounds": [
{
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true // 接收流量转发
}
},
......
],
......
"routing": {
"domainStrategy": "AsIs",
"domainMatcher": "mph",
......
同时不要开启服务端的流量探测。如需要流量探测,建议在其他客户端上开启,或者在服务端中另起一个inbound. 否则Cloudflare Tunnel会出现ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0
的错误并且无法工作。
为什么?因为Cloudflare Tunnel会解析region1.v2.argotunnel.com
和region2.v2.argotunnel.com
的DNS记录,并使用cftunnel.com
的SNI去连接到EndPoint。但是cftunnel.com
本身并没有A和AAAA的DNS记录,这导致Xray-core服务端无法通过解析cftunnel.com
的IP地址来进行连接。所以需要关掉流量探测,让Xray-core服务端通过IP连接。或者可以在服务端尝试指定cftunnel.com
的hosts,但我没有进行过尝试,理论上可行。
上图为Xray-core服务端嗅探出了cftunnel.com
的域名,但无法连接。
Step3. 配置iptables
添加下列iptables规则:
sudo iptables -t nat -A OUTPUT -d 198.41.192.0/24 -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -d 198.41.200.0/24 -p tcp -j REDIRECT --to-ports 12345
region1.v2.argotunnel.com
和region2.v2.argotunnel.com
分别解析到198.41.192.0/24和198.41.200.0/24中的IP地址,而且Cloudflare Tunnel默认使用IPv4,配置iptables规则将这两段IP转发到dokodemo-door上即可完成透明代理。注意iptables规则重启后即失效,需要配合iptables-persistent
进行持久化。
Step4. 调优
Cloudflare Tunnel会时不时连接到下面几个域名来完成类似检查更新,汇报信息的功能,好在是使用443(HTTPS)端口来进行通信,可以自选IP。
- api.cloudflare.com
- update.argotunnel.com
- <你的团队名称_需自己修改>.cloudflareaccess.com
- pqtunnels.cloudflareresearch.com
将上述域名放到hosts里面自选IP,或者直接在hosts中写死我们透明代理加速过的198.41.192.0/24和198.41.200.0/24中的IP也可以。
104.17.18.19 api.cloudflare.com
104.17.18.19 update.argotunnel.com
104.17.18.19 pqtunnels.cloudflareresearch.com
104.17.18.19 <你的团队名称_需自己修改>.cloudflareaccess.com
此外,还需要配置cloudflared使用http2协议与EndPoint通信,iptables转发规则对QUIC无效。若使用cloudflared二进制文件则需要修改对应的config.yml,请确保protocol
为http2
; 若使用cloudflared docker镜像,则需要增加环境变量TUNNEL_TRANSPORT_PROTOCOL
的值为http2
.
Step5. 验收
重启cloudflared,查看效果:
sudo systemctl restart cloudflared
我的Xray-core服务端架设在日本,可以看到Endpoint的location已经变成了nrt01
和nrt08
,而不是国内默认路由的美西节点。现在,享受丝滑的Cloudflare Tunnel!
引用
开启全局透明代理后,cloudflared(argo tunnel)无法使用 · Issue #188 · v2rayA/v2rayA
感谢楼主,使用这个方法成功解决调试不稳定的情况。
有尝试过windows上使用Clash 的 tun模式 来代理 cloudflare-tunne 吗?
域名嗅探关了也是:“ ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" ”
用的http2
感谢,使用 gost 的透明代理也成功了,加载速度提升 6 倍
感谢分享,我用的cloudflare/cloudflared:latest的docker镜像,需要增加一个环境变量TUNNEL_TRANSPORT_PROTOCOL值为http2否则默认为走udp的quic
是的,使用QUIC的话还是直连,需要用http2。稍后我会加上备注,也谢谢你的提醒
安装Xray-core很好解决,只要找个现成的或是自建一个可用的在线代理,使用代理后的地址来安装即可。是否也能使用别的工具作为前置代理?若是能够使用WARP作为前置代理的话,由于WARP可以自选IP,就相当于Cloudflare Tunnel也能自选IP了。
WARP理论也是可以的,但具体情况我不是很清楚,听说只能v6直连...?不太稳定的样子。
可以用wgcf代理整机的流量,但是貌似它是用WireGuard协议连接到cloudflare的EndPoint的...?WireGuard的早就被ban了。具体怎么实现还不清楚。