You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Heroku上运行CloudFlare Argo客户端cloudflared?含端口安全配置

在Heroku上运行Cloudflare Argo客户端cloudflared并限制端口访问

我来一步步帮你搞定在Heroku上部署cloudflared,同时确保Web dyno的$PORT只接受来自本地cloudflared的请求,拒绝外部直接访问:

1. 准备工作与Heroku应用设置

首先确保你已经安装了Heroku CLI并完成登录:

heroku login
  • 创建一个新的Heroku应用(或使用现有应用):
    heroku create your-preferred-app-name
    
  • 添加cloudflared的Heroku Buildpack,这样Heroku会自动安装cloudflared客户端:
    heroku buildpacks:add https://github.com/cloudflare/heroku-buildpack-cloudflared.git
    
    如果你有Web应用的语言Buildpack(比如Node.js、Python),也要添加对应的(比如heroku buildpacks:add heroku/nodejs),顺序不影响,但建议先加语言Buildpack。

2. 配置cloudflared隧道

2.1 获取Cloudflare隧道凭证

  • 登录Cloudflare后台,创建一个新的Argo隧道,获取隧道的Token(不要用JSON文件,Heroku环境用Token更方便)。
  • 将Token添加到Heroku环境变量:
    heroku config:set CLOUDFLARED_TUNNEL_TOKEN=your-tunnel-token-here
    

2.2 创建cloudflared配置文件

在你的项目根目录创建config.yml,内容如下(替换占位符为你的实际信息):

tunnel: your-tunnel-id  # 从Cloudflare隧道详情页获取
credentials-file: /app/.cloudflared/your-tunnel-id.json
ingress:
  - hostname: your-custom-domain.example.com  # 你绑定到隧道的Cloudflare域名
    service: http://127.0.0.1:$PORT  # 指向本地Web服务的端口
  - service: http_status:404  # 匹配不到的请求返回404

注意:credentials-file的路径是固定的,因为Heroku上cloudflared会自动将Token转换为JSON凭证并存放在这个位置。

3. 配置Web服务绑定本地地址

这是实现拒绝非本地流量的核心步骤:让你的Web应用只监听127.0.0.1而非0.0.0.0,这样只有Heroku dyno内部的cloudflared能访问它,外部直接访问Heroku的域名/IP会被拒绝。

举几个常见框架的配置例子:

  • Node.js/Express:
    const express = require('express');
    const app = express();
    const port = process.env.PORT || 3000;
    
    app.listen(port, '127.0.0.1', () => {
      console.log(`Server running on http://127.0.0.1:${port}`);
    });
    
  • Python Flask:
    from flask import Flask
    import os
    
    app = Flask(__name__)
    port = int(os.environ.get('PORT', 5000))
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=port)
    
  • Django:
    在启动命令中指定本地地址:
    python manage.py runserver 127.0.0.1:$PORT
    

4. 创建Procfile指定启动命令

在项目根目录创建Procfile(无后缀),内容如下:

web: cloudflared tunnel --config config.yml run

这个命令会告诉Heroku启动Web dyno时运行cloudflared隧道,同时你的语言Buildpack会自动启动Web服务(比如Node.js会执行npm start)。

5. 部署并验证

  • 将所有文件提交到Git并推送到Heroku:
    git init
    git add .
    git commit -m "Deploy cloudflared and web app"
    git push heroku main
    
  • 启动Web dyno:
    heroku ps:scale web=1
    

验证效果

  • 直接访问Heroku分配的应用域名(比如your-preferred-app-name.herokuapp.com):应该会出现连接失败或拒绝访问的提示。
  • 访问你绑定的Cloudflare域名(your-custom-domain.example.com):可以正常通过隧道访问你的Web服务。

内容的提问来源于stack exchange,提问作者Eliot Sykes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:34