Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address. With Tunnel, you do not send traffic to an external IP — instead, a lightweight daemon in your infrastructure (cloudflared) creates outbound-only connections to Cloudflare’s global network. Cloudflare Tunnel can connect HTTP web servers, SSH servers, remote desktops, and other protocols safely to Cloudflare. This way, your origins can serve traffic through Cloudflare without being vulnerable to attacks that bypass Cloudflare.

——摘自CloudFlare Zero Trust官网

简介

CloudFlare Tunnel设计的目的并不是用来做内网穿透的,而是用来隐藏服务源IP从而防御攻击。但是它的工作原理,恰好也能让没有公网IP的设备的服务也能放于公网之上,也就实现了内网穿透。

image.png

以上是CloudFlare的工作原理图。大概就是用户请求服务的时候,CF通过cloudflared与我们的服务器进行通讯,再将结果返回回去。

网上也有很多通过此进行内网穿透的教程,而此教程主要结合我自己的使用,尽量通过dashboard进行,尽量避免使用命令。

创建Tunnel、安装cloudflared

登录CF,进入Zero Trust页面。
image-20230720174632795
通过dashboard创建Tunnel

image.png

点击后,随便输入一个tunnel的名字,然后根据自己的环境选择,选择后下方会有安装教程,跟着教程安装即可。

image.png

image.png

完成后,下方出现了connectors即成功。

image.png

点下一步,如果没有绑定域名直接返回即可。

看到Status为HEALTHY则没有问题,如果为DEGRADED,则重启一下服务,或者等待一会即可。【由于cloudflared会发起三个连接确保通信,如果掉了一两个就会出现DEGRADED的情况】

创建服务

点击tunnel name,然后点击configurre,进入配置页面。

image.png

点击Public Hostname添加服务即可。【需要有域名NS挂在CF下,如果没有可以看下面没有域名的使用方案】

image.png

Run as a service

我们总不能一直开一个窗口保证cloudflared挂着吧,得作为服务进行运行。当然也可以使用nohup等挂后台,不过service还有一个好处可以设置开启自启动。

官方教程【得login之后使用】:Run as a service on Linux · Cloudflare Zero Trust docs

未login教程:

输入命令编辑服务

systemctl edit --force --full cloudflared.service

输入服务内容

[Unit]
Description=cloudflared
After=network.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --edge-ip-version 6 tunnel run --token eyxxxxx
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

然后保存。

启动服务

sudo systemctl start cloudflared

启动开启自启动

sudo systemctl enable cloudflared

查看启动状态

sudo systemctl status cloudflared

优化

使用ipv6进行通信

由于海大的ipv4限速40Mbps,ipv6不限速,如果有大流量通过ipv6通信会更好。

cloudflared默认边界通信协议为auto,也就是dns解析region1.v2.argotunnel.comregion2.v2.argotunnel.com,如果结果为ipv4就通过ipv4通信,ipv6就通过ipv6通信。通信端口为7844,如果有防火墙记得放行。详见:Tunnel with firewall · Cloudflare Zero Trust docs

由于很多dns这两个域名结果都是ipv4优先,我们可以启动时添加参数--edge-ip-version 6强制指定使用ipv6。

cloudflared --edge-ip-version 6 tunnel run xxxx

Tips:

如果没有在服务器上进行cloudflared tunnel login,则默认是通过token进行认证。login之后通过cert.pem证书进行认证。

token为图中所框起来的部分。

image.png

启动命令:

未login

cloudflared --edge-ip-version 6 tunnel run --token eyxxxxxx

已login

cloudflared --edge-ip-version 6 tunnel run server1(tunnel名称)

参数参考:Cloudflared parameters · Cloudflare Zero Trust docs

优选ip

如果默认的速度你可以接受的话,就不需要优选了,直接使用即可。

如果使用人数不多,可以使用工具筛选IP后,修改本地hosts也可。【校园网对cf非常友好,延迟在60左右,可以媲美国内内,其他网络运气好也能筛选出这种ip,家里移动有50多的香港ip】

筛选工具有:

XIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP !当然也支持其他 CDN / 网站 IP ~ (github.com)

badafans/better-cloudflare-ip: 查找适合自己当前网络环境的优选cloudflare anycast IP (github.com)

CloudFlare IP段:

badafans/better-cloudflare-ip: 查找适合自己当前网络环境的优选cloudflare anycast IP (github.com)

优选的思路:再准备一个域名,通过cf workers进行反代。第二个域名CNAME指向已经优选ip的域名。【也可以自己优选,网上找教程吧。】

这里留两个优选过的域名吧:

gn.cfsaas.ltd

stock.hostmonit.com 【这个网址里面也有一些CF的优选IP,自己可以看看】

当然通过其他方式反代也是可以的。

反代代码:

"use strict";
(() => {
// src/index.ts
function handleRequest(request) {
let url = new URL(request.url);
let hostname = "https://域名1"
return fetch(new Request(hostname + url.pathname, request));
}
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});
})();
//# sourceMappingURL=index.js.map

没有NS挂载在CF玩法

也就是Use TryCloudflare,可以使用CF的trycloudflare.com临时使用,官方的说法是不太稳定,但是测试几天基本都没什么问题,还是很稳定的。

官方教程:Quick Tunnels · Cloudflare Zero Trust docs

cloudflared tunnel --url http://localhost:8080

image.png

使用图中域名即可访问。

防火墙配置(2024.4.2更新)

cloudflared 在端口 7844 上连接到 Cloudflare 的全球网络。要使用 Cloudflare Tunnel,您的防火墙必须允许在端口 7844 上与以下目的地建立出站连接(如果使用 quic 协议,则通过 UDP,如果使用 http2 协议,则通过 TCP)。

image.png

没有特殊配置的情况下,是通过前两个域名的7844端口连接到CloudFlare的,所以如果路由器上有什么其他服务,需要放行7844端口。

如果quic协议连接不上,可以通过--protocol http2强制采用http2进行连接。