本文首发于 Anyeの小站,点击阅读原文体验更加。
前言
在日常的 HomeLab 或小型私有云环境中,我们常常通过反向代理(如 Nginx、Caddy 等)将内网服务暴露到公网,方便远程访问。然而,一旦端口映射开启、公网可达,安全问题便随之而来:未经身份验证的访问、暴力破解、爬虫扫描、甚至未授权的数据泄露,都可能悄无声息地发生。
尽管许多服务本身提供登录功能,但它们的安全性、认证方式和强度千差万别。有些甚至没有账号体系,只靠 IP 白名单或路径隐藏,这在现代安全要求下显得捉襟见肘。
那么,有没有一种方式,无需修改后端服务代码,也不依赖其自身权限体系,就能统一接入一层强认证机制?
当然可以,你可以选择使用传统的 Nginx 或 Caddy,通过集成 OAuth2 Proxy、Authelia、Keycloak 等中间件来实现统一认证,甚至自建 SSO(如 Logto 等)。这些方案功能强大,适用于企业级部署或需要与现有认证体系(如 LDAP、OAuth、SAML)对接的场景。
但对于个人用户、小型服务部署而言,它们往往存在以下几个问题:
- 配置复杂:涉及多个组件,部署流程繁琐,调试成本高
- 依赖繁重:需要运行额外的认证服务,资源占用较高
- 不支持 WebAuthn 或支持不完善:大多数方案仍以密码为主,难以原生支持指纹、人脸识别或硬件密钥等现代认证方式
相比之下,Next Terminal 提供了一个轻量、开箱即用的 WebAuthn 登录前置方案,将认证机制直接嵌入到反向代理流程中,无需部署额外服务、也无需修改后端应用,仅通过简单配置即可为你的服务加上一层现代化的访问控制。
希望通过本文的实践记录,带你体验一种更简单、更安全、更优雅的服务接入方式。
基础知识
WebAuthn
WebAuthn(Web Authentication) 是由 W3C 和 FIDO 联盟共同制定的一套基于公钥加密的身份认证标准,目标是替代传统的用户名 + 密码登录方式,提升网络身份验证的安全性与用户体验。
用一句话概括它的功能和效果就是:
让用户可以用指纹、人脸识别、U 盾、USB 安全密钥等“硬件”方式登录网站或服务,而无需输入密码。
与传统认证方式相比,WebAuthn 具有以下几个显著优势:
- ✅ 无密码登录:用户无需记忆密码或担心被泄露
- 🔐 抗钓鱼:认证过程基于设备生成的私钥,绑定特定网站,攻击者无法伪造
- 🧱 硬件级安全性:可集成指纹、人脸识别、YubiKey 等 FIDO2 安全密钥
- 🌍 跨平台支持广泛:主流浏览器(Chrome、Firefox、Safari 等)与操作系统(Windows Hello、Touch ID、Android)均已支持
在 WebAuthn 中,每个用户设备会为每个网站生成一对密钥,私钥保存在本地或硬件设备中,服务器只保存公钥。因此,即便服务端数据库被攻破,攻击者也无法用公钥“伪装”用户。
Next Terminal
https://next-terminal.typesafe.cn/
Next Terminal 是一款开源的轻量级堡垒机与交互审计系统,旨在为 IT 运维人员和 HomeLab 用户提供集中的、安全的远程访问解决方案。它支持多种远程访问协议,包括 RDP、SSH、VNC、Telnet 和 Kubernetes,允许用户通过统一的 Web 界面管理不同协议下的服务器与设备。
Podman
Podman(意为 Pod Manager)是由红帽公司主导开发的一款遵循 OCI(Open Container Initiative)标准的开源容器引擎,可用于创建、运行、管理容器、镜像、存储卷及 Pod(容器组)等对象 。
在这里选择 Podman 主要是由于其不依赖 Dockerd 守护进程,减少内存占用(如同一容器较 Docker 少用约 20MB/容器),更适合家庭云、小型 VPS 部署环境,空出更多内存供程序使用。
准备工作
- 具有公网 ip 的服务器一台
- 反向代理基本知识
- 支持 WebAuthn 认证的设备(如 Windows Hello、Touch ID、Android 生物认证等)
正式开始
服务器选型
选择合适的服务器环境对于 Next Terminal 的稳定运行和性能表现至关重要。在这里我推荐使用 https://buy.cloud.tencent.com/lighthouse 锐驰型套餐,其具有以下优势:
- 价格优惠:腾讯云锐驰型轻量应用服务器的起始价格为每月 40 元,提供 2 核 CPU、1 GB 内存、40 GB SSD 云盘和 200M 峰值带宽,适合个人用户和小型部署使用。
- 不限流量:该配置不限公网流量,虽然不保证带宽,但是实际测试情况可以保证高带宽瞬时使用。
- 网络优势:BGP 网络,众多地域可选择,能够有效降低网络延迟。
当然,如果你有别的选择,也可以参考后续的教程进行部署,本文将采用下述配置进行演示:
重装系统
这里选择将系统 dd 成 Alpine,参考该项目命令:
https://cnb.cool/bin456789/reinstall
curl -O https://cnb.cool/bin456789/reinstall/-/git/raw/main/reinstall.sh || wget -O reinstall.sh $_
bash reinstall.sh alpine
reboot
安装 Podman
根据官方文档,采用以下命令进行安装,参考:https://wiki.alpinelinux.org/wiki/Podman
# 安装 Podman、podman-compose、curl和iptables
apk add podman podman-compose curl iptables# 启用 cgroups
rc-update add cgroups# 启动 cgroups
rc-service cgroups start
安装 Next Terminal
根据官网文档,获取配置:https://docs.next-terminal.typesafe.cn/install/container-install.html#%E4%BD%BF%E7%94%A8-podman-%E5%AE%89%E8%A3%85
curl -sSL https://f.typesafe.cn/next-terminal/docker-compose-postgres-aliyun.yml > docker-compose.yml
curl -sSL https://f.typesafe.cn/next-terminal/config-postgres.yaml > config.yaml
由于 Podman 没有守护进程,需要运行下述命令配置开机自启动:
# 创建 openrc 服务文件
cat <<EOF > /etc/init.d/next-terminal
#!/sbin/openrc-runSERVICE_NAME="next-terminal"PROJECT_DIR="$(pwd)"description="Service of \${SERVICE_NAME}"depend() {need net
}start() {ebegin "Starting \${SERVICE_NAME}"cd "\${PROJECT_DIR}" || return 1/usr/bin/podman-compose up -d && eend 0 || eend 1
}stop() {ebegin "Stopping \${SERVICE_NAME}"cd "\${PROJECT_DIR}" || return 1/usr/bin/podman-compose down && eend 0 || eend 1
}restart() {ebegin "Restarting \${SERVICE_NAME}"cd "\${PROJECT_DIR}" || return 1/usr/bin/podman-compose down && /usr/bin/podman-compose up -d && eend 0 || eend 1
}status() {cd "\${PROJECT_DIR}" || return 1RUNNING=\$(/usr/bin/podman-compose ps --quiet)if [ -n "\$RUNNING" ]; thenecho "\${SERVICE_NAME} is running"return 0elseecho "\${SERVICE_NAME} is not running"return 1fi
}
EOF# 赋予执行权限
chmod +x /etc/init.d/next-terminal# 添加到默认运行级别
rc-update add next-terminal default# 启动服务
rc-service next-terminal start
此时 Next Terminal 就成功安装了,接下来进入配置阶段。
域名解析
由于后续需要使用多个子域名反代内网服务,这里选择将一个四级泛域名解析到服务器 ip,如:*.nt.anye.xyz
,同时添加一个三级域名供 Next Terminal 面板访问使用,如:nt.anye.xyz
。
基本配置
初始化
访问 8088
端口打开面板,按照提示进行初始化操作:
进入面板:
配置证书
点击侧边栏 资源管理
- 证书管理
,这里我将采用本地证书的方式进行演示:
点击 新建
- 本地导入
:
提示:这里也可以采用容器内文件路径的方式进行导入,如:
*证书:/ssl/nt.anye.xyz/cert.crt
*私钥:/ssl/nt.anye.xyz/cert.key
注意需要修改 compose 配置文件以将文件映射到容器中。
这样可以采用诸如 Certimate 等工具自动更新证书,具体可以参考:
https://www.anye.xyz/archives/biEj2Hxb
点击 设为默认:
系统设置
反向代理服务器
点击 系统设置
- 反向代理服务器
,点击 启用
,按需填写添加端口等信息,域名填写面板的域名,如此处:nt.anye.xyz
,点击提交:
身份认证
点击 身份认证
,启用通行令牌登陆,外部访问域名填写面板域名,如此处:nt.anye.xyz
;允许使用通行令牌的来源填写面板访问链接,如此处:https://nt.anye.xyz
,点击提交。
配置通行密钥
点击右上角进入 个人中心
,点击 通行密钥
,创建:
会唤起系统自带的 WebAuthn 认证程序:
也可以使用其他兼容的 WebAuthn 认证:
添加后,即可使用指纹 进行登陆 Next Terminal 。这里建议同时配置 双因素认证。
Web 资产
铺垫了这么多,终于进入了反向代理的环节:
点击侧边栏 资源管理
- Web资产
,点击新建:
按照正常添加反向代理的内容进行填写,如此处:
域名:反向代理后用于访问的域名
入口路径(可选):为 Next Terminal 跳转时携带的路径
目标服务器:源站访问链接
点击保存。
此时四级泛域名解析就派上了用场,每次添加内网服务时,不需要再去 DNS 服务商那里解析服务器 ip,同时避免了 DNS 扫描可能会暴露的内网服务。
测试
新建窗口访问创建的反向代理进行测试,未授权的情况下会跳转到 Next Terminal 认证页面,可以使用通行密钥实现秒登陆。
确保安全访问:
更进一步,你还可以配置访客用户,将资产按需进行分配,这在需要朋友进行帮助时,起到授权访问,防止横移的效果,避免远程电脑产生的文件泄露等问题。
后记
在本文中只提到了 Next Terminal 其中的一个用途,它还有更多的资产管理功能,功能丰富,界面美观,也未尝不可尝试,可以访问其官网了解更多功能:https://next-terminal.typesafe.cn/,如果您有意向选择其专业版,欢迎使用我的推广链接
https://license.typesafe.cn/pricing?code=NTKNtV7FDP