使用Cloudflare Tunnel免费实现n8n内网穿透与安全公网访问 📅 2026/8/24 12:54:17 在本地服务器上部署了强大的自动化工具 n8n却苦于无法从外网访问只能守着局域网使用每次想测试一个 Webhook 触发器都得把服务搬到公网服务器上既麻烦又增加了成本。如果你正在寻找一个稳定、免费且没有流量限制的内网穿透方案那么你来对地方了。本文将手把手带你使用 Cloudflare Tunnel为本地部署的 n8n 搭建一条安全、高速的“专属网络通道”。无需公网 IP无需配置复杂的路由器端口转发更无需担心第三方内网穿透工具突然收费或限速。我们将从 Docker Compose 部署 n8n 开始到 Cloudflare Zero Trust 的配置最终实现通过一个固定的自定义域名随时随地访问你的本地 n8n 服务。整个过程清晰完整代码和命令均可直接复制使用无论是自动化新手还是有一定基础的开发者都能轻松完成。1. 核心概念与方案选型在开始动手之前我们有必要厘清几个核心概念并理解为什么选择 Cloudflare Tunnel 这个方案。1.1 n8n 是什么n8n 是一个基于节点的、可扩展的工作流自动化工具。你可以把它理解为一个开源的、更强大、更灵活的“高级版 IFTTT”或“可自托管的 Zapier”。它通过将不同的应用和服务如 GitHub、Slack、Notion、数据库、Webhook 等连接成一个个可视化的工作流来自动化你的重复性任务。例如当你在 Trello 新建一个卡片时自动发送一条消息到 Discord 频道或者当收到一封特定主题的邮件时自动在 Google Sheets 中创建一条记录。由于其开源和可自托管的特性n8n 在数据隐私和定制化方面具有巨大优势吸引了众多开发者和企业用户。将其部署在本地服务器可以完全掌控自己的数据和自动化逻辑。1.2 为什么需要内网穿透当你将 n8n 部署在家庭网络、公司内网或没有公网 IP 的云服务器上时这个服务默认只能在同一个局域网内被访问。这带来了几个限制无法远程管理离开办公室或家就无法查看或编辑工作流。无法使用 Webhook许多服务如 GitHub、Stripe、飞书机器人需要通过公网可访问的 URL 来向你发送事件通知这是触发 n8n 工作流的关键方式。团队协作困难其他团队成员无法访问你本地部署的服务。内网穿透技术就是为了解决这个问题它能在你的本地服务和公网之间建立一个安全的隧道让公网流量可以“穿透”到内网访问你的服务。1.3 为什么选择 Cloudflare Tunnel市面上内网穿透工具很多如 ngrok、frp、cpolar 等。Cloudflare Tunnel曾用名 Argo Tunnel脱颖而出主要因为以下几点完全免费对于个人和小型项目Cloudflare Tunnel 提供的功能完全免费没有流量、连接数或隧道数量的硬性限制。安全可靠基于 Cloudflare Zero Trust 模型你的服务无需在公网暴露端口所有流量都通过加密隧道直达 Cloudflare 边缘网络再由 Cloudflare 转发到你的本地极大地减少了被攻击的风险。配置简单无需动态 DNS无需路由器设置通过一个命令行工具cloudflared即可轻松建立隧道。功能强大支持自定义域名、HTTPS自动管理 SSL 证书、访问策略可设置谁可以访问、负载均衡等。稳定高速依托 Cloudflare 全球庞大的边缘网络访问速度和稳定性有保障。综合来看Cloudflare Tunnel 是个人开发者和小团队将本地服务安全、免费地暴露到公网的首选方案。2. 环境准备与前置条件在开始部署前请确保你已满足以下条件并准备好相应的环境。2.1 基础环境要求一台本地服务器/电脑可以是你的开发机、家庭 NAS如群晖、树莓派或一台云上的虚拟机。本文以常见的 Linux 系统如 Ubuntu 22.04为例其他系统原理相通。已安装 Docker 和 Docker Compose这是部署 n8n 最推荐的方式。确保你的系统已安装 Docker Engine 和 Docker Compose V2。# 检查 Docker 版本 docker --version # 检查 Docker Compose 版本 (V2 命令为 docker compose) docker compose version如果未安装请参考 Docker 官方文档进行安装。对于 Ubuntu可快速执行# 安装 Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER newgrp docker # 或重新登录终端 # 安装 Docker Compose Plugin (V2) sudo apt-get update sudo apt-get install docker-compose-plugin一个域名你需要拥有一个域名例如yourdomain.com并将其 DNS 托管到 Cloudflare。这是使用 Cloudflare Tunnel 和自定义子域名的前提。如果你没有域名可以在 Namecheap、GoDaddy 等注册商购买一个。2.2 Cloudflare 账户准备访问 Cloudflare 官网 注册或登录账户。将你的域名添加到 Cloudflare。按照指引将你域名注册商处的 Nameserver 修改为 Cloudflare 提供的地址。这个过程通常需要几分钟到几小时生效。在 Cloudflare 仪表板中确保你的域名状态为“有效”DNS 记录管理已接管。完成以上准备后我们就可以开始正式的部署流程了。3. 使用 Docker Compose 部署 n8n我们首先在本地服务器上部署 n8n。使用 Docker Compose 可以一键式启动 n8n 及其可能依赖的数据库如 PostgreSQL管理起来非常方便。3.1 创建项目目录与配置文件在你的服务器上创建一个专门用于 n8n 的目录并创建docker-compose.yml文件。mkdir ~/n8n-docker cd ~/n8n-docker nano docker-compose.yml将以下配置内容粘贴到文件中。这个配置使用了官方镜像并将数据持久化到本地卷同时映射了容器的 5678 端口到宿主机的 5678 端口。version: 3.8 services: n8n: image: n8nio/n8n:latest restart: unless-stopped ports: - 127.0.0.1:5678:5678 # 仅映射到本地回环地址增强安全性 environment: - N8N_PROTOCOLhttp - N8N_HOSTlocalhost - N8N_PORT5678 - N8N_EDITOR_BASE_URLhttps://n8n.yourdomain.com # 稍后替换为你的隧道地址 - WEBHOOK_URLhttps://n8n.yourdomain.com # 稍后替换为你的隧道地址 - EXECUTIONS_DATA_PRUNEtrue - EXECUTIONS_DATA_MAX_AGE168 # 执行数据保留7天 - GENERIC_TIMEZONEAsia/Shanghai - N8N_USER_MANAGEMENT_DISABLEDfalse # 启用用户管理 - N8N_BASIC_AUTH_ACTIVEtrue # 启用基础认证可选但推荐 - N8N_BASIC_AUTH_USERadmin # 设置用户名 - N8N_BASIC_AUTH_PASSWORDYourSecurePassword123! # 设置强密码 volumes: - n8n_data:/home/node/.n8n networks: - n8n_network volumes: n8n_data: networks: n8n_network: driver: bridge关键配置解释ports: - 127.0.0.1:5678:5678将 n8n 容器的 5678 端口映射到宿主机的127.0.0.1:5678。这意味着 n8n 服务只监听本机内部网络外部甚至同一台机器的其他IP无法直接访问。这是安全最佳实践因为我们后续会用 Cloudflare Tunnel 来安全地暴露服务。N8N_EDITOR_BASE_URL和WEBHOOK_URL这两个环境变量至关重要。它们告诉 n8n 它对外提供服务的公共基础 URL。现在我们先填上占位符在配置好隧道并获得域名后需要回来修改此文件并重启服务。N8N_BASIC_AUTH_ACTIVE强烈建议启用基础认证为你的 n8n 实例添加一层用户名密码保护。volumes将/home/node/.n8n目录挂载到名为n8n_data的 Docker 卷确保工作流、凭证等数据在容器重启后不会丢失。3.2 启动 n8n 服务保存docker-compose.yml文件后在终端中执行以下命令启动服务cd ~/n8n-docker docker compose up -d-d参数表示在后台运行。使用以下命令查看日志确认服务启动成功docker compose logs -f n8n当你看到类似Server is listening on port 5678和Editor is now accessible via:的日志时说明 n8n 已在本地启动成功。此时你可以在服务器本机上打开浏览器访问http://127.0.0.1:5678来验证 n8n 是否正常运行。你应该能看到 n8n 的登录界面。使用配置文件中设置的用户名密码登录。重要因为我们只映射到了127.0.0.1所以你现在无法通过服务器的局域网 IP如http://192.168.1.100:5678访问它。这是预期的安全状态。4. 配置 Cloudflare Tunnel 实现内网穿透现在我们的 n8n 已经在本地安全地运行起来了。接下来我们要用 Cloudflare Tunnel 为它打开一扇通往公网的“安全门”。4.1 安装与登录 cloudflaredcloudflared是 Cloudflare 提供的命令行隧道客户端。下载安装在本地服务器上运行以下命令。# 下载最新版 cloudflared wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O cloudflared # 赋予执行权限 chmod x cloudflared # 移动到系统路径可选方便调用 sudo mv cloudflared /usr/local/bin/对于其他系统请参考 Cloudflare 官方文档 。登录 Cloudflare此操作会将你的cloudflared实例与你的 Cloudflare 账户关联。cloudflared tunnel login执行命令后它会提供一个 URL。在有图形界面并能打开浏览器的电脑上访问这个 URL比如你的个人电脑选择你要为哪个域名创建隧道即你托管在 Cloudflare 上的域名然后授权。授权成功后会在你的服务器上生成一个证书文件通常位于~/.cloudflared/cert.pem。4.2 创建并配置隧道创建隧道为你的 n8n 服务创建一个隧道并给它起个名字例如n8n-tunnel。cloudflared tunnel create n8n-tunnel命令成功后会输出隧道的 UUID一长串字符和其配置文件路径。记下这个 UUID。配置路由在 Cloudflare 面板操作登录 Cloudflare 仪表板进入你的域名。点击左侧菜单“Zero Trust”。在 Zero Trust 面板中进入“Access” - “Tunnels”。你应该能看到刚刚创建的n8n-tunnel。点击它进入配置页面。在“Public Hostname”标签页下点击“Add a public hostname”。进行如下配置Subdomain: 填写你想要的子域名例如n8n。Domain: 选择你托管在 Cloudflare 的域名。Path: 留空除非你想把 n8n 放在子路径下。Service: 选择“HTTP”并在 URL 栏填写http://localhost:5678。这正是我们之前 Docker Compose 映射的地址。点击“Save hostname”。 至此Cloudflare 端已经知道所有发送到https://n8n.yourdomain.com的流量都应该通过n8n-tunnel转发到你本地服务器的localhost:5678。4.3 配置本地隧道并运行现在我们需要在本地服务器上配置cloudflared告诉它如何连接这个隧道和服务。编辑配置文件配置文件通常位于~/.cloudflared/config.yml。如果不存在就创建它。nano ~/.cloudflared/config.yml输入配置内容tunnel: YOUR_TUNNEL_UUID # 替换为你的隧道 UUID credentials-file: /home/your_username/.cloudflared/YOUR_TUNNEL_UUID.json # 替换为你的证书文件路径通常在上一步创建隧道时生成 ingress: - hostname: n8n.yourdomain.com # 替换为你在 Cloudflare 面板设置的主机名 service: http://localhost:5678 - service: http_status:404 # 默认规则匹配不到上述规则时返回404注意请务必将YOUR_TUNNEL_UUID、文件路径和hostname替换成你自己的信息。credentials-file的路径可以在执行tunnel create命令后的输出中找到。运行隧道cloudflared tunnel run n8n-tunnel如果看到INF Connection XXXX registered connIndex0 locationXXX等类似日志说明隧道连接成功。为了让隧道在后台持续运行我们可以将其配置为系统服务# 安装系统服务 sudo cloudflared service install # 启动服务 sudo systemctl start cloudflared # 设置开机自启 sudo systemctl enable cloudflared # 查看服务状态 sudo systemctl status cloudflared5. 更新 n8n 配置并验证隧道已经建立但还记得我们之前在docker-compose.yml里留下的占位符吗现在需要更新它让 n8n 知道它正确的公网访问地址。5.1 修改 n8n 环境变量编辑~/n8n-docker/docker-compose.yml文件将N8N_EDITOR_BASE_URL和WEBHOOK_URL环境变量中的https://n8n.yourdomain.com替换为你实际配置的隧道地址必须完全一致包括https://。environment: - N8N_PROTOCOLhttp - N8N_HOSTlocalhost - N8N_PORT5678 - N8N_EDITOR_BASE_URLhttps://n8n.yourdomain.com # 已更新 - WEBHOOK_URLhttps://n8n.yourdomain.com # 已更新 # ... 其他环境变量保持不变5.2 重启 n8n 容器配置修改后需要重启 n8n 服务使其生效。cd ~/n8n-docker docker compose down docker compose up -d5.3 完整功能验证现在进行最终的验证公网访问在你任何能上网的设备上比如手机蜂窝网络打开浏览器访问https://n8n.yourdomain.com。你应该能看到 n8n 的登录页面。使用之前设置的用户名密码登录并正常使用编辑器。这证明内网穿透成功。Webhook 测试这是关键一步。在 n8n 编辑器中创建一个新的工作流。添加一个“Webhook”节点选择 “GET” 或 “POST” 方法然后点击 “Listen for test event” 旁边的“Test”按钮。n8n 会生成一个测试 URL形如https://n8n.yourdomain.com/webhook-test/xxxxx。复制这个 URL在新的浏览器标签页或使用curl命令访问它。curl https://n8n.yourdomain.com/webhook-test/xxxxx回到 n8n 编辑器你应该能看到 Webhook 节点成功接收到了请求并显示了请求数据。这证明 Webhook 功能在公网环境下完全正常可以被 GitHub、飞书等外部服务调用。6. 常见问题与深度排查在部署过程中你可能会遇到一些问题。以下是常见问题的排查思路。6.1 隧道连接失败现象cloudflared tunnel run命令报错或sudo systemctl status cloudflared显示服务失败。排查检查网络确保你的服务器可以正常访问互联网特别是能连接 Cloudflare 的服务器。检查证书确认config.yml中的credentials-file路径正确且文件存在。可以尝试重新登录cloudflared tunnel login。检查隧道 UUID确认config.yml中的tunnel值是否正确。可以使用cloudflared tunnel list查看所有隧道及其 UUID。查看详细日志运行sudo journalctl -u cloudflared -f查看系统服务的实时日志通常会有更具体的错误信息。6.2 能访问登录页但 Webhook 报错 404/500现象可以通过域名打开 n8n 界面但测试 Webhook 或外部服务调用 Webhook 时返回 404 Not Found 或 500 Internal Server Error。排查检查WEBHOOK_URL这是最常见的原因。确保docker-compose.yml中的WEBHOOK_URL环境变量已正确设置为你的隧道域名https://n8n.yourdomain.com并且已经重启了 n8n 容器。n8n 在启动时读取这个变量来注册 Webhook 路径。检查隧道配置确认 Cloudflare Zero Trust 面板中隧道配置的 Service URL 是http://localhost:5678没有多余的路径。检查 n8n 日志运行docker compose logs -f n8n在触发 Webhook 时观察 n8n 容器是否有相关错误日志。6.3 访问速度慢或延迟高现象通过隧道访问 n8n 界面操作卡顿。分析Cloudflare Tunnel 的流量路径是用户 - Cloudflare 全球边缘节点 - 隧道 - 你的本地服务器。延迟主要取决于你的服务器到最近 Cloudflare 节点的网络质量以及节点到你本地的隧道连接质量。优化建议确保服务器本身网络稳定。Cloudflare 会根据你的服务器 IP 自动分配最优入口点通常无需手动干预。6.4 Docker Compose 启动失败现象执行docker compose up -d后服务很快退出。排查检查端口占用确认本地 5678 端口没有被其他程序占用。sudo lsof -i:5678。检查卷权限如果使用 Docker 卷或挂载本地目录确保 Docker 进程有读写权限。可以尝试先不挂载卷启动以排除权限问题。查看错误日志docker compose logs n8n会输出容器停止前的日志是定位问题的关键。7. 安全加固与生产环境最佳实践将本地服务暴露到公网安全是重中之重。遵循以下最佳实践可以极大提升你的 n8n 实例的安全性。7.1 启用强制 HTTPS 与严格 SSL 模式在 Cloudflare 仪表板中进入你的域名下的“SSL/TLS”设置。概述确保 SSL/TLS 加密模式为“完全严格”。这确保了从 Cloudflare 到你的cloudflared隧道之间的连接也是加密的。边缘证书开启“始终使用 HTTPS”选项将所有 HTTP 请求强制重定向到 HTTPS。7.2 配置访问策略零信任Cloudflare Zero Trust 的核心功能之一就是可以设置谁可以访问你的应用。即使别人知道了你的域名没有通过策略验证也无法访问。在 Zero Trust 面板进入“Access” - “Applications”。点击“Add an application”选择“Self-hosted”。在配置页面Application URL: 填写https://n8n.yourdomain.com。Policy Name: 例如 “Allow My Team”。Configure policies: 添加规则。例如Include:Emails ending in yourcompany.com(允许公司邮箱)。或者Include:Emails-your_personal_emailgmail.com(允许特定个人邮箱)。更安全的做法是使用“Service Auth”或“Mutual TLS”等更强大的验证方式。保存后再次访问你的 n8n 域名就会先跳转到 Cloudflare 的认证页面只有满足策略的用户才能看到 n8n 的登录界面。这为你的自动化平台增加了至关重要的第一道安全门。7.3 n8n 实例安全设置强密码为N8N_BASIC_AUTH_USER和N8N_BASIC_AUTH_PASSWORD设置高强度、唯一的密码。定期更新定期更新 n8n Docker 镜像 (docker compose pull)以获取安全补丁和新功能。备份数据定期备份 Docker 卷n8n_data中的数据。你可以使用docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar czf /backup/n8n_backup_$(date %Y%m%d).tar.gz -C /data .等命令进行备份。限制执行权限在 n8n 工作流中谨慎使用能执行系统命令或访问敏感资源的节点。遵循最小权限原则。7.4 监控与维护日志监控定期检查cloudflared和n8n的日志查看有无异常连接或错误。资源使用使用docker stats监控 n8n 容器的 CPU、内存使用情况。隧道稳定性将cloudflared配置为系统服务并启用自启可以保证隧道在服务器重启后自动恢复。考虑使用systemd的Restartalways策略。通过以上步骤你不仅成功地将本地 n8n 服务通过 Cloudflare Tunnel 安全地暴露到了公网还实施了一系列生产级别的安全加固措施。这个组合方案为你提供了一个免费、稳定、安全且功能强大的自托管自动化平台解决方案。现在你可以放心地在外网管理你的工作流并让各种在线服务通过 Webhook 来触发它们了。