前言

大家都知道CF优选域名/IP可以用来加速Saas网站访问、加速Workers/Pages节点速度,但是很多人都不知道怎么加速 Zero Trust 穿透的网站,网上搜也搜不到,今天根据大佬wlpz的指点成功实现优选域名访问Tunnel穿透后的网站了!

首先放上大佬回复:

你需要将tunnel绑定至少两个域名,一个回源域名,一个自定义主机名,这里需要注意,比如你自定义主机名已经托管到阿里云了,那怎么绑定到tunnel呢,这里两种方法。①你可以直接通过cf面板添加,点击站点,添加站点,最后注意不需要真的将dns服务器指定到cf的!!!,然后你去tunnel里添加绑定就好了,添加完删除掉站点就行。②或者本地管理tunnel,参考官方文档 Locally-managed tunnel · Cloudflare Zero Trust docs 其他操作和saas接入相同

下面是我的整理的教程,哪里不对的各位大佬多多指点!谢谢~

总体与SaaS方式差不多,但是需要一点想象力

准备两个域名,两个域名必须托管到CF,大佬说自定义主机不在CF也行

第一个域名可以只使用一个子域名作为回退源,下面以 back.aaa.com 为例
另外一个作为主机名,也就是公共访问的域名,会SaaS的一看就懂了,下面以 bbb.com 为例,你可以添加任意数量的子域名,本例为 test.bbb.com,再准备一个加速域名,命名为 cdn.bbb.com

安装

我在本地Alpine系统使用的,以下命令全部以Alpine系统为主,以root用户权限执行,其他系统请自行转换。
直接下载二进制程序

mkdir /root/cfd && cd /root/cfd # 建议使用单独文件夹
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O cloudflared
chmod +x cloudflared

你也可以使用其他方式安装 Downloads

登录

./cloudflared tunnel login

复制控制台上的链接到浏览器打开,登录Cloudflare后选择你要用来使用的主域名,本例是 aaa.com

创建隧道,随意命名

./cloudflared tunnel create <NAME>

记下控制台返回的UUID,记不住也没事,会自动在 /root/.cloudflared生成一个以UUID命名的Json文件

添加一个域名,这个域名将作为回退源,建议使用子域名,且这个子域名没有在使用中,这里以 back.aaa.com 为例

cloudflared tunnel route dns <UUID or NAME> back.aaa.com

创建配置文件

nano /root/.cloudflared/config.yml

内容示例

tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json

ingress:
  - hostname: back.aaa.com # 这条是回退源
    service: http://localhost # 指向本机
  - hostname: test.bbb.com # 这条是被加速的公共域名
    service: http://localhost:8080 # 指向具体的服务
    # 有其他服务可以继续添加
  # Example of a rule responding to traffic with an HTTP status:
  - service: http_status:404

看到这里懂的都懂了

最后一条需要是全局规则,也就是用来兜底的规则

验证配置是否有效

./cloudflared tunnel ingress validate

运行

./cloudflared tunnel run <UUID or NAME>

设置自定义主机

进入Cloudflare面板,SSL/TLS-->自定义主机名,将前面添加的第一个hostname也就是 back.aaa.com 设置为回退源,然后添加自定义主机名,剩下的就跟saas一样操作了

  • 添加TXT验证

8c9d752792e06ea3e2c94.png

自定义主机要与本地配置的对得上,缺一不可

每次修改配置文件都需要重启一次Cloudflared服务

每次修改自定义主机都需要验证一次TXT记录

如果你的自定义主机托管在CF

参考帖子使用自定义主机名加速你在cf(大善人)的网站

去dnspod或其他dns平台,主要是支持分线路解析的平台,添加一个子域名,这个子域名是专门用来解析到加速域名/IP的,本例中为 cdn.bbb.com

334f2ad9fe61833d010d8.png

复制主机记录和记录值去CF添加,同时添加NS记录指向 f1g1ns1.dnspod.netf1g1ns2.dnspod.net,然后在高级设置中关闭暂停解析

重点来了,如下图添加解析,境内指向优选域名/IP,境外指向你的回退源

最后在CF添加你想加速的域名指向这个dnspod添加的加速域名,本例中是 test.bbb.com 指向 cdn.bbb.com,添加完成记得刷新TXT记录并更新

如果你的自定义主机托管在其他平台

在CF面板添加自定义主机名之后,按照正常操作在dnspod添加TXT记录,同时分线路添加解析,缺点好像是不能自动颁发SSL证书

公共域名/IP地址

  1. CloudFlare公共Cname域名
  2. 麒麟域名监测
  3. 神墨佬
  4. 全球主机监控

使用Docker管理

先复制配置文件到当前目录

cp /root/.cloudflared/config.yml ./

使用 id 命令来获取你的用户ID和组ID:

id

在当前目录编写docker-compose文件

cat <<EOF > docker-compose.yml
version: "3.9"
services:
  cloudflared:
    image: cloudflare/cloudflared
    container_name: cloudflared
    restart: always
    volumes:
      - /root/.cloudflared:/root/.cloudflared
      - ./config.yml:/etc/cloudflared/config.yml
    command: tunnel --config /etc/cloudflared/config.yml run
    network_mode: host
    user: "0:0"
EOF

启动

docker-compose up -d

后面只需要编辑当前目录的config.yml文件,编辑完重启docker

如果启动docker后提示以下错误

WRN The user running cloudflared process has a GID (group ID) that is not within ping_group_range. You might need to add that user to a group within that range, or instead update the range to encompass a group the user is already in by modifying /proc/sys/net/ipv4/ping_group_range. Otherwise cloudflared will not be able to ping this network error="Group ID 0 is not between ping group 1 to 0"
WRN ICMP proxy feature is disabled error="cannot create ICMPv4 proxy: Group ID 0 is not between ping group 1 to 0 nor ICMPv6 proxy: socket: permission denied"

不影响使用但是如果想解决的话可以尝试修改ping_group_range,将ping_group_range设置为包含所有组ID:

echo "0 2147483647" > /proc/sys/net/ipv4/ping_group_range

为了在系统重启后保持这些设置,可以将它们添加到启动文件中

创建 OpenRC 服务脚本:
在 /etc/init.d/ 目录下创建一个新的服务脚本,例如 set_ping_group_range:

sudo nano /etc/init.d/set_ping_group_range

在脚本中添加以下内容:

#!/sbin/openrc-run

depend() {
    after net
}

start() {
    ebegin "Setting ping_group_range"
    echo "0 2147483647" > /proc/sys/net/ipv4/ping_group_range
    eend $?
}

赋予脚本执行权限:

sudo chmod +x /etc/init.d/set_ping_group_range

添加脚本到默认运行级别:

sudo rc-update add set_ping_group_range default

立即启动服务:

sudo rc-service set_ping_group_range start

修改系统参数后,重启Cloudflared容器以应用新的缓冲区大小设置:

docker-compose down
docker-compose up -d

如果提示

failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.

也不影响使用,但是想解决的话可以修改缓冲区大小,

  1. 查看当前系统的UDP缓冲区设置

在宿主机上查看当前的UDP缓冲区大小设置:

sysctl net.core.rmem_max
sysctl net.core.rmem_default
  1. 修改UDP缓冲区大小

如果缓冲区大小不足,可以通过修改sysctl参数来增加:

sudo sysctl -w net.core.rmem_max=8388608  # 设置最大缓冲区为8MB
sudo sysctl -w net.core.rmem_default=8388608  # 设置默认缓冲区为8MB

可以将缓冲区大小设置为更大的值,例如8MB或更多,以确保有足够的空间接收数据。

  1. 将修改持久化

为了在系统重启后保持这些设置,可以将它们添加到/etc/sysctl.conf文件中:

echo "net.core.rmem_max=8388608" | sudo tee -a /etc/sysctl.conf
echo "net.core.rmem_default=8388608" | sudo tee -a /etc/sysctl.conf

然后应用这些设置:

sudo sysctl -p
  1. 重启容器

修改系统参数后,重启Cloudflared容器以应用新的缓冲区大小设置:

docker-compose down
docker-compose up -d