本文首發于 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