Cloudflare Tunnel 内网转发

借助其赛博菩萨 CloudflareWorkers 实现动态 IP 与域名的自动绑定, 简单来说就是只需要域名就能将本地宽带内部服务暴露到公网,
并且还同时享受到 Cloudflare 的CDN|DDoS防护|IP代理隐藏等额外优势, 仅仅只需要把域名移交给 cloudflare 管理.

这里首先就是需要以下条件:

  • cloudflare 账号: 官网地址
  • cloudflare 托管的域名: 不要用国内的任何域名, 因为国内可能需要做网证等验证
  • 一台能够持续运行的 linux 服务器

这里依赖 Cloudflare Zero Trust, 其实就是要求本地局域网运行的 Cloudflare 守护程序,
与 Cloudflare 云端通信, 从而将云端请求数据转发到本地网络的 IP + 端口.

通过依赖 Cloudflare Tunnel 业务实现内网穿透, 但是国内特殊国情, 可能在国内访问速度不快并有断流的情况发生

上面提到的国情问题导致实际上体验方面可能很不好, 所以如果想长期稳定使用还是要购买公网IP服务.

另外需要说明下的是启用 Cloudflare Zero Trust 免费用户(Free)也需要信用卡验证下, 网上说有方法绕过我没试过

因为其 ‘打洞转发’ 特性, 目前很多都拿去代理转发, 所以一旦访问高峰期的时候就会出现很不稳定的情况.

官方MYSQL转发(可用于参考): MYSQL

注意: 我这边环境是采用 ARM 开发板的服务器, 所以有部分细微的差别

开通服务的步骤如下:

  • 登录 Cloudflare 控制台
  • 左侧菜单点击 Zero Trust
  • 进入 Networks > Tunnels
  • 注: 首次使用 Zero Trust 需要认证信用卡开通 Free 计划

tunnels

这就是内网转发配置的地质, 我们需要创建自己渠道, 所以直接点击 Create a tunnel:

created

这里选择 Cloudflared 配置, 代表我们会安装 Cloudflare 内部客户端在我们本地服务器创建服务;
之后需要声明内网转发通道名称, 按照自己习惯配置名称即可:

named

我这里是转发内网的 armbian 服务器的 Cockpit, 所以按照 Choose your environment 选择 debian+arm64 安装:

1
2
3
4
5
6
7
8
9
# Add cloudflare gpg key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-public-v2.gpg | sudo tee /usr/share/keyrings/cloudflare-public-v2.gpg >/dev/null

# Add this repo to your apt repositories
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-public-v2.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared
sudo apt-get update && sudo apt-get install cloudflared

注意: 下载 gpg 有时候会突然被阻断, 需要注意是否下载完成才能执行 apt 相关操作

等待 cloudflared 系统安装服务完成, 之后就复制最下面的授权验证信息:

1
2
3
4
5
# 服务凭证注册
sudo cloudflared service install [复制你 cloudflare 的命令行指令的base64]

# 如果需要替换或者卸载注册凭证, 需要执行以下命令
sudo cloudflared service uninstall

等待服务注册完成, 可能采用 cloudflared service install 会提示失败, 不用管他继续下一步:

cockpit

这里部署 cockpit 服务来运维处理, 需要 cockpit.conf 设置 Origins={购买的域名}AllowUnencrypted=true

配置完成之后点击 Complete Setup(配置设置) 弹出浮动窗口 Successfully 代表配置完成,
这里需要在自己服务器当中重启下服务:

1
2
# 重启服务, 加载配置项
sudo systemctl restart cloudflared.service

初次启动的时候会发现没办法直接启动服务, 可以通过 sudo journalctl -f -u cloudflared.service 命令确定是否出现以下异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# ======================================================================================================
# 如下异常:
# ERR Failed to dial a quic connection error="failed to dial to edge with quic..."
# ======================================================================================================
# quic 基于 udp, 而 udp 在国内很容易被运营商网络阻断, 需要切换成 http2
# 需要修改下 cloudflared 启动配置:
sudo systemctl stop cloudflared.service # 先停止下系统服务
sudo vim /etc/systemd/system/cloudflared.service # 修改系统服务文件
# 1. 找到 ExecStart= 启动配置
# 2. 追加 '--protocol http2', 比如: /usr/bin/cloudflared --no-autoupdate --protocol http2 tunnel run --token <your_token>
sudo systemctl daemon-reload # 更新系统服务
sudo systemctl start cloudflared.service
# 注意: 切换 http2 也不一定有效, 因为国内特殊网络国情导致指不定网络抽风时候阻断, 这也是没有办法的
# ======================================================================================================


# ======================================================================================================
# 如下异常:
# WRN The user running cloudflared process has a GID (group ID) that is not within ping_group_range
# ======================================================================================================
# 容器内用户的组 ID 不在系统允许的 ping 权限范围内, 导致 ICMP 代理功能被禁用, 这是警告而非错误, 不影响隧道核心功能,可忽略
# 如果要解决可以修改下 sysctl:
echo "net.ipv4.ping_group_range=0 65535" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 这个配置其实挺有用, 用于暴露给 cloudflared 进程做延迟判断
# ======================================================================================================


# ======================================================================================================
# 如下异常:
# ERR Failed to fetch features, default to disable error="lookup cfd-features.argotunnel.com..."
# ======================================================================================================
# 需要检查 /etc/resolv.conf 是否有正确配置 DNS 解析, 现在发行版采用 systemd-resolved.service 来做解析管理
# 确认是不是 resolv.conf 出现 nameserver 127.0.0.53, 如果是的话需要针对网卡追加dns解析器
sudo vim /etc/systemd/resolved.conf
# 修改内部的 #DNS= 移除 # 号, 配置项目如下:
# # 首选的DNS服务器
# DNS=223.5.5.5 180.184.1.1 1.1.1.1 1.2.4.8
# # 备选的DNS服务器
# FallbackDNS=223.6.6.6 180.184.2.2 1.0.0.1 210.2.4.8
# 之后更新配置生效
sudo systemctl restart systemd-resolved
# ======================================================================================================

一般主要问题就是 quic 阻断和 resolv 解析问题, 处理完能够看到默认心跳已经链接:

healthy

这样的话就可以通过 cockpit 页面去做运维操作.