如何在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客户端:
如果你有Web应用的语言Buildpack(比如Node.js、Python),也要添加对应的(比如heroku buildpacks:add https://github.com/cloudflare/heroku-buildpack-cloudflared.githeroku 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
相关产品推荐
相关产品推荐

