如何通过Cloudflare Agrotunnel用单免费域名映射多端口服务
你可以通过Cloudflare Tunnel实现需求,不需要公网IP,免费额度完全覆盖个人使用场景,以下是从零开始的操作步骤:
前置检查
先确认两个本地应用运行正常:
- 本地浏览器访问
http://localhost:8081可以正常打开app1 - 本地浏览器访问
http://localhost:8082可以正常打开app2
方案一:固定域名访问(需免费注册Cloudflare账号,域名长期有效)
这个方案可以拿到固定的访问域名,重启服务也不会变,适合长期使用。
步骤1:安装Cloudflare Tunnel客户端(cloudflared)
根据自己的操作系统选对应安装方式:
- Windows:以管理员身份打开PowerShell,执行
winget install Cloudflare.cloudflared,等待自动安装完成即可 - macOS:打开终端执行
brew install cloudflared - Linux:通过系统对应包管理器搜索
cloudflared安装即可
安装完成后在终端执行cloudflared --version,正常输出版本号就说明安装成功。
步骤2:账号授权与隧道创建
- 终端执行
cloudflared tunnel login,命令执行后会自动唤起浏览器,跟着页面提示登录Cloudflare账号(注册完全免费),如果没有自有域名,开通账号后可以免费申请workers.dev后缀的二级子域名,不需要额外花钱买域名,授权时选这个域名即可。 - 授权完成后回到终端,执行命令创建自定义隧道,名称可以随便填,比如
local-web-apps:cloudflared tunnel create local-web-apps - 命令执行完成后,会输出一串格式类似
abc123def-4567-89gh-ij01-klmnopqrstuv的隧道ID,同时会显示凭证文件的本地存储路径(Windows一般在C:\Users\你的用户名\.cloudflared\<隧道ID>.json,macOS/Linux一般在~/.cloudflared/<隧道ID>.json),把这两个信息记下来,后面配置要用到。
步骤3:编写路由配置文件
找到cloudflared的默认配置目录,没有就手动新建:
- Windows:
C:\Users\你的用户名\.cloudflared\ - macOS/Linux:
~/.cloudflared/
在目录内新建名为config.yml的文件,根据自己想用的访问模式选配置:
模式A:子路径访问(同一个域名下用不同路径区分两个应用)
适合支持子路径部署的应用,配置内容如下,替换掉尖括号占位的内容:
tunnel: <刚才拿到的隧道ID> credentials-file: <刚才拿到的凭证文件完整路径> ingress: # 访问 域名/app1 下的所有请求,转发到本地8081的app1 - hostname: <你授权时选的域名> path: /app1/* service: http://localhost:8081 # 访问 域名/app2 下的所有请求,转发到本地8082的app2 - hostname: <你授权时选的域名> path: /app2/* service: http://localhost:8082 # 不符合上面规则的请求默认返回404 - service: http_status:404
注意:如果访问时出现静态资源加载失败、页面样式错乱,说明你的应用不支持部署在子路径下,换成下面的子域名模式即可,不需要修改应用本身的配置。
模式B:子域名访问(不同二级域名对应不同应用)
不需要应用支持子路径部署,兼容性更好,配置内容如下:
tunnel: <刚才拿到的隧道ID> credentials-file: <刚才拿到的凭证文件完整路径> ingress: # app1.你的域名 转发到本地8081 - hostname: app1.<你授权时选的域名> service: http://localhost:8081 # app2.你的域名 转发到本地8082 - hostname: app2.<你授权时选的域名> service: http://localhost:8082 # 兜底404 - service: http_status:404
步骤4:添加DNS解析
登录Cloudflare控制台,进入你选的域名的DNS管理页:
- 用子路径模式的话,添加一条CNAME记录,主机记录填
@,记录值填<你的隧道ID>.cfargotunnel.com,代理状态打开「已代理」 - 用子域名模式的话,添加两条CNAME记录,主机记录分别填
app1、app2,记录值都填<你的隧道ID>.cfargotunnel.com,代理状态都开「已代理」
步骤5:启动隧道
终端直接执行cloudflared tunnel run,看到日志输出Registered tunnel connection的成功提示,就说明隧道启动完成了。
直接在浏览器访问对应地址就能打开两个应用:
- 子路径模式:
https://你的域名/app1访问app1,https://你的域名/app2访问app2 - 子域名模式:
https://app1.你的域名访问app1,https://app2.你的域名访问app2
方案二:临时随机域名访问(无需注册账号,每次启动域名随机变化)
如果只是临时测试用,不想注册账号,可以用本地反代+快速隧道的方式,步骤更简单:
- 本地安装Nginx,配置Nginx监听比如8080端口,将
/app1路径的请求转发到http://localhost:8081,/app2路径的请求转发到http://localhost:8082,启动Nginx。 - 终端直接执行
cloudflared tunnel --url http://localhost:8080,等待几秒后终端会输出一个https://<随机字符串>.trycloudflare.com的临时地址,直接访问这个地址的/app1、/app2路径就能用两个应用。
注意:这个方案的域名是随机生成的,每次重启隧道都会变,只适合临时测试场景。
常见问题排查
- 访问报502错误:先检查本地8081、8082端口的应用是不是正常运行,再检查本地防火墙有没有拦截cloudflared的本地请求
- 子路径模式下页面错乱:换成子域名模式即可,是应用本身写死了根路径资源引用导致的
- 隧道启动报凭证错误:检查
config.yml里填的凭证文件路径是不是正确,Windows路径的反斜杠可以换成正斜杠避免转义问题
内容的提问来源于stack exchange,提问作者Anas S
相关产品推荐
相关产品推荐

