前言

传统方式暴露VPS上的服务需要开放端口、配置防火墙、申请SSL证书,步骤繁琐且有安全风险。Cloudflare Tunnel是Cloudflare提供的免费隧道服务,可以将VPS上的本地服务通过Cloudflare网络安全地暴露到互联网上,不需要开放任何端口,还自动获得DDoS防护和SSL证书。本文教你如何在VPS上配置Cloudflare Tunnel。

一、Cloudflare Tunnel的优势

  • 无需开放端口:服务通过出站连接暴露,防火墙不需要开放任何入站端口
  • 自动HTTPS:自动获取SSL证书,无需手动配置
  • DDoS防护:流量经过Cloudflare网络,自动获得企业级DDoS防护
  • 隐藏真实IP:对外只暴露Cloudflare的IP,保护VPS真实IP
  • 免费使用:Cloudflare免费计划即可使用
  • 支持任意TCP/UDP服务:不只是HTTP,还可以暴露SSH、数据库等

二、准备工作

  1. 一个域名,已托管到Cloudflare(NS指向Cloudflare)
  2. 一个Cloudflare账号(免费注册即可)
  3. VPS上安装好需要暴露的服务(如网站、面板等)

三、安装cloudflared

cloudflared是Cloudflare Tunnel的客户端工具。

Debian/Ubuntu

# 下载并安装
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# 验证安装
cloudflared --version

CentOS/RHEL

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -i cloudflared-linux-x86_64.rpm

通用二进制

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared

四、创建Tunnel

方式一:通过Cloudflare Dashboard创建(推荐新手)

1. 登录Cloudflare Zero Trust

访问 https://one.dash.cloudflare.com ,使用你的Cloudflare账号登录。

2. 创建Tunnel

  1. 左侧菜单 > Networks > Tunnels
  2. 点击 “Create a tunnel”
  3. 选择 “Cloudflared” 类型
  4. 为Tunnel取一个名称,如 my-vps
  5. 点击 “Save tunnel”

3. 安装connector

Dashboard会显示一条安装命令,复制并在VPS上执行:

cloudflared service install eyJhIjoixxxxx...很长的token...

执行后cloudflared会作为系统服务自动运行。

4. 配置公共主机名

在Dashboard的 “Public Hostname” 部分添加:

设置项
Subdomainblog(或其他子域名)
Domainyourdomain.com
Service TypeHTTP
Service URLlocalhost:80

点击保存后,blog.yourdomain.com 就会通过Tunnel指向VPS上的 localhost:80

方式二:通过命令行创建

1. 登录Cloudflare

cloudflared tunnel login

浏览器会打开Cloudflare授权页面,选择你的域名并授权。

2. 创建Tunnel

# 创建Tunnel
cloudflared tunnel create my-vps

# 查看已创建的Tunnel
cloudflared tunnel list

3. 配置路由

# 将域名指向Tunnel
cloudflared tunnel route dns my-vps blog.yourdomain.com

4. 创建配置文件

mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml
tunnel: my-vps
credentials-file: /root/.cloudflared/<tunnel-id>.json

ingress:
  # 博客网站
  - hostname: blog.yourdomain.com
    service: http://localhost:80
  # 管理面板(如1Panel)
  - hostname: panel.yourdomain.com
    service: http://localhost:8888
  # SSH访问
  - hostname: ssh.yourdomain.com
    service: ssh://localhost:22
  # 其他TCP服务
  - hostname: db.yourdomain.com
    service: tcp://localhost:3306
  # 兜底规则(必须放在最后)
  - service: http_status:404

5. 测试并启动

# 测试配置
cloudflared tunnel ingress validate

# 测试运行
cloudflared tunnel run my-vps

# 安装为系统服务(开机自启)
cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

五、通过Tunnel访问SSH

Cloudflare Tunnel支持暴露SSH服务,让你可以通过域名安全地SSH连接VPS。

配置Tunnel端

在config.yml中已包含SSH服务配置:

- hostname: ssh.yourdomain.com
  service: ssh://localhost:22

配置客户端

在你本地电脑上安装cloudflared,然后配置SSH:

编辑 ~/.ssh/config

Host yourdomain.com
    ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
    User root
    Port 22

然后直接SSH连接:

ssh yourdomain.com

首次连接会打开浏览器进行Cloudflare身份验证。

这种方式的好处是SSH端口不需要对公网开放,所有连接都经过Cloudflare的零信任认证。

六、高级配置

保护敏感服务

对于管理面板等敏感服务,可以在Cloudflare Zero Trust中配置访问策略:

  1. 进入 Access > Applications
  2. 创建Application,关联你的Tunnel域名
  3. 配置策略:要求邮箱验证、IP白名单等
# config.yml - 使用Cloudflare Access保护
ingress:
  - hostname: panel.yourdomain.com
    service: http://localhost:8888
    originRequest:
      noTLSVerify: true

暴露多个服务

一个Tunnel可以暴露多个服务,每个服务使用不同的子域名:

ingress:
  - hostname: blog.yourdomain.com
    service: http://localhost:80
  - hostname: cloud.yourdomain.com
    service: http://localhost:8080
  - hostname: monitor.yourdomain.com
    service: http://localhost:3001
  - hostname: panel.yourdomain.com
    service: http://localhost:8888
  - service: http_status:404

使用Path路径区分服务

也可以用路径区分同一域名下的不同服务:

ingress:
  - hostname: app.yourdomain.com
    path: /api/*
    service: http://localhost:3000
  - hostname: app.yourdomain.com
    service: http://localhost:8080
  - service: http_status:404

七、管理与维护

# 查看Tunnel状态
sudo systemctl status cloudflared

# 查看日志
sudo journalctl -u cloudflared -f

# 重启服务
sudo systemctl restart cloudflared

# 更新cloudflared
sudo cloudflared update
sudo systemctl restart cloudflared

八、常见问题

Tunnel连接后服务访问很慢?

Cloudflare免费计划不保证速度。可以在Cloudflare Dashboard中切换不同的Cloudflare数据中心节点试试。部分地区的Cloudflare节点到国内速度一般,可以搭配优选IP使用。

可以不用Cloudflare Tunnel暴露服务吗?

可以。传统方式是直接开放端口+Nginx反代+Let’s Encrypt证书。Cloudflare Tunnel的优势在于不需要开端口、自动HTTPS、隐藏真实IP。如果你的VPS本身就有公网IP且不怕暴露,直接用Nginx反代也可以。

Tunnel断线怎么办?

cloudflared安装为系统服务后会自动重连。如果频繁断线,检查VPS网络是否稳定。可以在config.yml中添加:

retries: 5

和Nginx反代冲突吗?

不冲突。很多场景下Nginx反代和Cloudflare Tunnel可以配合使用:Tunnel负责暴露到外网,Nginx负责本地的反代和负载均衡。

总结

Cloudflare Tunnel是暴露VPS服务的最佳方式之一,不需要开放端口、自动获得HTTPS和DDoS防护,安全性和便利性都远超传统方案。对于刚买便宜VPS的新手来说,Cloudflare Tunnel省去了配置防火墙、申请证书等繁琐步骤,几分钟就能让服务安全上线。