前言
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,而不是国内默认路由的美西节点。
当然,由于网络和线路的不稳定性,网络波动可能会导致cloudflared掉线。而似乎cloudflared的断线重连做的不好,常常重连失败或者重连没有经过代理。最好的办法还是定时重启cloudflared,辅以相对稳定的优化线路。
重启cloudflared可以使用crontab实现:
crontab -e #编辑crontab
# 将下列代码粘贴进编辑器中,作用是每6小时重启一次cloudflared
00 */6 * * * sudo service cloudflared restart
现在,享受丝滑的Cloudflare Tunnel!
引用
开启全局透明代理后,cloudflared(argo tunnel)无法使用 · Issue #188 · v2rayA/v2rayA















文章里面说是像saas.sin.fan这类提供优选IP服务的网站不支持7844端口,还是大部分cf的边缘服务器没开7844端口呢?如果是后者是不是可以自己做一个优选服务来筛选 :no-location:
看不懂呀!大佬能不能具体点呀,目前速度太慢了
本来 cf tunnel 是为了隐藏服务器 ip,现在再加一个暴露 ip 的服务器来前置代理合理吗:no-location:
并没有暴露服务器的IP呀,中间中转服务器的IP地址只有CF知道,没有暴露
cf tunnel当然是隐藏源站IP的最佳实践之一,但是主要功能还是将内网的服务穿透到外网,能让外网直接访问到
我总觉得暴露了,要不再水一篇文章解释一下
:no-location:
因为加速的仅仅是源服务器到Cloudflare这一段,访客访问的还是Cloudflare,不会暴露源站的。有时间了或许可以
博客最近是切换到cf了么? :no-location:
目前是分线路解析,国内直连VPS,国外解析到cloudflare,如果您那边不是这样的话,我可以尝试排查下,换了DNS解析提供商,但目前没发现有问题。
大佬 我软路由开的透明代理 怎么设置让cf穿透不走代理啊
我不知道你路由器上是如何实现透明代理的,所有具体怎么做我不知道。你需要配置你的透明代理工具,把198.41.192.0/24和198.41.200.0/24这两个网段排除一下就可以了。不是大佬(
实测sninffing里的domainsExcluded加上两个cf相关域名即可。不需要关闭,不然有点得不偿失
这确实是个好办法,之前我从来没想到过👍 🐂🍺
我想知道你的图片是放在服务器上面的吗?我的放在服务器上面加载特别慢,需要十几秒。我想知道博主你是怎么解决的,我的博客点我头像就可以访问。
是的,但是我这个博客并没有用cloudflare tunnel,是直接解析到服务器IP地址的,服务器线路到国内是优化线路。
我之前有其他的应用是通过cloudflare tunnel访问的,那确实慢一些,你可以尝试配置一下cloudflare缓存,把你的服图片缓存在cloudflare的服务器上。然后再优选cloudflare IP,会更快一些。
好的,我知道了。我试试,我的是家宽搭建。现在家里停电,晚会我测试看看