Linux 使用 Cloudflare Tunnel 内网穿透

简介

Cloudflare Tunnel介绍

Cloudflare Zero Trust提供了免费内网穿透服务,名叫Cloudflare Tunnel(原Argo Tunnel),使得能够突破80/443端口限制和公网IP限制。

免费版是有一定限制的:

  • 每个账号最多100个Tunnel
  • 每个Tunnel最多100个同时连接数

如果是大规模使用的话建议还是使用其它内网穿透服务。

安装

1
2
3
4
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt-get update && sudo apt-get install cloudflared

Cloudflare提供了两种管理Tunnel的方式,一种是在本地用配置文件config.yml管理,一种是在Zero Trust面板中管理。对于同一个Tunnel,两种方式只能选其一。

本地管理

设置Tunnel

1
cloudflared tunnel login

然后打开出现的链接,登录你的Cloudflare账号后授权一个域名。

之后就可以使用下面的命令来本地管理Tunnel了:

1
2
3
cloudflared tunnel create <Tunnel名>                        # 创建 Tunnel
cloudflared tunnel route dns <Tunnel名> <域名> # 设置 Tunnel 绑定的域名
cloudflared tunnel run --url localhost:<端口号> <Tunnel名> # 设置要穿透的端口

其中,绑定的域名可以是二级域名。

在创建Tunnel之后,请复制出现的Tunnel ID和Tunnel TOKEN以供后续config.yml的编写:

1
2
3
Tunnel credentials written to /home/<系统用户名>/.cloudflared/<当前Tunnel的TOKEN>.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel <Tunnel名> with id <Tunnel ID>

使用命令在本地创建的Tunnel与在Cloudflare Zero Trust网页面板中创建的有些不同。本地创建的Tunnel只能在本地管理,如果要在网页面板中管理需要进行迁移。迁移之后可以在网页面板中查看Tunnel,但是在本地对Tunnel的编辑并不会同步到面板中。

本地管理的Tunnel

注册服务

1
sudo vim ~/.cloudflared/config.yml

然后输入以下内容:

1
2
3
4
5
6
7
tunnel: <Tunnel ID>
credentials-file: /home/<系统用户名>/.cloudflared/<当前Tunnel的TOKEN>.json

ingress:
- hostname: <域名>
service: <协议,例如HTTP、SSH等>://localhost:<端口号>
- service: http_status:404

之后,在systemctl中注册服务,并设置开机自启:

1
2
sudo cloudflared --config ~/.cloudflared/config.yml service install
sudo systemctl enable cloudflared

最后,使用systemctl开启服务即可使用内网穿透:

1
sudo systemctl start cloudflared

Zero Trust管理

面板创建

首先,进入Cloudflare Zero Trust,在侧栏中点击Network,展开后在点击Tunnel
Zero Trust Tunnel

Select your connector处选择Cloudflared,然后点击Next

填入一个名字,然后点击Save Tunnel。之后往下拉可以看到这个教程,里面可以复制的这一行中ek开头的就是当前Tunnel的Token,点击右边的复制按钮,然后把前面的指令都删掉,保留Token备用。
Tunnel Token

点击Public Hostname的tab,点击Add a public hostname,之后填入相应的信息。注意域名必须是停放到Cloudflare的才行。
Tunnel Token

下面Type那里HTTPHTTPS都是不需要访问者在本地安装Cloudflared客户端的。
Tunnel Token

完事后点击Save hostname即可。

注册服务

在面板中配置好Tunnel,就可以使用Tunnel的Token直接在本地Cloudflared中启动了。

输入

1
vim /etc/systemd/system/cloudflared.service

来创建一个systemd配置文件。

然后在配置文件中输入如下内容并保存

1
2
3
4
5
6
7
8
[Unit]
Description=Cloudflare Zero Trust Tunnel

[Service]
Type=simple
ExecStart=cloudflared tunnel --edge-ip-version auto --protocol http2 --heartbeat-interval 10s run --token <当前Tunnel的Token>
Restart=on-failure
RestartSec=15

其中,<当前Tunnel的Token>换成上面复制好的Tunnel的Token。

随后,重载systemd守护进程的配置文件:

1
systemctl daemon-reload

再打开Cloudflared服务即可:

1
systemctl start cloudflared

在浏览器或工具中访问你配置的域名即可。