使用 Cloudflare 提供的 Tunnel 服务进行内网穿透。
优劣比较
优点
不需要自建服务器;免费;带宽很高;可以跨运营商;不必在客户端上安装软件;无需备案;支持HTTP3/QUIC;不限服务数量。
缺点
延迟高抖动高(免费版的Cloudflare隧道服务器都在国外);国内暂不支持HTTP3/QUIC;暂不支持UDP;~需要自己有域名且~需要将域名托管在Cloudflare。
安装 cloudflared
这里介绍两种安装 cloudflared 的方式,分别对应不同场景,~建议优先采用通过软件源安装方式~,建议优先采用deb
包的方式安装。
通过软件源安装
以 Ubuntu 20.04 LTS 为例。
国内通过这一方式安装速度较慢,故不再推荐该方式。
# Centos
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-fips-linux-x86_64.rpm && yum -y install cloudflared-fips-linux-x86_64.rpm
通过软件包/二进制文件安装
现在通过
deb
包安装的cloudflared
也能通过apt
服务更新了(会自动添加Key和source到系统中)。
打开 Release 页面并选择对应架构和操作系统的deb、rpm包或二进制文件下载即可。
手动更新:cloudflared update
。
配置内网穿透
登录到 Cloudflare Tunnel
cloudflared tunnel login
执行后若安装正确则会出现一个登录URL,将该链接复制到任何设备的任何浏览器中登录并选择你想用于内网穿透的域名即可。
成功后会生成证书,放置于~/cloudflared/cert.pem
中。
创建隧道
cloudflared tunnel create Tunnel-NAME
<Tunnel-NAME>
即为隧道名称,随便起就可以。
创建配置文件
配置文件的保存位置一般是~/.cloudflared/config.yml
,也可以自定义随便在哪都可以。
示例配置文件:
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
protocol: http2
originRequest:
connectTimeout: 30s
noTLSVerify: false
ingress:
- hostname: gitlab.widgetcorp.tech
service: http://localhost:80
- hostname: gitlab-ssh.widgetcorp.tech
service: ssh://localhost:22
- service: http_status:404
其中ingress
字段可以创建多个服务,支持的服务类型如下表,新建其他服务前需要到 Cloudflare 控制台对其他子域名进行解析。
服务名称 | 描述 | service 示例值 |
---|---|---|
HTTP/S | 常规网页服务 | https://localhost:8000 |
TCP | TCP 连接 | tcp://localhost:25565 |
SSH | SSH 连接 | ssh://localhost:22 |
RDP | 远程桌面(RDP) | rdp://localhost |
上表转自 Cloudflare 官方文档,仅节选常用协议,若需要完整版请至 Ingress rules 页面查看。
将隧道解析到域名上
cloudflared tunnel route dns Tunnel-NAME SUBDOMAIN
<Tunnel-NAME>
填写刚才创建的隧道,<SUBDOMAIN>
填写你想用于内网穿透的子域名(该子域名无需提前创建),执行后会自动将隧道解析到该子域名上。
举例:在刚才的配置文件中配置了两个服务,就需要运行两次:
cloudflared tunnel route dns Tunnel-NAME gitlab.widgetcorp.tech
cloudflared tunnel route dns Tunnel-NAME gitlab-ssh.widgetcorp.tech
手动解析其他子域名
打开 Cloudflare 控制台 ,点击左侧网站
,点击对应的域名,左侧DNS
,找到刚才设置的子域名,将之前自动设置的子域名的解析内容复制到新子域名上就可以。
试运行
cloudflared --config <config-File> tunnel run Tunnel-NAME
# 例:cloudflared --config /root/.cloudflared/config.yml tunnel run mytun
随后稍等一分钟左右,在其他设备上访问刚才解析的子域名测试即可。
注册为系统服务(方式一 自动安装)
rm -rf /etc/cloudflared/config.yml
cloudflared --config ~/.cloudflared/config.yml service install
systemctl enable cloudflared
systemctl start cloudflared
systemctl status cloudflared
注册为系统服务(方式二 Systemd)
在/etc/systemd/system
下创建cloudflared.service
文件:
[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
ExecStart=cloudflared --config /root/.cloudflared/config.yml tunnel run 你的Tunnel-NAME
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
保存退出后systemctl enable cloudflared
加入开机启动,systemctl start cloudflared
启动服务。
查询日志:journalctl -a -u cloudflared
。
部分服务(ingress)配置示例
VNC
这里以RealVNC Server为例。
- hostname: vnc.example.com
service: tcp://localhost:5900
参考资料
- Cloudflare 隧道内网穿透搭建记录
- CloudFlare Argo Tunnel教程
- Ingress rules
- Add non-HTTP applications
- cloudflared
- Cloudflare Package Repository