本文首发于 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 网络,众多地域可选择,能够有效降低网络延迟。

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

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

请在此添加图片描述

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

请在此添加图片描述

请在此添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91959.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91959.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91959.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebSocket断线重连机制:保障实时通信的高可用性

一、为什么需要断线重连&#xff1f;WebSocket虽提供全双工通信能力&#xff0c;但实际环境中连接稳定性受多重威胁&#xff1a;​​网络层波动​​&#xff1a;Wi-Fi切换、4G/5G信号抖动&#xff08;触发onclose事件&#xff09;​​服务端异常​​&#xff1a;服务器宕机、主…

低空三维多物理场耦合风洞试验,保证飞行器的性能安全是低空飞行的底线,是低空经济发展的基础

风墙\风矩阵开发背景&#xff1a;2024年被称为中国低空经济产业发展元年&#xff0c;国家发改委提出“无安全、不低空”原则&#xff0c;要求低空经济产业在技术研发、适航认证、运营管理各环节优先保障安全。目前无人机及其他低空飞行器技术已深度融入军事、民用与工业领域&am…

中文基于Qwen3-235B-2507蒸馏数据集的操作

中文基于Qwen3-235B-2507蒸馏数据集的操作 flyfish 方式1 from datasets import load_dataset from transformers import AutoTokenizer# -------------------------- 配置参数 -------------------------- TOKENIZER_PATH "/media/models/models/Qwen/Qwen3-8B/" #…

论文阅读笔记:《Dataset Distillation by Matching Training Trajectories》

论文阅读笔记&#xff1a;《Dataset Distillation by Matching Training Trajectories》1.动机与背景2.核心方法&#xff1a;轨迹匹配&#xff08;Trajectory Matching&#xff09;3.实验与效果4.个人思考与启发主体代码算法逻辑总结一句话总结&#xff1a; 这篇论文通过让合成…

STM32标准库的工程创建

一.所需文件说明 1.启动文件startup_xxxx.s 作用&#xff1a;初始化堆栈指针、复位向量、中断向量表&#xff0c;执行 SystemInit() 后跳转到 main()。 位置&#xff1a;Libraries/CMSIS/Device/ST/STM32Fxx/Source/Templates/arm/ 文件名&#xff1a; startup_stm32f10x_l…

k8s ceph sc 设置文件系统格式化参数

前言 默认的 sc 文件系统 inode 太少,对于小文件场景,往往会出现容量没满,inode 已经用尽的情况,本文说明如何设置 inode。 说明 本文使用的是 rook-ceph 部署的 ceph 作为存储后端。 xfs 文件系统 sc 创建带格式化参数的 xfs 文件系统的 sc allowVolumeExpansion: t…

关于Npm和Nvm的用法

npm是个什么东西 npm是什么 node package managernodejs包管理工具处理复杂的包的管理的问题那么使用npm以后就不需要从前端引入相应的代码和文件等。 npm相关的命令 查看版本npm -v 更新npm install npm5.4.0 更新到最新版本npm install npmlatest 初始化项目 npm ini…

MyBatis高效查询:简化JDBC开发实战

Mybatis MyBatis 是一款优秀持久层(DAO)框架&#xff0c;用于简化 JDBC 开发 &#xff0c;原是 Apache 开源项目 iBatis&#xff0c;经历迁移改名&#xff0c;2010 年从 Apache 迁到 Google Code 并改名&#xff0c;2013 年 11 月迁至 GitHub&#xff0c;官网为 https://mybati…

系统信息及进程管理命令

系统信息及进程管理 一、系统信息查看 常用命令&#xff1a;uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令简介 uname 是一个在 Unix 和类 Unix 系统&#xff08;如 Linux、macOS&#xff09;中常用的命令行工具&#xff0c;用于显示系统信息。…

【Z字形变换】

代码思路分析&#xff1a;Z 字形变换 1. 边界情况处理 if (r 1 || r > n) return s;r 1&#xff1a;只有一行&#xff0c;直接返回原字符串&#xff08;无需变换&#xff09;。r > n&#xff1a;行数大于等于字符串长度&#xff0c;每行只有一个字符&#xff0c;直接返…

VBA中类的解读及应用第二十五讲:把源数据赋给类利用类完成查找

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0c;…

Vue3核心语法进阶(Hook)

Vue3 自定义 Hook&#xff1a;让你的代码像乐高一样“可复用”&#xff01;大家好&#xff0c;我是你们的前端小伙伴&#xff01;上一篇我们聊了 Vue3 的生命周期&#xff0c;今天咱们继续深入 Vue3 的核心利器——自定义 Hook&#xff08;Custom Hook&#xff09;。如果你已经…

工控领域协议之Modbus

Modbus 是一种通信协议&#xff0c;用于工业自动化领域中的设备之间的通信。它是一种串行通信协议&#xff0c;广泛应用于连接不同设备、传感器和执行器的工业控制系统。 Modbus 在工业控制系统、自动化设备、能源管理系统等领域得到广泛应用。 Modbus 协议的基本特点&#xff…

大件垃圾识别 mAP↑28%:陌讯多模态融合算法实战解析

一、行业痛点&#xff1a;大件垃圾识别的现实困境在城市环卫智能化转型过程中&#xff0c;大件垃圾&#xff08;如废旧家具、电器等&#xff09;的自动化识别与分拣成为关键环节。据住建部《城市环境卫生发展报告》显示&#xff0c;传统人工分拣模式下大件垃圾识别准确率不足 6…

vk框架或者普通函数封装的一些函数可以拿取使用【会持续更新】

1.身份证校验【通用】/*** function isIDCard* description 判断是否为有效的身份证号码。* param {string} idCard - 待验证的身份证号码。* returns {boolean} 返回验证结果。*/ pubFun.isIDCard function (idCard) {// 身份证号码为15位或者18位&#xff0c;15位时全为数字…

如何给Word和WPS文档添加密码或取消密码

要保护Word和WPS文档&#xff0c;可以为它们加密&#xff0c;加密有两类&#xff1a;打开密码和修改密码。密码设置有两个入口&#xff0c;一个是在另存为&#xff0c;一个是在文件菜单。Word和WPS文字的路径略有不同&#xff0c;微软Office和WPS的其他套件也是如此操作。一、W…

uni-app项目gitignore文件示例

uni-app 忽略以下文件和目录 DS_Store 忽略 UniApp 编译生成的小程序相关目录 unpackage/ uni_modules/ 忽略编辑器自动生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略临时文件 temp/ 忽略构建工具自动生成的文件 build/ 忽略 npm 安装的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果问题本质与核心挑战 给定孩子的评分数组&#xff0c;需满足 “每个孩子至少1颗糖果&#xff0c;相邻评分高的孩子糖果更多”&#xff0c;求最少糖果总数。核心挑战&#xff1a; 相邻约束是双向的&#xff08;左→右和右→左都需满足&#xff09;…

【QT】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;QT 文章目录1. QT简介与准备工作1.1 什么是QT1.2 QT的版本选择1.3 系统要求检查2. QT安装方式详解2.1 官方在线安装器2.2 离线安装包2.3 包管理器安装3. Windows平台安装配置3.1 Windows安装步骤3.2 环境变量配置3.3 Visual Stu…

Java从入门到精通 - 算法、正则、异常

算法、正则、异常 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录算法、正则、异常1. 常见算法1.1 简单认识算法1.1.1 什么是算法&#xff1f;1.1.2 为什么要学习算法&#xff1f;1.2 排序算法1.2.1 冒泡排序1.2.1.1 实现冒泡排…