跳到正文

为什么做敲门 Knock

很多人买 NAS,是想把照片、文件和自己的服务留在自己手里。设备装好以后,很快就会遇到一个问题:人在外面,怎么访问家里的 NAS?

最直接的办法是做端口映射。相册开一个端口、下载器开一个端口、管理后台再开一个端口,用起来确实方便。但这些端口一旦放到公网,面对的就不只是你和家人,还有全天候扫描公网地址的脚本。你看到的是家里的服务,它们看到的是一批可以持续尝试的入口。

我们做 敲门 Knock,就是想把公网访问这件事做得简单一些:服务照常使用,入口由敲门统一接管;访问者先完成登录,确认有权限以后,网关才把请求转给 NAS。

为什么要在服务前面再加一道门

2026 年初,飞牛 fnOS 发生了一次严重安全事件。飞牛团队在后续的事件说明中确认,当时发现并修复了越权访问、路径穿越和验证绕过三个漏洞。部分攻击方式公开后,尚未更新的设备开始遭遇大范围探测和攻击。

奇安信 XLab 对恶意样本的分析显示,一些受感染设备被纳入 Netdragon 僵尸网络,用来发起 DDoS 和执行远程命令。恶意程序还会改动防火墙规则和 hosts 文件,干扰设备获取更新。

这次事件有一个很现实的提醒:登录页和双重验证只能保护正常登录流程。如果漏洞出现在登录之前,或者攻击者能绕过原来的认证,开再多登录因子也拦不住那条请求。

这并不是飞牛才有的问题。NAS 系统、第三方应用、Docker 容器都会更新代码,也都有可能出现新的漏洞。该升级还是要及时升级,但不能把所有希望都放在“我已经是最新版”上。少暴露一个入口,攻击者就少一个可以直接碰到服务的地方。

加一层 Basic Auth,够不够

Lucky、Nginx 等工具都能很方便地给页面加上 Basic Auth。临时保护一个页面,或者挡掉一些没有目标的扫描,它很好用。

但 Basic Auth 通常就是一组长期使用的账号密码。它在网络上传递的凭据只是 Base64 编码,并没有加密,所以必须配合 HTTPS;MDN也明确提醒了这一点。凭据一旦泄露,别人拿到后就能继续使用。

实际使用还有兼容问题。浏览器、WebDAV、播放器和手机 App 对认证头的处理不完全一样,常见情况是反复弹出登录框,或者某个客户端根本无法使用。最后只能针对路径和客户端不断加例外。

Basic Auth 可以继续作为补充,但我们不希望它成为 NAS 公网访问的唯一凭据。敲门使用独立的登录凭据和会话,可以添加 TOTP、Passkey 和外部账号,也可以查看、撤销会话,并限制一组凭据能够访问哪些服务。

已经有 WAF,还需要敲门吗

雷池(SafeLine)这类 WAF 很适合保护公开网站。网站本来就要接待所有访客,WAF 负责从请求中识别 SQL 注入、XSS、路径穿越和恶意机器人。

NAS 管理后台、下载器和私人相册通常不需要接待陌生访客。与其让所有请求先碰到服务,再判断它像不像攻击,我们更希望没有登录的人根本到不了服务。

两者可以一起用。敲门也提供 WAF、扫描拦截、黑名单和限流。登录负责确认来访者有没有权限,WAF 继续检查已经进入网关的异常请求,各做各的事。

为什么不直接用 Tailscale 或 ZeroTier

Tailscale、ZeroTier、EasyTier 和 WireGuard 都是成熟的组网方案。如果使用设备比较固定,而且每台设备都能安装客户端,它们的网络隔离会更彻底。

问题是,手机、平板和电脑都要先加入虚拟网络。临时换一台设备,或者给家人分享一个服务,都要多做一遍客户端配置。设备上已经运行其他 VPN 或代理时,还可能遇到路由、DNS 或系统 VPN 权限冲突。

敲门面向的是另一种使用习惯:打开浏览器,输入自己的域名,登录后直接使用。它不要求每台设备安装组网客户端,也不会接管整台设备的网络出口。

这两类方案没有谁一定更好。完全不想提供公网入口,可以选虚拟组网;希望家人也能方便使用相册、影视库等 Web 服务,可以把敲门放在公网入口。

敲门具体做了什么

以 Web 服务为例,可以给每个服务分配一个子域名:

text
auth.example.com    登录入口
nas.example.com     NAS
media.example.com   影视库
download.example.com 下载器

这些域名都先到敲门网关。没有登录时,网关把访问者带到认证页面;登录成功后,再把请求转发到对应的内网服务。外部只需要一个统一入口,不用把每个应用的原始端口都映射出去。

家里没有公网 IP,可以通过 FRP 或 Cloudflared 建立内网穿透,登录和服务映射的使用方式不变。少数必须保留 TCP / UDP 原始端口的服务,可以在支持宿主机防火墙控制的平台使用直连授权

一次访问大致会经过这些环节:

  1. 网关检查扫描行为、黑白名单和访问来源;
  2. 需要登录的服务检查当前会话;
  3. 用户通过 TOTP、Passkey、账号密码或外部账号登录;
  4. 网关确认这组凭据是否有权访问当前服务;
  5. 请求通过 WAF 等检查后转发到内网应用;
  6. 访问结果写入请求日志,异常情况可以发送通知。

如果某个映射开启了登录保护,没有有效会话时,请求就不会交给上游。要让这套保护生效,所有公网流量都必须经过敲门,原来的业务端口也不能继续单独暴露。

请求是怎么走的

text
访问者

DNS / 路由器 / CDN / 隧道

敲门 Knock 网关
  ├─ 登录、会话、白名单、WAF、请求日志
  └─ 按域名、路径或协议选择内网服务

NAS、文件服务、媒体服务或其他应用

管理后台只给管理员配置敲门使用,不是普通访客的业务入口。实际运行由三部分配合:

组成负责什么
Rust 服务管理后台、登录认证、安全策略、证书、DDNS、隧道和运维任务
Go 网关接收外部请求,执行登录检查、服务路由和反向代理
SQLite保存配置和运行数据,不需要额外安装 Redis

管理页面已经打包在安装包和镜像中,正常运行不需要安装 Node.js。各平台的管理端口、网关端口和监听范围不同,部署时请查看端口、入口与访问路径

敲门能管什么,管不了什么

敲门只能保护经过网关的请求。路由器如果还转发着原来的管理端口,或者云平台还有另一条回源地址,攻击者仍然可以绕过去。

装好以后还需要做好这些事情:

  • 及时更新 NAS 系统、Docker 镜像和业务应用;
  • 关闭不再使用的公网端口和回源地址;
  • 正确配置路由器、CDN 和反向代理传递的访客 IP;
  • 给不同账号分配需要的服务,不共用高权限凭据;
  • 定期备份配置、证书和重要数据;
  • 用手机流量测试一次完整的公网登录流程。

敲门默认会放行部分局域网、回环和私网来源,方便用户在家里直接使用。因此,局域网能打开页面,不代表公网登录已经配置正确,一定要换到真实外部网络测试。

先过门,再访问

安全工具常见两个问题:简单的功能不够用,专业的工具又很难配。很多用户只是想在手机上安全地打开家里的相册和文件,并不想先学一遍反向代理、防火墙、证书和各种认证协议。

敲门想把这些环节收在一起,让用户用手机也能完成安装、登录、服务映射和基本防护。服务有漏洞的可能性不会消失,但没有登录的人先碰不到服务,风险就会少一大块。

我们不会承诺装上敲门就绝对安全,也不会建议任何人因此停止更新系统。这个产品只做一件实在的事:先确认访问者是谁,再决定要不要把门打开。

可以先接入一个服务试用:

参考资料

QQ群:1081609274