本文更新于:2026-11-09。Cloudflare 的 Tunnel、DNS 和规则页面已有调整,本文按当前界面与官方文档更新。
家里的 NAS、路由器和 MoviePilot 都配置好了,出门后却打不开,通常要先分清两种情况:家里有公网 IP,但 80/443 等入站端口受限;家里没有可用公网入站,需要内网穿透。
这两种情况都可以借助 Cloudflare 来解决。Cloudflare 是全球重要的互联网基础设施和网络安全服务商,运营着世界上规模最大的网络之一。它的免费方案提供 DNS 解析、网站反向代理与 CDN 加速、DDoS 攻击防护,Cloudflare Tunnel 内网穿透也可以免费使用。
有公网 IP 时,我们用 Cloudflare 代理和回源规则,把普通的 HTTPS 域名访问转到家中可用的备用端口;没有公网 IP 时,则在家里的机器上运行 Tunnel 客户端,主动连接 Cloudflare,再通过域名访问内网服务。博主下面按这两条路线展开,用 OpenWrt 和 MoviePilot 举例;有自己的云服务器,也可以选后面的 frp 方案。
使用 Cloudflare 前,先准备好自己的域名。 注册 Cloudflare 账户,添加域名并选择免费方案,再到域名注册商后台,把域名的 NS(权威 DNS 服务器)改成 Cloudflare 为这个域名分配的服务器,等控制台显示域名已激活后再继续。改的是域名的 NS,不是电脑或路由器里上网用的 DNS。域名接入步骤
如果还没有域名,或暂时不打算把 DNS 托管给 Cloudflare,建议先跳过文中的 Cloudflare 代理和 Tunnel 部分,直接看端口映射或 frp。frp 可以先用服务器公网 IP 加端口访问,后面要配置 HTTPS 域名时,再准备域名即可。
网络判断
先在局域网打开服务,确认应用本身能用,再检查外网链路。
看路由器上网口(WAN)的 IPv4。 如果是
10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x,或100.64.x.x~100.127.x.x,就不是可直接用于公网入站的 IPv4。和外部查询到的出口 IPv4 比较。 不一致时,可能还有光猫路由、上级路由或运营商 NAT。自己能管理的上级路由可以继续配置映射;运营商 NAT 通常需要申请公网 IP,或者使用后文的隧道。
实际测试一个备用端口。 配好映射与防火墙后,用手机流量测试。备用端口能通,80/443 不通,才更接近常用端口受限;所有端口都不通时,应先排查公网条件和防火墙。
WAN 地址与出口地址一致只是判断线索,最终仍以外网能否连入为准。有些路由器在家里访问自家公网 IP 会失败,所以最后要换手机流量验证。共享地址范围的定义见 RFC 6598。
只有公网 IPv6 也可以算“有公网”,但要单独验证。 AAAA 记录应指向服务所在设备的全局 IPv6 地址,并在路由器和设备防火墙放行入站;通常不需要照搬 IPv4 的端口映射。直接访问还要求外面的设备具备 IPv6。相关排查可以参考博主另一篇 OpenWrt IPv6 解析与连接排查。
有公网 IP
端口映射
假设家中服务器是 192.168.10.20,网站已经监听 HTTPS 443,我们选外部 TCP 12345 作为示例。
在路由器的“端口转发 / 虚拟服务器”中添加:
这条规则转发到家里服务器上的 HTTPS 网站。OpenWrt 自己的后台是路由器本机服务,配置入口会有区别,后面直接用隧道访问它。
如果光猫也在做路由,需要处理光猫这一层映射,或者按实际条件改为桥接。保存规则后,确认服务器防火墙允许访问,再为 web.example.com 添加指向家中公网 IPv4 的 A 记录。先使用“仅 DNS”,用手机流量打开:
https://web.example.com:12345/
证书需要支持 web.example.com 这个域名,端口换成 12345 不影响这一点。家里的公网 IP 会变时,用 DDNS 自动更新记录。DNS 记录只填 IP,不用把 https:// 和端口一起填进去。
申请证书时,可以选 DNS 验证(DNS-01),再配置自动续期。它通过域名记录确认归属,不需要从外面访问家里的 80;依赖 80 端口的 HTTP-01 在这里就不合适了。Let’s Encrypt 验证方式
到这里仍打不开,就先排查端口映射、服务监听和防火墙。Cloudflare 普通代理也要连接源站,备用端口必须先能从外网访问。
Cloudflare 代理
如果希望浏览器直接打开 https://web.example.com,可以让 Cloudflare 接收访客的 443 请求,再回源到家中的 12345:
浏览器 https://web.example.com:443
→ Cloudflare 边缘节点
→ 家中公网 IP:12345
→ 路由器转发到 192.168.10.20:443
先把域名接入 Cloudflare。下面截图使用博主账户中的 web.myhs.cc 演示填写位置,正文统一使用 web.example.com,操作时换成自己的域名。
DNS 记录
进入该域名的 DNS → 记录,添加或编辑网站的 A 记录,IPv4 地址填家中公网 IP,代理状态选择橙云“已代理”,保存。截图中的 203.0.113.10 是文档示例地址,实际要填自己的公网地址。

如果还添加了 AAAA,必须保证对应 IPv6 源站也可达。灰云只负责解析,橙云才会让请求经过 Cloudflare;这也是 Origin Rules 生效的前提。Origin Rules 说明
证书配置
这条访问链路分两段:访客先连 Cloudflare,Cloudflare 再连家里的网站。访客这一段由边缘证书负责,在 SSL/TLS → 边缘证书 中确认对应域名的证书为“有效”。

Cloudflare 到家中网站还需要源站证书。可以沿用公信证书;只经 Cloudflare 访问的源站,也可以在 SSL/TLS → 源服务器 创建 Origin CA 证书,并将证书、私钥安装到家中 HTTPS 服务。Origin CA 通常不被普通浏览器直接信任,因此不适合还需要灰云直连的入口。Origin CA 说明
源站准备好后,进入 SSL/TLS → 概述 → 配置,选择 完整(严格) 并保存;概述页可能显示为“完全(严格)”。这个模式会校验源站证书。它可能影响同一域名下其他代理网站,调整前要确认这些源站也支持。严格模式要求

回源规则
当前入口在 规则 → 概述,找到 Origin Rules 对应的“创建规则”。名称可以填“家中网站 HTTPS 回源”,选择自定义表达式,点击“编辑表达式”,填写:
(http.host eq "web.example.com" and ssl)

向下找到 目标端口,选择 重写到…,填 12345,主机标头、SNI 和 DNS 记录保持默认,检查后点击“部署”。限定主机名可以避免这条规则改到其他网站的回源端口。创建流程

Free 等计划也支持修改回源端口,端口范围为 1~65535。这里让访客照常访问 HTTPS 443,由 Cloudflare 在后面转到 12345;所以访问地址不用加 :12345。普通橙云支持的访客端口有固定范围。目标端口设置、支持的代理端口
访问验证
换手机流量打开 https://web.example.com/,检查证书、首页、登录和子页面。预期地址栏不出现 12345。若应用又跳转到内网地址或带端口地址,检查应用的外部 URL 和反向代理设置;525/526 优先检查回源 TLS 与证书,连接超时则先查公网 IP、映射与防火墙。
URL 转发
只想做一个方便记忆的入口时,可以把某个域名重定向到 https://web.example.com:12345/,但跳转后仍会显示目标端口,目标网站也必须可达。Cloudflare Redirect Rules 做的是浏览器跳转,与 Origin Rules 修改内部回源不同。重定向规则说明
如果目标是隐藏端口、正常登录和分享子页面,就用反向代理或隧道;基于 iframe 的“隐性转发”容易受到网站防嵌入、Cookie 和登录机制影响。
无公网 IP
这两种方式都需要家里有一台一直开着的机器运行客户端,比如 NAS、电脑或小主机。它能访问家里的哪些设备,就能按配置转发过去,不用在每台设备上都装一遍。
后面统一使用这组示例:
先从准备运行隧道的机器访问这两个内网地址。MoviePilot 的安装见 【MoviePilot】自动化观影保姆级食用教程,这里使用其 Web 端口 3000;如果改过端口,就填写实际值。
curl -I http://192.168.10.1/
curl -I http://192.168.10.20:3000/
能打开页面,或者返回跳转到登录页的响应,就说明服务有回应。某些应用不支持 curl -I,这时直接用浏览器打开内网地址也可以。家里都访问不了,就先查地址、端口或设备之间的网络。
下面的容器示例面向 Linux Docker Engine / NAS 的 host 网络,每处都提供 Docker CLI(docker run)和 Docker Compose 两种方式,选一种运行即可,共用同一份服务配置,不要重复启动。先确认 docker version 能连接 Docker 服务;选择 Compose 时,再确认 docker compose version 能输出版本。没有安装时按 Docker Engine 与 Compose 安装文档准备。Compose 文件统一命名为 docker-compose.yml,NAS 面板导入时核对网络模式、挂载路径和启动命令。
Cloudflare Tunnel
Tunnel 需要在家里运行一个叫 cloudflared 的程序,由它主动连接 Cloudflare,再把外面的访问送到内网。网页上创建 Tunnel 后,还得把家里的程序运行起来,这条通道才算接上。
浏览器 HTTPS 域名 → Cloudflare → 已建立的隧道 → 家中 cloudflared
├→ 192.168.10.1:80
└→ 192.168.10.20:3000
准备一个 Cloudflare 账户、接入 Cloudflare 的域名,再选一台家里的常开设备运行它。家里不用做端口映射;如果网络限制出站,需要允许设备通过 7844 连接 Cloudflare。Tunnel 入门
创建隧道
从 Cloudflare 账户层级的左侧菜单进入 联网(Networking) → Tunnels。如果还在某个域名的 DNS、SSL/TLS 页面,先返回域名列表或账户导航。

点击“创建隧道”,名称填写便于辨认的 home-lan,再创建。名称用于区分隧道,不是外网访问域名。

创建后,在 Setup Environment 里选择部署环境,找到 Docker 命令,复制 --token 后面的整串 Tunnel Token。接下来家里的程序要用它连接这条隧道,自己保存好,不要放进公开截图。Tunnel Token 说明
部署客户端
在 NAS 或 Linux 主机创建单独目录,下面用 ~/cloudflared 演示。CLI 和 Compose 都先准备同一份 .env,保存 Tunnel Token:
mkdir -p ~/cloudflared
cd ~/cloudflared
新建 .env,将占位内容替换成控制台提供的完整 Token,再执行 chmod 600 .env:
TUNNEL_TOKEN=替换为这条隧道的完整Token
Docker CLI
在这个目录执行,--env-file 会将 .env 中的 Token 传给程序:
docker run -d \
--name cloudflared \
--restart unless-stopped \
--network host \
--env-file .env \
cloudflare/cloudflared:latest tunnel --no-autoupdate run
docker logs --tail=100 cloudflared
Docker Compose
在 .env 同目录新建 docker-compose.yml:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
network_mode: host
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: ${TUNNEL_TOKEN:?请在 .env 中填写 Tunnel Token}
保存后,在这个目录执行:
docker compose config --quiet
docker compose up -d
docker compose logs --tail=100 cloudflared
两种方式都不用映射入站端口,因为是家里的程序主动连出去。日志出现 Registered tunnel connection,且控制台状态为 Healthy,才说明连接器已连到 Cloudflare;这还不代表两个内网网站都已经配置完成。镜像更新后需要重新拉取并重建容器,--no-autoupdate 只关闭程序在容器内部自更新。
下面统一填路由器和 NAS 的局域网 IP,和你在家里打开后台时使用的地址一样。尽量先按这个写法操作,避免把容器里的 127.0.0.1 误当成 NAS 或路由器。
添加路由
打开 home-lan,在 Routes 中点击 Add route,选择 Published application。这里做的事情很简单:告诉 Cloudflare,访问哪个域名时,应该转到家里的哪个地址。
分别创建下面两条,路径留空;页面若将协议与地址分成两栏,就选择 HTTP,再填写 IP 与端口:
添加路由时,控制台会为主机名创建指向 Tunnel 的 DNS 记录。若提示已有同名记录,先核对旧记录用途,再调整;Tunnel 入口不需要再填写家庭公网 A 记录,也不需要叠加前面的 12345 回源规则。应用路由与 DNS 行为
浏览器访问使用 HTTPS,Tunnel 到内网服务则按 Service URL 的 HTTP 连接。若 OpenWrt 已强制跳转 HTTPS,或服务本来只监听 HTTPS,应改填实际 HTTPS 地址,并按证书主机名配置 Origin Server Name、受信任 CA 等参数。这样才能验证源站证书;不要通过关闭校验来长期掩盖域名不匹配。HTTPS 源站配置
访问控制
OpenWrt 管理入口接入域名后,应先用 Cloudflare Access 限制谁可以访问。进入 Zero Trust → 访问控制 → 应用程序,添加 Self-hosted 应用,域名填 router.example.com,路径留空;创建 Allow 策略,在 Include 中选择 Emails 并填写自己的邮箱,保存应用。
没有接入其他身份提供商时,可以启用邮箱一次性验证码 One-time PIN。MoviePilot 仅供自己管理时也可按相同方式保护 mp.example.com。Access 是前面的一道认证,应用自身的登录仍保留。自托管应用、邮箱验证码
访问验证
换手机流量或无痕窗口打开两个域名,先过 Access 验证,再进入 OpenWrt 或 MoviePilot 自己的登录页。两层验证都试一下,再检查页面操作是否正常。若其他程序要调用 MoviePilot API,需要为它设计机器认证,浏览器验证码流程不能直接套给自动化客户端。
这里演示的是 MoviePilot 的 Web 管理页面。不要顺手把下载器传输端口、BT 流量或视频播放流量都放到这个入口;公开应用代理对视频和大文件另有服务要求,按实际用途选择入口。Tunnel 路由说明与使用边界
frp 穿透
有自己的云服务器,就可以在服务器上运行 frps,在家里的 NAS、电脑或小主机上运行 frpc。家里的 frpc 主动连接服务器,我们再通过服务器公网地址访问家中的服务。
frps 负责接入和 Token 验证,具体转发哪个内网服务,写在 frpc 里。以后增加服务,通常只需要在 frpc 多加一段配置,再放行服务器上对应的端口。
下面使用官方稳定版 v0.72.0,两端保持相同版本。NAS、Linux 主机可以选 Docker,Windows 可以下载压缩包、解压后通过命令行运行,不需要安装向导。官方的 frpc.exe 是命令行程序,双击不会打开桌面配置窗口;需要图形界面时,可以启用它内置的浏览器管理页面,下面会给出配置。官方发布页、官方 Web 界面说明
服务端
先在有公网 IP 的服务器上准备 frps。
使用 Docker 时,先确认 Docker 可用,再创建配置目录。下面的 ~/frps 只是示例,可以换成服务器上的其他目录;CLI 和 Compose 共用该目录里的 frps.toml:
mkdir -p ~/frps
cd ~/frps
如果服务器是 Windows,从官方下载页的 Assets 下载 frp_0.72.0_windows_amd64.zip。普通 Intel/AMD 64 位电脑选 amd64,其他设备按实际架构选择。解压后,把 frps.exe 放在自己选定的目录,例如 D:\Apps\frp-server。这是服务器上的示例路径,请按实际位置替换,和家里客户端的目录没有关系。
在选好的目录新建 frps.toml,填写连接端口和 Token:
bindPort = 7000
auth.method = "token"
auth.token = "替换为两端一致的随机长Token"
7000 是给家里的 frpc 连接用的。Token 是两边约好的接入密码,要换成自己的随机长字符串,客户端稍后填写同一个值;Linux 上可以用 openssl rand -hex 32 生成。管理面板不是必需的,已有的 7500 面板账号也不用填进 frpc。服务端配置
Docker CLI
在 frps.toml 所在目录执行,先检查配置,成功后再启动。$PWD 表示当前目录,挂载前确认这里已经有配置文件:
docker run --rm \
-v "$PWD/frps.toml:/etc/frp/frps.toml:ro" \
ghcr.io/fatedier/frps:v0.72.0 verify -c /etc/frp/frps.toml
检查通过后启动:
docker run -d \
--name frps \
--restart unless-stopped \
--network host \
-v "$PWD/frps.toml:/etc/frp/frps.toml:ro" \
ghcr.io/fatedier/frps:v0.72.0 -c /etc/frp/frps.toml
docker logs --tail=100 frps
Docker Compose
在 frps.toml 同目录新建 docker-compose.yml:
services:
frps:
image: ghcr.io/fatedier/frps:v0.72.0
container_name: frps
restart: unless-stopped
network_mode: host
volumes:
- ./frps.toml:/etc/frp/frps.toml:ro
command: ["-c", "/etc/frp/frps.toml"]
保存后,在这个目录执行检查、启动并查看日志:
docker compose config --quiet
docker compose run --rm frps verify -c /etc/frp/frps.toml
docker compose up -d
docker compose logs --tail=100 frps
配置检查通过、日志显示服务端开始监听 7000,就可以继续放行端口。若 Docker 命令提示权限不足,按当前系统使用 sudo 执行。官方 frps 镜像
Windows 启动
把 frps.toml 保存在服务器的 frps.exe 旁边,再打开 PowerShell。下面以 D:\Apps\frp-server 为例,先把第一行改成服务器上实际存放 frps.exe 的目录,再执行:
# 示例目录,请换成服务器上实际存放 frps.exe 的目录
Set-Location -LiteralPath 'D:\Apps\frp-server'
.\frps.exe verify -c .\frps.toml
.\frps.exe -c .\frps.toml
同样检查是否开始监听 7000。暂时保留这个窗口,关闭窗口或按 Ctrl+C 会停止程序。
端口放行
服务端启动后,先放行端口,再配置家里的客户端。云服务器一般有两层防火墙:云控制台的安全组和系统自己的防火墙,两边都要检查。命令行只能改系统防火墙,不能代替安全组。
本次先访问 MoviePilot 和 OpenWrt,需要放行这三个 TCP 端口:
开放前,先给 OpenWrt、MoviePilot 等后台设置独立强密码,保留登录验证,不要把无密码后台直接放到公网。 frps 的 Token 只验证 frpc 能否接入,不会替网页增加登录密码。先用 HTTP 入口确认登录页能打开,长期管理建议配上后面的 HTTPS。
阿里云安全组
在 ECS 控制台找到服务器,进入它关联的安全组,再选 入方向 → 增加规则。以 7000 为例,按下面填写:

确认后提交,再按相同方法添加 TCP 3000 和 TCP 6080,回到列表检查三条规则是否都是“允许”。0.0.0.0/0 代表允许所有 IPv4 来源;只给固定 IP 使用时,也可以改成对应公网 IP,例如 203.0.113.50/32。其他云厂商一般在“安全组 / 防火墙 / 入站规则”里操作。阿里云操作说明
UFW
如果服务器使用 UFW,例如部分 Ubuntu、Debian 环境,在服务器执行:
sudo ufw status
sudo ufw allow 7000/tcp
sudo ufw allow 3000/tcp
sudo ufw allow 6080/tcp
sudo ufw status numbered
最后检查规则列表中是否有这三个 TCP 端口。若显示 inactive,说明 UFW 当前没有拦截,不用为了教程反复开关。准备新启用时,先保留实际 SSH 端口,避免挡住自己的远程连接。UFW 说明
firewalld
如果使用 firewalld,先执行 sudo firewall-cmd --get-active-zones,确认网卡所在区域。下面以 public 为例,实际不是这个区域就替换名称:
sudo firewall-cmd --zone=public --permanent --add-port=7000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=3000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=6080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-ports
--permanent 保存规则,--reload 让保存的规则生效,最后检查列表里的端口。firewalld 说明
Windows 防火墙
如果 frps 装在 Windows 服务器,以管理员身份打开 PowerShell,创建入站规则:
New-NetFirewallRule -DisplayName 'frps TCP 7000' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 7000
New-NetFirewallRule -DisplayName 'frp TCP services' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3000,6080
这些是服务端的规则;家里只运行 frpc 的电脑通常不需要开放入站 7000。Windows 防火墙命令
客户端
接下来配置家里的 frpc。我们仍用内网 192.168.10.20:3000 的 MoviePilot 和 192.168.10.1:80 的 OpenWrt。
localPort 填服务在家里实际使用的端口,remotePort 填从服务器这一头访问的端口。两边可以一样,也可以把外部端口换成服务器上没被占用的数字:
比如 MoviePilot 两边都是 3000;OpenWrt 则从外面的 6080 转到家里的 80。自己新增端口时,可以先从 10000~30000 中挑空闲的。这只是方便选端口的建议,frp 实际支持 1~65535;避开已占用端口,并只放行真正用到的几个,不用开放整个范围。
Docker 用户先在家里的机器创建配置目录。下面的 ~/frpc 是示例,NAS 可以换成自己常用的 Docker 目录;它和服务器端的目录分别管理:
mkdir -p ~/frpc
cd ~/frpc
Windows 用户在家里的电脑上从官方下载页下载对应架构的压缩包并解压,将 frpc.exe 放到自己选定的目录,例如 D:\Apps\frp-client。这个路径只是示例,请使用自己电脑上的实际目录,不需要和服务器保持一致。 Docker 用户在前面创建的目录、Windows 用户在 frpc.exe 旁边,新建 frpc.toml,填写:
serverAddr = "替换为服务器公网IP或直连域名"
serverPort = 7000
auth.method = "token"
auth.token = "替换为两端一致的随机长Token"
[[proxies]]
name = "home-moviepilot"
type = "tcp"
localIP = "192.168.10.20"
localPort = 3000
remotePort = 3000
[[proxies]]
name = "home-openwrt"
type = "tcp"
localIP = "192.168.10.1"
localPort = 80
remotePort = 6080
serverAddr 换成服务器公网 IP,Token 与 frps 完全一致;localIP 换成家中设备的地址。name 方便区分服务,同一服务端上的代理名称不要重复。新增服务就在文件末尾加一段 [[proxies]],原来的几段保留。官方 TCP/UDP 示例
如果 serverAddr 填域名,这条域名要直接解析到云服务器,在 Cloudflare 中使用“仅 DNS”。如果 frpc 和 MoviePilot 在同一台机器、且能通过 127.0.0.1:3000 访问,也可以把 MoviePilot 的 localIP 改成 127.0.0.1;下面的 Docker 使用 host 网络,若换成 bridge,127.0.0.1 就指容器自己了。
Docker CLI
在 frpc.toml 所在目录执行,先检查配置,成功后再启动。$PWD 表示当前目录,挂载前确认这里已经有配置文件:
docker run --rm \
-v "$PWD/frpc.toml:/etc/frp/frpc.toml:ro" \
ghcr.io/fatedier/frpc:v0.72.0 verify -c /etc/frp/frpc.toml
检查通过后启动:
docker run -d \
--name frpc \
--restart unless-stopped \
--network host \
-v "$PWD/frpc.toml:/etc/frp/frpc.toml:ro" \
ghcr.io/fatedier/frpc:v0.72.0 -c /etc/frp/frpc.toml
docker logs --tail=100 frpc
Docker Compose
在 frpc.toml 同目录新建 docker-compose.yml:
services:
frpc:
image: ghcr.io/fatedier/frpc:v0.72.0
container_name: frpc
restart: unless-stopped
network_mode: host
volumes:
- ./frpc.toml:/etc/frp/frpc.toml:ro
command: ["-c", "/etc/frp/frpc.toml"]
保存后,在客户端目录执行:
docker compose config --quiet
docker compose run --rm frpc verify -c /etc/frp/frpc.toml
docker compose up -d
docker compose logs --tail=100 frpc
这份 Compose 使用 Linux host 网络,不用单独写 ports。NAS 面板导入时核对好配置路径和网络模式。官方 frpc 镜像
Windows 启动
确认 frpc.toml 和 frpc.exe 放在同一目录。用记事本另存配置时选“所有文件”,不要保存成 frpc.toml.txt。打开 PowerShell,将下面第一行的示例路径换成实际存放 frpc.exe 的目录,再执行:
# 示例目录,请换成家中电脑上实际存放 frpc.exe 的目录
Set-Location -LiteralPath 'D:\Apps\frp-client'
.\frpc.exe -v
.\frpc.exe verify -c .\frpc.toml
.\frpc.exe -c .\frpc.toml
先保留窗口看日志。关闭窗口、按 Ctrl+C 或电脑睡眠后,这次连接就会停止;客户端所在设备需要一直运行。官方安装说明
浏览器界面
如果更习惯用网页查看客户端状态,可以在 frpc.toml 的全局配置区域(第一段 [[proxies]] 之前)加入下面四行,替换密码后,按前面的方法重启 frpc:
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "替换为自己设置的独立强密码"
在运行 frpc 的这台电脑上打开 http://127.0.0.1:7400,使用刚设置的账号密码登录,就能查看客户端状态和代理信息。这个页面由运行中的 frpc 提供,仍需先启动程序;这里仅监听本机,不需要开放或转发 7400 端口。本文继续使用 frpc.toml 管理转发规则。官方客户端管理界面
开机运行
想开机自动运行,可在家中电脑的“任务计划程序”中创建任务。下面仍以 D:\Apps\frp-client 为示例,程序、参数和起始目录三处都要改成这台电脑的实际路径;参数中的配置路径保留双引号,以兼容带空格的目录:
保存时按提示完成账户验证,再手动运行任务,检查外网能否访问。Windows 服务端也可以在服务器上另建任务,填写服务器实际的 frps.exe、frps.toml 路径和起始目录。
新版默认启用两端之间的 TLS 加密,这里沿用默认值,不额外填写证书配置。浏览器的 HTTPS 则在后面单独配置。TLS 默认行为
访问验证
frpc 日志中应先显示登录服务端成功,再显示 home-moviepilot 和 home-openwrt 启动成功。然后换手机流量,分别打开:
http://服务器公网IP:3000/
http://服务器公网IP:6080/
看到对应登录页,说明这两条转发已经能响应请求。打不开时,按现象检查:
也可以在云服务器本机执行:
curl -I http://127.0.0.1:3000/
curl -I http://127.0.0.1:6080/
如果本机有响应、外面没有,就优先查服务器的入站规则。先把这两条跑通,再按需要增加下面的 UDP 或 WebSocket 服务。
UDP 转发
假设家里已经有一个 UDP 服务,地址是 192.168.10.30:20000,准备通过服务器的 UDP 20000 访问。在现有 frpc.toml 末尾追加:
[[proxies]]
name = "home-udp"
type = "udp"
localIP = "192.168.10.30"
localPort = 20000
remotePort = 20000
这里选择 type = "udp",两头端口仍分别看 localPort 和 remotePort。家中的 UDP 服务要先能用,这段配置只负责转发,不会帮你安装游戏或启动应用。官方 UDP 示例
保存后,按之前选择的启动方式重启客户端。Docker CLI:
docker restart frpc
Docker Compose,在客户端目录执行:
docker compose restart frpc
Windows 命令行用户在原来的客户端 PowerShell 窗口按 Ctrl+C,确认仍在 frpc.exe 所在目录,再运行 .\frpc.exe -c .\frpc.toml;使用任务计划的,结束并重新运行对应任务。
接着放行服务器的 UDP 20000。阿里云仍选 入方向 → 增加规则,授权策略选“允许”,协议改为“自定义 UDP”,访问来源填 0.0.0.0/0,端口填 20000:

提交后检查列表里的协议和端口。系统防火墙也要加一条 UDP 规则,按服务器使用的工具选择执行。
UFW:
sudo ufw allow 20000/udp
sudo ufw status numbered
firewalld,区域沿用前面确认的名称:
sudo firewall-cmd --zone=public --permanent --add-port=20000/udp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-ports
Windows 服务器,在管理员 PowerShell 执行:
New-NetFirewallRule -DisplayName 'frp UDP 20000' -Direction Inbound -Action Allow -Protocol UDP -LocalPort 20000
完成后,在对应应用客户端里填写“服务器公网 IP”和端口 20000 测试。UDP 没有通用的浏览器访问地址,普通 TCP 端口测试也不能证明它正常,最好用应用自己的客户端验证。7000 仍是 frpc 连接用的 TCP 端口,不用因为新增 UDP 服务而改动。
WebSocket 转发
常见的 ws://、wss:// 连接走 TCP,所以 WebSocket 仍用 type = "tcp"。协议说明
假设家里的原地址是 ws://192.168.10.20:8080/ws,在现有 frpc.toml 末尾追加:
[[proxies]]
name = "home-websocket"
type = "tcp"
localIP = "192.168.10.20"
localPort = 8080
remotePort = 18080
保存后,按上一节的方法重启 frpc,再放行服务器的 TCP 18080。阿里云沿用前面的 TCP 规则填写方式,把端口换成 18080;系统防火墙按所用工具选择执行。
UFW:
sudo ufw allow 18080/tcp
firewalld:
sudo firewall-cmd --zone=public --permanent --add-port=18080/tcp
sudo firewall-cmd --reload
Windows 服务器,在管理员 PowerShell 执行:
New-NetFirewallRule -DisplayName 'frp TCP 18080' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 18080
接着在支持 WebSocket 的应用或测试工具里,把连接地址换成:
ws://服务器公网IP:18080/ws
原来的 /ws 路径保留,连接成功后再试一下收发消息。它不是普通网页地址;需要 wss:// 时,还要由原服务或 HTTPS 反向代理提供证书,只改地址前缀不会自动加密。
HTTPS 访问
如果前面的转发已经能访问,接下来再把地址换成好记的 HTTPS 域名。这一步需要域名和反向代理,想先把 frp 跑通的朋友,可以先停在前面。
给 router.example.com、mp.example.com 添加指向 云服务器公网 IP 的 A 记录,先用“仅 DNS”。前面“有公网 IP”方案中的记录指向家里,这里的记录指向云服务器,填写时要分清。IPv6 没配置好就先不加 AAAA。
下面继续在 Linux 云服务器上用 Docker 安装 Caddy,它负责把域名请求转给 frps。先在云安全组增加 TCP 80、443 的允许规则,再按系统使用的防火墙放行。
UFW:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
firewalld,区域名称沿用前面确认的值:
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --reload
确认 80、443 没有被其他网站占用。已有反向代理的朋友,直接在原来的代理里添加网站即可。
创建 Caddy 配置目录,下面的 ~/caddy 只是示例,可以换成服务器上的其他目录。进入该目录,为 OpenWrt 的外层认证生成密码哈希:
mkdir -p ~/caddy
cd ~/caddy
docker run --rm -it caddy:2 caddy hash-password
按提示输入单独的访问密码,保存输出的哈希。接着创建 Caddyfile,替换域名和 替换为刚才生成的完整密码哈希:
router.example.com {
basic_auth {
homeadmin 替换为刚才生成的完整密码哈希
}
reverse_proxy 127.0.0.1:6080
}
mp.example.com {
reverse_proxy 127.0.0.1:3000
}
这份配置给 OpenWrt 多加了一层访问密码:先用 homeadmin 验证,再进入 LuCI 自己的登录页。MoviePilot 继续使用自己的账号密码。Caddyfile 里要填刚才生成的哈希字符串,不是明文密码。Basic Auth 配置
下面两种方式共用这个 Caddyfile,选择一种即可。
Docker CLI
在 Caddyfile 所在目录先检查配置:
docker run --rm \
-v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
caddy:2 caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
检查通过后启动,两个数据卷分别保存证书等数据和运行配置,重建容器时继续复用:
docker run -d \
--name caddy \
--restart unless-stopped \
--network host \
-v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
-v caddy_data:/data \
-v caddy_config:/config \
caddy:2
docker logs --tail=100 caddy
Docker Compose
同目录创建 docker-compose.yml:
services:
caddy:
image: caddy:2
container_name: caddy
restart: unless-stopped
network_mode: host
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
name: caddy_data
caddy_config:
name: caddy_config
校验配置并启动:
docker compose config --quiet
docker compose run --rm caddy caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
docker compose up -d
docker compose logs --tail=100 caddy
域名指向正确、80/443 能从外面访问时,Caddy 会为域名申请并续期 HTTPS 证书。这里开放的是云服务器的端口,家里的 80/443 仍然不用开放。Caddy HTTPS 反向代理说明
用手机流量访问 https://router.example.com/,先验证外层密码,再检查 LuCI 登录和页面操作;访问 https://mp.example.com/,检查 MoviePilot 登录与页面操作。
HTTPS 配好以后,外部使用 443,就可以撤掉 3000、6080 的公网放行规则,服务器上的 Caddy 仍能通过 127.0.0.1 访问它们。UDP 和其他需要直连的服务按各自需求保留规则。
如果失败,同时看 frpc、frps 和 Caddy 日志:
如果点开登录后又跳回家里的 IP,先检查 OpenWrt 是否强制跳转 HTTPS,或者应用是否填写了内网访问地址。反向代理需要连接服务实际提供的 HTTP/HTTPS 地址;HTTPS 服务还要配好证书信任。除了打开登录页,也要试一下登录、切换页面和保存设置。
家宽80/443等常用端口访问受限的解决方案
https://blog.myhs.cc/archives/1725509098750
Comments