
本文记录一次真实折腾过程:NAS 内网里的 Calibre-Web,本地访问正常,手机 5G 也能打开域名端口,但 Kindle Oasis 3 上的 KOReader OPDS 怎么都访问不稳定。最后的稳定方案是:用 Cloudflare Tunnel 给 Calibre-Web 做一个 HTTPS 公网入口。
我在 NAS 上部署了 Calibre-Web,主要用来管理电子书,并通过 KOReader 自带的 OPDS 功能在 Kindle 上浏览和下载书籍。
原本的访问方式大概是:
http://nas.example.com:8083/opds
在局域网里访问没问题,手机 5G 下也能打开。但是 Kindle Oasis 3 + KOReader 访问 OPDS 时经常失败。
排查后发现,这类问题很可能跟下面几个因素有关:
所以最终目标变成:
KOReader -> HTTPS 域名 -> Cloudflare Tunnel -> NAS 内网 Calibre-Web
最终我使用了:
cloudflaredhttps://books.example.com/opds
Cloudflare Tunnel 的好处是:NAS 不需要开放公网端口,NAS 主动连接 Cloudflare,外部访问 Cloudflare 的 HTTPS 域名即可。
Kindle KOReader
|
| HTTPS
v
books.example.com
|
| Cloudflare Tunnel
v
NAS 内网
|
v
Calibre-Web: http://192.168.x.x:8083
Calibre-Web 自己继续保留账号密码认证,不额外开启 Cloudflare Access。
注意:不要给这个地址加 Cloudflare Access 登录保护,因为 KOReader 处理不了网页式 SSO、验证码、OTP 之类的登录流程。
我这里没有直接使用正在跑其他服务的主域名,而是换了一个已经不用的域名。
如果你的域名还在承载网站、邮箱或其他服务,千万不要直接改 NS。改之前至少要检查:
A / AAAA 记录CNAME 记录MX 邮箱记录TXT 记录,例如 SPF、DKIM、DMARC如果域名已经不用,操作就简单很多:直接把整个域名接入 Cloudflare。
在 Cloudflare 添加域名时,套餐选择 Free 即可。

上图这一步要重点看两件事:网站类记录可以走橙云代理,邮箱相关记录不要走橙云代理。尤其是 mail、smtp、pop3 这类记录,建议保持 DNS only。
Cloudflare 会要求把域名的 Nameserver 改成它提供的两条,例如:
aaa.ns.cloudflare.com
bbb.ns.cloudflare.com
原来的 Nameserver 可能类似:
dns9.hichina.com
dns10.hichina.com
需要去域名注册商后台修改 DNS 服务器,而不是在“域名解析”页面里改 A 记录。
如果是阿里云,入口一般在:
域名控制台 -> 域名管理 -> DNS 修改 / DNS服务器修改
不要去“云解析 DNS”页面找,那里只能改解析记录,不负责修改 Nameserver。

Cloudflare 会提醒确认 DNSSEC 是否关闭。
如果原 DNS 服务商那里 DNSSEC 没开,就不用管。如果已开启,建议先关闭 DNSSEC,再改 Nameserver,否则可能出现解析异常。
进入 Cloudflare Zero Trust:
https://one.dash.cloudflare.com/

首次使用会要求开通 Zero Trust Free。它是免费的,但可能会要求绑定付款方式。
开通后建议马上设置一个低额度账单提醒:
Manage Account -> Billing -> Billable usage -> Billable usage notification
可以添加:
Billing Budget Alert
Budget: 1 USD
这样如果真的产生可计费使用量,会有邮件提醒。
正常只用 Cloudflare Tunnel 给个人 OPDS 使用,不应该产生费用。
在 Zero Trust 控制台进入:
Networks -> Tunnels & Mesh

点击:
Create a tunnel
类型选择:
Cloudflared
Tunnel 名字可以写:
calibre-web-nas
接下来选择 Docker 安装方式。Cloudflare 会给一条命令,类似:
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>
这里的 token 是敏感信息,不要发到公开场合,不要写进博客,不要提交到 Git。
理想情况下,可以直接在 NAS 上跑:
docker run -d \
--name cloudflared-calibre-web \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token <YOUR_TOKEN>
但我实际遇到的第一个坑就是:NAS 拉 Docker Hub 镜像超时。
报错类似:
Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection
我最后没有继续死磕 Docker Hub,而是改用 Cloudflare 官方发布的 cloudflared 二进制文件。
NAS 是 x86_64,所以使用 Linux amd64 版本:
cloudflared-linux-amd64
官方下载地址:
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
如果下载慢,可以用断点续传:
curl -L -C - \
-o cloudflared \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
下载完成后,给执行权限:
chmod 755 cloudflared
./cloudflared --version
我为了让它仍然由 Docker 管理,最后把这个二进制封成了一个 NAS 本地 Docker 镜像,再用 Docker 运行。这样可以继续使用:
--restart unless-stopped
也就是 NAS 重启后自动恢复。
容器运行成功后,在 Cloudflare Tunnel 页面能看到 Connector 状态变成:
Connected / Healthy

容器日志里也会看到类似:
Registered tunnel connection
这就说明 NAS 已经成功连上 Cloudflare。
这是另一个容易点错的地方。
不要配置:
Hostname routes
这个是给 Cloudflare Gateway / 私有网络路由用的,不适合 KOReader 访问公网 OPDS。

应该配置:
Published application routes
或者界面里叫:
Public Hostname
新增一条公开主机名:
Subdomain: books
Domain: example.com
Path: 留空
Type: HTTP
URL: 192.168.x.x:8083
最终访问地址就是:
https://books.example.com/opds
这里 192.168.x.x:8083 是 NAS 内网里 Calibre-Web 的地址。因为 cloudflared 跑在 NAS 或同一局域网内,所以它可以访问这个内网地址。
浏览器里先测试:
https://books.example.com
如果能看到 Calibre-Web 页面,说明基本通了。
再测试 OPDS:
https://books.example.com/opds
如果 Calibre-Web 开了登录认证,浏览器或 OPDS 客户端会要求输入 Calibre-Web 的用户名密码。
最后在 KOReader 里添加 OPDS:
名称:Calibre-Web
地址:https://books.example.com/opds
用户名:Calibre-Web 用户名
密码:Calibre-Web 密码
保存后测试浏览目录和下载书籍。
如果域名下面还有网站、邮箱、DDNS 或其他服务,直接改 Nameserver 可能影响现有业务。
最好用一个闲置域名,或者完整备份并迁移所有 DNS 记录。
如果 Cloudflare 自动导入了 mail、smtp、pop3 等记录,有时会默认开橙云代理。
邮件相关记录应该保持:
DNS only
不要 Proxied。
MX 记录本身通常只能是 DNS only。
Cloudflare Access 很适合保护网页后台,但不适合 KOReader 的 OPDS。
KOReader 无法处理交互式网页登录、SSO、邮箱验证码等流程。
这个场景下,认证交给 Calibre-Web 自己处理即可。
Cloudflare 新界面里有:
Hostname routes
Published application routes
OPDS 这种公网访问应用,应该用 Published application routes / Public Hostname。
Hostname routes 会提示需要 Cloudflare Gateway,不是我们要的。
NAS 环境里拉 Docker Hub 经常超时。
可以考虑:
这次我用的是官方二进制 + 本地 Docker 镜像。
Cloudflare 给的 Docker 命令里包含 Tunnel token。
这个 token 等同于授权凭据,千万不要:
如果以后不用了,可以这样回滚:
docker stop cloudflared-calibre-web
docker rm cloudflared-calibre-web
这套方案的核心价值是:
最终 KOReader 里只需要填:
https://books.example.com/opds
相比 DDNS + 端口转发,这个方案更稳,也更适合不想把 NAS 直接暴露到公网的人。
头图摄影:Linh Quach,来源:Unsplash。
本文由 设计创意1984 作者:admin 发表,转载请注明来源!