SSD Nodes Learn
指南 Matt Connor作者: Matt Connor · 已更新 2026-07-24

Ubuntu 24.04 安裝 Webmin 教學與安全性設定指南

本文教學如何在 Ubuntu 24.04 安裝 Webmin 並強化安全性。包含使用 SSH tunnel 或 IP 白名單限制 port 10000 存取、配置 Let's Encrypt 憑證、啟用 2FA 以及設定 Fail2ban,避免伺服器因 Webmin 高權限而遭受入侵風險。

建立目標

Webmin 是一款網頁控制台,為整個 Linux 伺服器提供瀏覽器前端介面。透過 port 10000 的 HTTPS 連線,使用者可以管理使用者帳號、套件、cron jobs、防火牆、Apache、BIND、磁碟以及其他數百個模組。安裝過程僅需執行三個指令,約需 1 分鐘。本指南後半部篇幅較長,是因為 Webmin 會以 root 權限登入,並擁有與 root 等同的權限。若 Webmin 未經身份驗證或完全開放,將導致伺服器被全面入侵。因此,請在 10 分鐘內完成安裝,並花費剩餘時間確保只有您本人可以存取。

前置作業與重要警告

需要一台全新的 Ubuntu 24.04 KVM VPS,並具備 root 或 sudo 使用者權限。Webmin 使用 Perl 開發且佔用資源極低;1 GB RAM 已綽綽有餘,閒置時佔用量低於 0.25 GB。Webmin 透過其內建的 Web server (miniserv.pl) 監聽 TCP 10000 埠,而非使用 Apache 或 nginx,因此無需預先安裝其他軟體。

開始之前需決定兩件事。首先是登入帳號:Webmin 透過 PAM 對接 Unix 帳號,因此您必須使用 rootsudo 群組中的使用者,並輸入該帳號的 Unix password 進行登入。雲端映像檔的預設使用者通常僅支援 SSH key 而未設定密碼,Webmin 無法登入無密碼的帳號。請先使用 sudo passwd youruser 設定密碼,否則無論輸入何種內容都會登入失敗。

第二點是警告:請勿直接將 10000 埠對整個網際網路開放。請現在就決定要透過 SSH tunnel 存取 Webmin(建議做法,不暴露埠口),或是將其限制在您的專屬 IP。此決定將影響後續所有步驟,因此在操作防火牆前,請先閱讀兩種方案。

從官方儲存庫安裝 Webmin

Webmin 提供已簽署的 apt 儲存庫。設定指令碼會新增該儲存庫及其 GPG 簽署金鑰,因此之後執行 apt upgrade 時,Webmin 會像其他套件一樣進行下載。這能確保您獲得經過驗證的更新,而非無法自動修補的 .deb

curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh

指令碼會列出即將執行的動作並詢問 Setup repository? (y/N) — 請回答 y。完成後,請安裝套件。使用 --install-recommends 旗標會下載常見的 Perl 與 SSL 模組依賴項目,以避免後續發生模組缺失的錯誤。

sudo apt-get install --install-recommends webmin

Webmin 曾更名過此指令碼 — 舊版指南會提到 setup-repos.sh — 因此若原始 URL 回傳 404,請直接從 webmin.com/download 取得目前的指令,而非使用舊名稱。正確安裝後的結尾應包含類似 Webmin install complete. You can now login to https://your-host:10000/ as root 的行。服務已啟用並執行,設定檔位於 /etc/webmin,請求紀錄於 /var/webmin/miniserv.log,登入失敗紀錄則傳送至 syslog — 在 Ubuntu 24.04 上,會傳送至 systemd journal。

在開啟瀏覽器前,請確認服務已啟動並正在監聽:

sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000

您應看到 active (running) 狀態,且有一行顯示 miniserv.pl 已綁定至 0.0.0.0:10000 — 一旦使用下方的隧道路由,該位址會變更為 127.0.0.1:10000。若 ss 在 10000 埠顯示無內容,代表 Webmin 未啟動;請在繼續操作前閱讀 journalctl -u webmin -n 50

首次登入與憑證警告

將瀏覽器指向 https://YOUR_SERVER_IP:10000。在全新的系統上會發生兩件事。

若 ufw 已啟用(Ubuntu 官方映像檔預設為停用,但許多供應商會預先啟用)— 頁面將完全無法載入,這點會在下方的故障模式中說明。若連接埠已開啟,瀏覽器會顯示全螢幕阻擋畫面:Chrome 會顯示錯誤碼 NET::ERR_CERT_AUTHORITY_INVALID"Your connection is not private",或 Firefox 會顯示 SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead"。這是正常現象,並非遭受入侵。Webmin 在安裝時已生成自簽署憑證 (/etc/webmin/miniserv.pem),由於沒有憑證授權單位 (CA) 為其背書,瀏覽器會靜默拒絕信任該憑證。連線仍受加密保護,只是未經過驗證。目前請直接點擊繼續(點選 Advanced,然後點選 Proceed)— 我們會在後續步驟中正確替換此憑證。

使用 root 或具備 sudo 權限的使用者及其 Unix 密碼登入,即可進入 System Information 儀表板。此處常見的錯誤是在網址列輸入 http:// 而非 https://。在該連接埠上,miniserv 會以純 HTTP 模式回應並顯示 "This web server is running in SSL mode. Try the URL https://..." — 解決方法只需將網址列中的 http 改為 https

安全決策:如何連線至 Webmin?

這是關鍵部分。具備 root 權限的控制面板不應直接暴露於公開網路,以避免全球掃描器嘗試登入。您有兩個可行的方案,按推薦程度排序。

方案 B 的 SSH tunnel 是較佳選擇,因為它完全不暴露任何服務。若您的 IP 為固定 IP,方案 A 的 IP allowlist 亦可接受。若兩者皆不採取,正是本指南旨在避免的錯誤。若您希望透過私有網路連線至 Webmin,請將主機置於 self-hosted WireGuard VPN 後方,並將 Webmin 綁定至 tunnel 位址而非公用位址。

選項 A:限制 Webmin 僅限您的 IP 存取

在控制面板中,開啟 Webmin,接著進入 Webmin Configuration,然後選擇 IP Access Control。選擇 "Only allow from listed addresses" 並輸入您的公用 IP。您可以在筆記型電腦上執行 curl ifconfig.me 來取得該 IP。點擊 Save。Webmin 會將此設定寫入 /etc/webmin/miniserv.conf 中的 allow= 行並重新啟動。

潛在風險:若您的家用 IP 是動態 IP 且發生變動,或是輸入地址時發生錯誤,您將會被鎖在系統外。瀏覽器會顯示 "Access denied for <your IP>" 且不顯示登入表單,且沒有其他網頁路徑可以重新進入。您必須透過 SSH 或供應商提供的 VNC,從伺服器主控台進行修復:

sudo nano /etc/webmin/miniserv.conf
# find the line that begins  allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webmin

刪除 allow= 行即可恢復完全開放的存取權限。請僅在需要恢復存取時執行此操作,並在操作後立即設定正確的數值。

Option B: 綁定至 localhost 並透過 SSH 建立隧道 (建議方案)

與使用白名單相比,完全不監聽公用介面是更佳的做法。設定 miniserv 僅綁定至 loopback,接著透過您已信任的加密 SSH 隧道進行連線。

編輯 /etc/webmin/miniserv.conf 並新增或修改以下行:

bind=127.0.0.1

使用 sudo systemctl restart webmin 重啟。Webmin 現在無法從網際網路存取 —— 對 10000 埠進行 port scan 將找不到任何結果,且先前的 ss 檢查現在會顯示其綁定於 127.0.0.1:10000。請從您的筆記型電腦開啟隧道:

ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP

保持該連線開啟,並瀏覽至 https://localhost:10000。流量會在 SSH 內部傳輸,而 SSH 已透過您的金鑰進行驗證並加密,因此您可以安全地接受自簽章憑證 —— SSH 層才是真正的保護機制。關閉 SSH 連線後,Webmin 將無法連線。無需設定白名單,無需暴露服務,也不需額外強化服務安全性。

如果您設定了 bind=127.0.0.1 卻忘記開啟隧道,遠端存取將直接停止 —— 這是功能運作正常,而非錯誤。請依照 Option A 的方式進行復原:從 console 移除 bind 行或設定 bind=0.0.0.0,然後重啟。這與您為了連線至 在 tmux 中執行 Claude Code 的遠端開發機 而使用的隧道方式相同 —— 僅需一個 SSH 連線,即可確保所有內容皆為私密,且公用介面上不會有額外服務在監聽。

將自簽章憑證替換為正式憑證

若您在 Option A 中使用主機名稱來公開 Webmin,請使用正式的 Let's Encrypt 憑證來消除瀏覽器警告。您需要一個 DNS 名稱(例如 panel.example.com),其 A record 需指向該伺服器,且必須有服務在 port-80 處理 HTTP challenge 以進行驗證。

Webmin 已內建此功能:進入 Webmin,接著選擇 Webmin Configuration,然後選擇 SSL Encryption,最後點選 Let's Encrypt 頁籤。輸入主機名稱,將 "website root directory" 指向該網域在 port 80 上所提供的路徑,然後點擊請求。Webmin 會自動取得憑證,為您更新 miniserv.conf 中的 certfile=keyfile= 行,並在憑證過期前自動續期。重新整理頁面後,鎖頭圖示將顯示正常。

唯一的限制:Webmin 內建伺服器運行於 port 10000 而非 port 80,因此 http-01 challenge 需要一個真正的 Web server(如 Apache 或 nginx)在 port 80 處理 panel.example.com,或是改用基於 DNS 的驗證方式。若該主機僅安裝 Webmin 且 port 80 沒有任何服務,則請求會因驗證錯誤而失敗,直到您提供 Let's Encrypt 一種可以存取該 challenge 檔案的方式。其運作機制(DNS records、port-80 challenge 與續期)與為任何網站核發憑證的方式相同。若需了解相關背景,請參閱 使用 Certbot 與 nginx 取得 Let's Encrypt TLS 憑證指南,該文件詳細說明了驗證流程與 DNS 設定。若您使用的是 SSH-tunnel 方式,可以完全跳過此章節:在 SSH 後端使用自簽章憑證即可,因為即使為 panel.example.com 核發了正式憑證,在訪問 https://localhost:10000 時仍會產生名稱不符(name-mismatch)的警告。

啟用雙重驗證

僅靠密碼對 root 控制台的保護力不足,請加入第二個驗證因素。開啟 Webmin,接著進入 Webmin Configuration,然後選擇 Two-Factor Authentication。選擇 Google Authenticator 提供者(此為標準 TOTP,可與 Authy、1Password 或任何驗證器 App 搭配使用)並儲存。Webmin 會安裝所需的 Perl 模組(Authen::OATH 以及 QR code 產生器)並啟用此功能;僅完成此步驟尚未保護任何帳戶。

接著每個帳戶需註冊其專屬裝置。啟用 2FA 後,開啟 Webmin,進入 Webmin Users,選擇該帳戶,點選 Enable Two-Factor For User,Webmin 會顯示 QR code;請使用 App 掃描並輸入一個產生的驗證碼以進行確認。此後,登入時在輸入密碼後,系統會要求輸入六位數的 token。請在登出前完成註冊 —— 若已啟用 2FA 但帳戶尚未掃描驗證碼,雖然仍可從 console 清除此要求,但先完成註冊會簡單得多。

使用 Fail2ban 封鎖暴力破解登入

即使是受限的登入端點,也應針對重複的失敗嘗試進行懲罰。Webmin 會將登入失敗紀錄於 syslog,格式為 webmin[12345]: Invalid login as root from 10.0.0.9;若使用者名稱並非 Unix 帳號,則格式為 Non-existent login as ...。在 Ubuntu 24.04 上,由於預設映像檔不包含 /var/log/auth.log,這些紀錄會進入 systemd journal。Fail2ban 內建的 webmin-auth 篩選器可精準比對這兩行紀錄,且下方的 jail 設定會自動設定 backend = systemd,因此不需要自定義 regex 或 log 路徑。

建立 /etc/fail2ban/jail.d/webmin.local

[webmin-auth]
enabled  = true
port     = 10000
filter   = webmin-auth
backend  = systemd
maxretry = 4
bantime  = 1h

使用 sudo systemctl restart fail2ban 重新載入,並確認 jail 已啟用:

sudo fail2ban-client status webmin-auth

你應該會看到 jail 已列出,且初始封鎖計數器為零(若使用 journal 後端,則不會有 File list: 行)。若要測試完整流程,請從另一個網路刻意嘗試登入失敗幾次,接著重新執行 status 指令並觀察 Currently banned 的數值上升。若數值未變動,請確認測試來源不在 Fail2ban 的 ignoreip 之中,並在伺服器執行 journalctl SYSLOG_IDENTIFIER=webmin 以確認 Invalid login 行確實有被寫入。若此主機尚未安裝 Fail2ban,請參閱 Fail2ban on Ubuntu 24.04 for SSH 指南,該文件涵蓋了安裝步驟,以及應與此教學同時運行的 SSH jail 設定。

限制 Webmin 使用者的權限範圍

並非所有需要使用控制台的使用者都需要 root 權限。請前往 Webmin > Webmin Users 建立額外的 Webmin 登入帳號,並僅授予該使用者所需的模組權限。例如:僅提供 cron 與 filesystem 模組權限的備份作業員。編輯使用者時會顯示所有模組的清單;取消勾選即可將該模組從使用者的選單中移除,並封鎖對應的 URL。這是一種深度防禦機制:即使低權限的 Webmin 工作階段遭竊,若其清單中未包含 Users 模組,也無法修改 /etc/shadow

保持 Webmin 為最新版本

由於您是透過 apt 儲存庫安裝,sudo apt update && sudo apt upgrade 會隨系統其他套件一同取得 Webmin 的新版本。請務必及時安裝補丁,因為控制面板是常見的攻擊目標。Webmin 也可以透過 Webmin > Webmin Configuration > Upgrade Webmin 進行自我更新,但在 Ubuntu 上使用 apt 路徑更為簡潔,因為這能確保版本與其他套件管理工具保持一致。請務必執行此操作:過去數個 Webmin 的 CVE 漏洞皆為遠端程式碼執行 (remote-code-execution) 漏洞,系統是否從「已修補」轉為「遭入侵」,完全取決於管理員執行更新的速度。

Failure modes, with the strings you will see

"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID 於首次載入時顯示。原因:Webmin 在安裝時產生的自簽章憑證缺乏受信任的發行者。這並非攻擊;連線已加密,只是未經驗證。解決方法:暫時忽略警告並繼續操作,之後再核發正式的 Let's Encrypt 憑證;若透過 SSH tunnel 連線至 Webmin,則可永久接受此警告。

"This web server is running in SSL mode. Try the URL https://..." 您輸入了 http://server:10000。miniserv 在該連接埠僅支援 TLS,並以純文字告知。解決方法:在網址列將 http 改為 https

Page times out — ERR_CONNECTION_TIMED_OUT / "This site can't be reached"。 請求未送達 Webmin。在 Ubuntu 系統中,這通常是因為 ufw 封鎖了 port 10000。請使用 sudo ufw status 確認;若未列出 10000,請使用 sudo ufw allow 10000/tcp 開放該連接埠,或者更好的做法是保持關閉,並使用 Option B 的 SSH tunnel。請注意區別:timeout 代表防火牆正在靜默丟棄封包,而 ERR_CONNECTION_REFUSED 則代表連接埠可連通但 Webmin 未運行 — 請檢查 sudo systemctl status webmin

"Access denied for <your IP>。" 您在 Option A 設定了 IP Access Control,而目前的位址不在允許清單中 — 可能是動態 IP 已變更或輸入錯誤。此情況無法透過瀏覽器恢復存取。從 console 解決方法:編輯 /etc/webmin/miniserv.conf 中的 allow= 行,修正或刪除該行,然後執行 sudo systemctl restart webmin

使用已知正確的憑證時顯示 "Login failed. Please try again."。 該帳戶沒有 Unix password,這在僅限 SSH key 的雲端映像檔中是常見情況。Webmin 透過 PAM 使用 Unix password 進行驗證,而該使用者並不存在此密碼。解決方法:在伺服器執行 sudo passwd youruser,然後再登入。若 /var/webmin/miniserv.log 顯示 Non-existent login as ...,代表您輸入的用戶名並非 Unix 帳戶。

若管理超過兩台伺服器,自動化比在每台機器上安裝控制台更具擴展性:your first Ansible playbook 是起點。

FAQ

將 Webmin 暴露於公網是否安全?

將暴露於網路的 Webmin 視為帶有登入頁面的 root shell,因為事實正是如此。僅在具備多層防護時才算「相對安全」:必須使用正式憑證、雙重驗證 (2FA)、Fail2ban,並搭配嚴格的 IP 白名單,或者更理想的做法是完全不暴露於公網。風險最低的設定方式是將 Webmin 綁定至 127.0.0.1 並透過 SSH tunnel 存取,如此 port 10000 在開放網路中將不會回應任何請求。

如何消除 Webmin 憑證警告?

出現警告 (NET::ERR_CERT_AUTHORITY_INVALID) 是因為 Webmin 內建自簽章憑證。請透過 Webmin 的 Webmin Configuration > SSL Encryption > Let's Encrypt 取得正式憑證;使用指向該伺服器的 DNS 名稱,並確保該名稱能透過 port-80 驗證挑戰。若您僅透過 SSH tunnel 連線至 localhost 存取 Webmin,則該警告無害,因為 SSH 已完成連線加密與驗證,您可以安全地接受自簽章憑證。

如何限制 Webmin 僅允許我的 IP 位址存取?

前往 Webmin > Webmin Configuration > IP Access Control,選擇 "Only allow from listed addresses",並輸入您在 curl ifconfig.me 的公用 IP。Webmin 會將此設定儲存在 /etc/webmin/miniserv.confallow= 行中。請注意動態家用 IP 的風險:若 IP 變動,您將被鎖在系統外,必須從伺服器主控台修復 allow= 行;因此在實務上,使用固定 IP 或 SSH-tunnel 方法更為可靠。

為什麼密碼正確卻無法登入?

Webmin 透過 PAM 對照您的 Unix 密碼進行驗證。雲端映像檔的預設帳號通常僅設定金鑰 (key-only) 而未設定密碼,導致 PAM 無法比對而拒絕登入。請在伺服器執行 sudo passwd youruser 來設定密碼後再行登入。若 /var/webmin/miniserv.log 中出現 Non-existent login as ... 行,則代表該使用者名稱本身並非真實的 Unix 帳號。

與單純使用 SSH 相比,Webmin 的優點為何?

Webmin 提供的是易用性與功能發現層。對於瀏覽 log 檔案、管理使用者與 cron、編輯防火牆規則,以及查看磁碟與服務狀態等操作,無需記憶指令即可完成,這對偶發性的管理員或技能組合多元的團隊非常方便。單純使用 SSH 在執行常規工作時速度更快、易於撰寫腳本,且攻擊面更小。許多管理員會同時使用兩者:日常操作使用 SSH,而將 Webmin 綁定至 localhost 並透過 tunnel 供偶爾進行點選式操作。