使用 Cloudflare Tunnels 进行内网穿透
前言
Cloudflare Tunnel 是一款隧道软件,可以快速安全地加密应用程序到任何类型基础设施的流量,让您能够隐藏你的web 服务器IP 地址,阻止直接攻击,从而专注于提供出色的应用程序。
相比于 frp 等做内网穿透,Cloudflare Tunnels 的优势是不需要一台额外的公网服务器转发,并且可以享受到 Cloudflare CDN 带来的便利。
使用 frp 做内网穿透的流程如下:
flowchart LR server[Frp Server] clients[Frp Clients] User -->|http/https| server -->|http/https| clients
使用 Cloudflare Tunnels 做内网穿透的流程如下:
flowchart LR tunnels[Cloudflare CDN] clients[Original Clients] User -->|http/https| tunnels -->|Cloudflare Tunnels|clients
前置条件
需要有一个由 Cloudflare 管理的域名
配置
安装 cloudflared
debian:
apt install cloudflared
或者下载最新版
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -O cloudflared.deb && dpkg -i cloudflared.deb && rm cloudflared.deb
登录 cloudflared
cloudflared tunnel login
随后会生成一个
~/.cloudflared/cert.pem
文件用于后续授权创建一个隧道 tunnel
cloudflared tunnel create <名字>
随后会在
~/.cloudflared/
目录下出现一个 json 文件[Tunnel-UUID].json
,里面保存着运行这条隧道所需要的授权信息。创建一个配置文件,
~/.cloudflared/tunnels/名字.yaml
,并添加# 反代的源站地址 url: http://localhost:8080 tunnel: <Tunnel-UUID> credentials-file: /root/.cloudflared/<Tunnel-UUID>.json
如果在上一步没有保存 UUID 信息,可以通过
cloudflared tunnel info
获取配置路由
cloudflared tunnel route dns [名字或者 Tunnel-UUID] [想要绑定到的域名或其二级域名]
启动
cloudflared
cloudflared tunnel --config ~/.cloudflared/tunnels/名字.yaml run
之后就可以通过在第 5 步 设置的域名进行访问
范例
例如,创建一条隧道从公网访问家里的 clash dashboard(地址为 192.168.1.1:9090),设置隧道名字为 clash,并将其绑定到 clash.example.com:
cloudflared tunnel login
授权cloudflared tunnel create clash
,假设输出 Tunnel-UUID 为c91c37a3-3efd-47fb-af0d-e5676ac122b9
将下面配置添加到
~/.cloudflared/tunnels/clash.yaml
url: http://192.168.1.1:9090 tunnel: c91c37a3-3efd-47fb-af0d-e5676ac122b9 credentials-file: /root/.cloudflared/c91c37a3-3efd-47fb-af0d-e5676ac122b9.json
cloudflared tunnel route dns clash clash.example.com
创建路由cloudflared tunnel --config ~/.cloudflared/tunnels/clash.yaml run
启动隧道
此时,访问 clash.example.com
等同于内网访问 192.168.1.1:9090
配置 systemd service 自动启动
在
/etc/systemd/system
目录下创建 service 配置文件EXAMPLE.service
[Unit] Description=Cloudflare Tunnel After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root ExecStart=cloudflared tunnel --config /root/.cloudflared/tunnels/名字.yaml run [Install] WantedBy=multi-user.target
启动服务
systemctl enable EXAMPLE systemctl start EXAMPLE