Cloudflare tunnel 内网穿透
Cloudflare 实现内网穿透主要通过其 Cloudflare Tunnel(也叫 Argo Tunnel)功能来实现。它允许你在不暴露公共 IP 的情况下,将本地服务器或应用暴露到互联网上,从而实现内网穿透。以下是 Cloudflare Tunnel 的基本工作原理和步骤:
工作原理:
- Cloudflare Tunnel 创建了一个从本地服务器到 Cloudflare 的加密隧道。你的应用或服务运行在内网中,但它通过这个隧道连接到 Cloudflare 的网络。
- Cloudflare 网络 接收到来自用户请求的流量,然后转发到本地服务器。
- 用户与本地服务进行交互时,数据流经过加密隧道传输,从而避免了暴露内网 IP 地址和端口。
实现步骤:
注册 Cloudflare 账户并添加域名:
- 如果还没有 Cloudflare 账户,首先去 Cloudflare 官网 注册一个。
- 在 Cloudflare 控制面板中点击”添加站点”,输入你的域名。
- 选择计划(Free 即可),Cloudflare 会自动扫描现有 DNS 记录。
- 到你的域名注册商处,将域名的 nameserver 修改为 Cloudflare 提供的两个 nameserver 地址。
- 等待 DNS 生效(通常几分钟到数小时),Cloudflare 控制面板中站点状态变为”Active”即表示域名已成功接入。
- 这一步是后续所有操作的前提,必须先完成。
安装 Cloudflare Tunnel 客户端:
- 在你的本地服务器上安装
cloudflared客户端。你可以通过 Cloudflare 的官方文档 了解详细的安装过程。大致步骤:- 在 Linux 上,你可以使用以下命令:对于没有sudo权限的普通用户
1
2wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb1
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 - 也可以在 macOS、Windows 等其他平台上进行类似安装。
- 在 Linux 上,你可以使用以下命令:
- 在你的本地服务器上安装
认证 Cloudflare Tunnel:
- 在服务器上运行以下命令,进行认证:
1
cloudflared tunnel login - 该命令会打开一个浏览器窗口,要求你登录到 Cloudflare 账户并授权。
- 在服务器上运行以下命令,进行认证:
创建 Tunnel:
- 创建一个新的 Tunnel:
1
cloudflared tunnel create <tunnel-name> - 这会生成一个隧道 ID 和证书文件。
- 创建一个新的 Tunnel:
配置 DNS 路由:
- 需要将你的域名指向刚创建的 Tunnel,有两种方式:
- 方式一:通过 cloudflared 命令自动添加 CNAME 记录(推荐)这会自动在 Cloudflare DNS 中添加一条 CNAME 记录,将
1
cloudflared tunnel route dns <tunnel-name> example.comexample.com指向你的 Tunnel。 - 方式二:在 Cloudflare 控制面板手动添加 CNAME 记录
- 登录 Cloudflare 控制面板,进入域名的 DNS 设置页面。
- 添加一条 CNAME 记录:Name 填
tunnel(或子域名),Target 填<tunnel-id>.cfargotunnel.com。 - 保存后等待 DNS 记录生效。
配置 Tunnel 代理并启动:
- 设置隧道代理,通常是在本地应用监听的端口上。例如,如果你的服务在
localhost:8080上运行,可以使用以下命令将流量通过隧道转发:1
cloudflared tunnel --url http://localhost:8080 - 或者也可以直接更改配置文件
~/.cloudflared/config.yml:1
2
3
4
5
6
7tunnel: 6bc4c976-1c0c-45a4-bab0-93b7eed4e1d1 # 你的 Tunnel ID
credentials-file: $HOME/.cloudflared/6bc4c976-1c0c-45a4-bab0-93b7eed4e1d1.json
ingress:
- hostname: example.com
service: http://localhost:8080 # 你的 Web 服务监听端口
- service: http_status:404 - 然后运行:
1
cloudflared tunnel run <tunnel-name> - 此时,你的本地服务就已经通过 Cloudflare Tunnel 暴露到互联网上了。
- 设置隧道代理,通常是在本地应用监听的端口上。例如,如果你的服务在
持久化服务(使用 systemd)
以上步骤中运行
cloudflared tunnel run的方式在终端退出后就会停止,为了让服务在后台持续运行,可以使用 systemd 来管理。方法一:使用 systemd 用户级服务(无需 sudo)
如果你没有 sudo 权限,可以使用 systemd 的用户级服务来管理 cloudflared。
创建用户级服务目录和服务文件
1
2mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/cloudflared-tunnel.service服务文件内容
将以下内容复制到文件中,注意替换<tunnel-name>为你的隧道名称,<your-username>为你的用户名:1
2
3
4
5
6
7
8
9
10
11
12
13
14[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
Type=simple
ExecStart=/home/<your-username>/cloudflared tunnel run <tunnel-name>
Restart=always
RestartSec=5
# 可选:指定配置文件
Environment=CLOUDFLARED_CONFIG=/home/<your-username>/.cloudflared/config.yml
[Install]
WantedBy=default.target启用并启动服务
依次执行以下命令(无需 sudo):1
2
3
4
5
6
7
8
9# 重新加载 systemd 用户级配置
systemctl --user daemon-reload
# 启用开机自启(需要先执行 loginctl enable-linger)
loginctl enable-linger $(whoami)
systemctl --user enable cloudflared-tunnel.service
# 启动服务
systemctl --user start cloudflared-tunnel.service注意:
loginctl enable-linger确保用户不登录时用户级服务也能继续运行,否则用户退出登录后服务会停止。之后,可以使用以下命令检查服务状态和日志:
1
2
3
4
5# 检查状态
systemctl --user status cloudflared-tunnel.service
# 查看日志
journalctl --user -u cloudflared-tunnel.service -f方法二:使用 systemd 系统级服务(需要 sudo)
创建服务文件
使用文本编辑器创建服务文件:1
sudo nano /etc/systemd/system/cloudflared-tunnel.service服务文件内容
将以下内容复制到文件中,注意替换<tunnel-name>为你的隧道名称:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/cloudflared tunnel run <tunnel-name>
Restart=always
RestartSec=5
# 可选:设置环境变量
Environment=TUNNEL_ORIGIN_CERT=/path/to/cert.pem
# 可选:指定配置文件
Environment=CLOUDFLARED_CONFIG=/path/to/config.yml
[Install]
WantedBy=multi-user.target启用并启动服务
依次执行以下命令:1
2
3
4
5
6
7
8# 重新加载 systemd
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable cloudflared-tunnel.service
# 启动服务
sudo systemctl start cloudflared-tunnel.service之后,可以使用以下命令检查服务状态和日志:
1
2
3
4
5# 检查状态
sudo systemctl status cloudflared-tunnel.service
# 查看日志
sudo journalctl -u cloudflared-tunnel.service -f
启用 “Always Use HTTPS” 设置
Cloudflare 提供了一个非常简单的方法来自动将所有 HTTP 流量重定向到 HTTPS:通过 “Always Use HTTPS” 选项。这是最直接的方式,适用于大多数场景。
操作步骤:
- 登录到你的 Cloudflare 控制面板。
- 选择你要配置的域名。
- 进入 “SSL/TLS” 设置页面。
- 在页面顶部,点击 “Edge Certificates” 选项卡。
- 向下滚动,找到 “Always Use HTTPS” 设置。
- 开启这个选项,将所有的 HTTP 请求自动重定向到 HTTPS。
优点:
- 安全性高:内网不需要暴露在公网,只通过加密隧道进行通信。
- 无公网 IP:适用于没有固定公网 IP 的环境。
- 简化配置:不需要复杂的端口映射或 NAT 配置。
注意:
- Cloudflare Tunnel 是一种基于 Cloudflare 的服务,因此需要有一个 Cloudflare 账户,并且 DNS 需要指向 Cloudflare 才能使用。
- 可能会有流量限制或费用问题,特别是在高流量场景下。
这种方式的好处是可以轻松实现内网穿透,并且利用 Cloudflare 的全球加速和安全防护功能,使你的应用更加可靠和安全。如果有其他问题,或对某些配置有疑问,欢迎继续提问!