Anye
Anye
发布于 2025-08-04 / 26 阅读
1
0

Next Terminal 实战:内网无密码安全登录

前言

在日常的 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 网络,众多地域可选择,能够有效降低网络延迟。

当然,如果你有别的选择,也可以参考后续的教程进行部署,本文将采用下述配置进行演示:

image-JZAf.png

重装系统

这里选择将系统 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

image-YKWk.png

安装 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

image-GuCm.png

安装 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-run

SERVICE_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 1
  RUNNING=\$(/usr/bin/podman-compose ps --quiet)
  if [ -n "\$RUNNING" ]; then
    echo "\${SERVICE_NAME} is running"
    return 0
  else
    echo "\${SERVICE_NAME} is not running"
    return 1
  fi
}
EOF

# 赋予执行权限
chmod +x /etc/init.d/next-terminal

# 添加到默认运行级别
rc-update add next-terminal default

# 启动服务
rc-service next-terminal start

image-koyF.png

此时 Next Terminal 就成功安装了,接下来进入配置阶段。

域名解析

由于后续需要使用多个子域名反代内网服务,这里选择将一个四级泛域名解析到服务器 ip,如:*.nt.anye.xyz ,同时添加一个三级域名供 Next Terminal 面板访问使用,如:nt.anye.xyz

基本配置

初始化

访问 8088 端口打开面板,按照提示进行初始化操作:

image-PQbi.png

进入面板:

image-AUmf.png

配置证书

点击侧边栏 资源管理 - 证书管理 ,这里我将采用本地证书的方式进行演示:

image-svoP.png

点击 新建 - 本地导入

image-Onlm.png

提示:这里也可以采用容器内文件路径的方式进行导入,如:

*证书:/ssl/nt.anye.xyz/cert.crt

*私钥:/ssl/nt.anye.xyz/cert.key

注意需要修改 compose 配置文件以将文件映射到容器中。

这样可以采用诸如 Certimate 等工具自动更新证书,具体可以参考:

https://www.anye.xyz/archives/biEj2Hxb

点击 设为默认

image-ahab.png

系统设置

反向代理服务器

点击 系统设置 - 反向代理服务器 ,点击 启用 ,按需填写添加端口等信息,域名填写面板的域名,如此处:nt.anye.xyz,点击提交:

image-eGlJ.png

身份认证

点击 身份认证,启用通行令牌登陆,外部访问域名填写面板域名,如此处:nt.anye.xyz;允许使用通行令牌的来源填写面板访问链接,如此处:https://nt.anye.xyz ,点击提交。

image-uQQD.png

配置通行密钥

点击右上角进入 个人中心,点击 通行密钥 ,创建:

image-QiMo.png

会唤起系统自带的 WebAuthn 认证程序:

image-coED.png

也可以使用其他兼容的 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


评论