在此之前
大家可以先去看看项目。
https://github.com/cloudflare/cloudflared
事先声明,本人使用Ubuntu2204系统搭建,理论上适合Debian系Linux系统(Redhat系需要修改相关命令)。其他系统请参考官方文档。
https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/local/
我们需要拥有一个域名,并将域名绑定在Cloudflare上。当然一台Linux电脑是不能缺少的。
下面教程正式开始:
安装
翻阅官方文档,决定使用相对简单的安装方法,同时也便于后续的维护更新。
添加Cloudflare存储库来安装。
# 添加 cloudflare gpg 密钥
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
# 添加到apt 存储库
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared buster main' > /etc/apt/sources.list.d/cloudflared.list
#安装 cloudflared
sudo apt-get update && sudo apt-get install cloudflared
身份验证和域名绑定
使用命令:
cloudflared tunnel login
点击跳转绑定相应域名
完成验证之后会在目录/root/.cloudflared/下生成账号证书文件。
创建隧道
注:一个隧道只能代理一个服务
使用命令
cloudflared tunnel create <NAME>
如下:
图中需要记住id后面那一串字符串,它就是后面会提到的<Tunnel-UUID>
通过一下命令来查看隧道是否创建成功:
cloudflared tunnel list
如:
如果需要删除隧道可以使用命令
cloudflared tunnel delete <NAME>
配置文件
登录Cloudflare新建相应dns记录如下
内容那一项<Tunnel-UUID>.cfargotunnel.com。如果不知道<Tunnel-UUID>的,上面有介绍。
也可以使用命令行来添加dns记录
cloudflared tunnel route dns <Tunnel-NAME> <SUBDOMAIN>
<SUBDOMAIN>为你想用来做内网穿透的域名,如:www.abc.com.
成功后会创建CNAME记录将域名指向隧道。
新建配置文件
nano /root/.cloudflared/config.yml
内容如下:
tunnel: <隧道名>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json #<Tunnel-UUID>修改为自己的
ingress:
- hostname: #自定义的域名
service: http://localhost:5244 #需要代理服务的端口
- service: http_status:404
运行
使用如下命令:
cloudflared tunnel run <NAME>
如果上面都没问题,运行后等待一会就可以使用域名访问服务了。
进阶
注册为系统服务
命令:
#服务名随便填写,自己记得住就行
nano /etc/systemd/system/cloudflared.service
内容:
[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
ExecStart=cloudflared --config <config-File> tunnel run <Tunnel-NAME>
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
<config-file>文件位置默认为/root/.cloudflared/<Tunnel-UUID>.json #<Tunnel-UUID>修改为自己的
<Tunnel-UUID>不多赘述
其他system你不多赘述,自行百度。
如有问题,可以在评论区提出。