SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Ubuntu 24.04 安裝 Webmin 並完成安全設定

在 Ubuntu 24.04 安裝 Webmin,接著以 SSH tunnel 或 IP allowlist 限制存取,設定 Let's Encrypt 憑證、雙因素驗證,並在 port 10000 啟用 Fail2ban。

建置內容

Webmin 是一個 Web 控制面板,透過瀏覽器管理整台 Linux 伺服器,包括使用者、套件、cron 工作、防火牆、Apache、BIND、磁碟及上百個其他模組。它會透過 HTTPS 在埠 10000 上提供存取。安裝本身只需執行 3 個命令,大約 1 分鐘即可完成。本指南將大部分篇幅放在後半段,是因為 Webmin 會以 root 登入,並能執行 root 可執行的所有操作。完全開放或未經驗證的 Webmin 並不是「需要管理的風險」,而是前面多了一個登入頁面的完整伺服器遭入侵事件。因此,請在 10 分鐘內完成安裝,接著用剩餘的時間確認只有你能連線到它。

先備條件與一項重要提醒

準備一台全新的 Ubuntu 24.04 KVM VPS,並使用 root 或具備 sudo 權限的使用者。Webmin 以 Perl 撰寫且資源需求低,1 GB RAM 已十分充裕,閒置時的記憶體用量通常低於四分之一 GB。它會透過內建的 Web 伺服器監聽 TCP 10000 埠(miniserv.pl),不會使用 Apache 或 nginx,因此不必先安裝其他元件。

開始前要先決定兩件事。第一,決定登入帳號:Webmin 會透過 PAM 對 Unix 帳號進行驗證,因此要使用 root,或使用 sudo 群組中的使用者,並輸入該帳號的 Unix 密碼 登入。雲端映像通常只允許使用金鑰登入,預設使用者未設定密碼;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 Webmin stable 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 自己的 server image 預設不會啟用 ufw,但許多供應商會預先啟用。這種情況會在下方的故障模式一節說明。如果連接埠已開放,瀏覽器會顯示整頁封鎖訊息:Chrome 顯示 「您的連線不是私人連線」,並附上代碼 NET::ERR_CERT_AUTHORITY_INVALID;Firefox 則顯示 SEC_ERROR_UNKNOWN_ISSUER/「警告:前方可能有安全性風險」。這是預期行為,不代表遭到入侵。Webmin 在安裝時產生了自簽憑證(/etc/webmin/miniserv.pem)。由於沒有憑證授權單位為此憑證背書,瀏覽器不會在沒有提示的情況下信任它。連線仍然經過加密,只是沒有憑證授權單位背書。現在先按一下 Advanced,再按 Proceed 以繼續;稍後會正式替換這張憑證。

使用 root 或 sudo 使用者及其 Unix 密碼登入,接著會進入 System Information 儀表板。這裡常見的錯誤是輸入 http://,而不是 https://。miniserv 會在該連接埠以純 HTTP 回應,並顯示完整文字 「此 Web server 正以 SSL 模式執行。請嘗試使用 URL https://...」。修正方式很簡單,只要在網址列將 http 改為 https 即可。

安全決策:你要如何連線到 Webmin?

現在進入關鍵部分。具備 root 等效權限的管理面板,不應直接暴露在公開網際網路上,接受全球各地掃描器發出的登入嘗試。你有兩個合理選項,以下依建議優先順序排列。所有自架管理介面都會遇到相同問題;因此,Vaultwarden 是否安全取決於其管理端點與備份檔案,而不是取決於加密功能。

選項 B 中的 SSH tunnel 較佳,因為它完全不對外暴露任何服務。如果你的 IP 位址固定,選項 A 的 IP allowlist 也可以接受。兩者都不採用,正是這份指南要避免的錯誤。如果你希望透過 private network,而不是上述任一方式連線到 Webmin,請將主機置於自架的 WireGuard VPN後方,並將 Webmin 綁定至 tunnel 位址,而非公開位址。

選項 A:將 Webmin 限制為僅允許您的 IP

在面板中開啟 Webmin,接著開啟 Webmin Configuration,再開啟 IP Access Control。選取 「Only allow from listed addresses」,然後輸入您的公開 IP。您可以在筆記型電腦上執行 curl ifconfig.me 查詢此 IP。儲存設定。Webmin 會將此設定寫入 /etc/webmin/miniserv.conf 中的 allow= 行,然後重新啟動自身。

注意:如果您的住家 IP 是動態 IP 且發生變更,或您誤輸入 IP 位址,就會失去存取權。此時瀏覽器會顯示 「Access denied for <your IP>」,不會顯示登入表單,也沒有可透過 Web 介面重新登入的方式。您必須透過 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= 行會恢復完全開放的存取權。因此只能將此操作用於復原,然後立即設定正確的值。

選項 B:繫結至 localhost,透過 SSH 建立通道(建議)

比任何 allowlist 更安全的做法,是完全不要在公開介面上監聽。讓 miniserv 只繫結至 loopback,再透過你已信任的加密 SSH 通道連線。

編輯 /etc/webmin/miniserv.conf,加入或修改以下一行:

bind=127.0.0.1

使用 sudo systemctl restart webmin 重新啟動。現在 Webmin 無法從網際網路連線;對 10000 埠進行連接埠掃描時不會發現任何服務,而稍早的 ss 檢查現在會顯示它繫結至 127.0.0.1:10000。在筆記型電腦上建立通道:

ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP

保持該工作階段開啟,然後瀏覽 https://localhost:10000。網路流量會在 SSH 內傳輸。SSH 已由你的 cryptographic key 完成驗證並加密,因此在此接受 self-signed certificate 即可;真正提供保護的是 SSH 層。關閉 SSH 工作階段後,Webmin 就無法連線。無須設定 allowlist,沒有公開暴露的服務,也不需要強化額外服務。

如果設定了 bind=127.0.0.1 卻忘記建立通道,遠端存取會直接停止。這表示功能正常運作,不是故障。按照選項 A 的方式復原:從主控台移除 bind 這一行,或設定 bind=0.0.0.0,然後重新啟動。這與透過 SSH 連線至 在 tmux 中執行 Claude Code 的遠端開發主機時採用的通道方式相同:只需一個 SSH 工作階段,所有內容都保持私有,公開介面上不會有額外服務監聽。

使用正式憑證取代自簽憑證

如果您在 Option A 中公開 Webmin,請使用正式的 Let's Encrypt 憑證,移除瀏覽器警告。您需要一個憑證名稱,以及讓 Let's Encrypt 在驗證期間連線到 80 埠的方法。憑證名稱通常是 DNS 名稱,例如 panel.example.com,並在 DNS 中建立指向該伺服器的 A 記錄。自 Webmin 2.650(於 June 25, 2026 發布)起,也可以使用伺服器的公開 IP 位址,但必須安裝 Certbot 5.3 或更新版本。Let's Encrypt 只會在其 short-lived profile 上簽發 IP 憑證,有效期約 six days。因此,請將 Webmin 的自動續期間隔設為天數;對於 IP 憑證,Webmin 不接受更長的間隔。

Webmin 已內建此功能:Webmin,接著選取 Webmin Configuration,再選取 SSL Encryption,最後開啟 Let's Encrypt 分頁。輸入主機名稱或 IP 位址,選擇驗證方法,然後提出申請。Webmin 會取得憑證、替您更新 certfile= 和 keyfile= 行中的設定(位於 miniserv.conf),並在憑證到期前自動續期。重新載入頁面後,網址列的鎖頭便不會再顯示警告。

唯一需要注意的是:Webmin 自身的伺服器使用 10000 埠,而不是 80 埠,因此必須由其他服務在 80 埠回應 http-01 challenge。您有 three 種處理方式。如果 Apache 或 nginx 已在 80 埠提供該名稱的服務,請將驗證指向該網站的文件目錄(若使用 IP 位址,則需要 Certbot 5.4 或更新版本)。如果 80 埠沒有服務,請選擇 Certbot 內建的 Web server,也就是 Webmin 在 version 2.110 新增的 standalone mode:Certbot 會暫時在 80 埠啟動自己的 Web server,因此必須安裝 Certbot,且 80 埠必須未被占用並已在防火牆中放行。您也可以使用 DNS validation;此方法適用於主機名稱,但不適用於 IP 位址。Ubuntu 24.04 隨附的 certbot package 版本為 2.9,足以對主機名稱執行 standalone validation,但版本過舊,無法申請 IP 憑證;若要申請 IP 憑證,請安裝目前版本的 Certbot,例如 snap 版本;截至 October 2026,其版本為 5.8。如果以上方法都未使用,申請會因 validation error 而失敗。相關流程、DNS records、port-80 challenge 與 renewal,和為任何網站簽發憑證的方式相同。若要了解背景資訊,請參閱 使用 Certbot 和 nginx 設定 Let's Encrypt TLS 憑證指南,其中會詳細說明驗證流程與 DNS 設定。如果您採用 SSH-tunnel 方式,可以完全略過本節:自簽憑證在 SSH 後方使用沒有問題;而針對 panel.example.com 簽發的正式憑證,在您造訪 https://localhost:10000 時仍只會產生名稱不符警告。

啟用雙因素驗證

僅使用密碼不足以保護 root 管理介面,因此請加入第二個驗證因素。開啟 Webmin,接著依序選取 Webmin Configuration,再選取 Two-Factor Authentication。選取 Google Authenticator provider。這是標準的 TOTP,可搭配 Authy、1Password 或任何驗證器應用程式使用,然後儲存設定。Webmin 會安裝所需的小型 Perl 模組(Authen::OATH 及 QR 產生器),並啟用此功能;但這個步驟本身尚未保護任何帳戶。

之後,每個帳戶都必須註冊自己的裝置。啟用 2FA 後,開啟 Webmin,接著依序選取 Webmin Users,選取帳戶,再選擇 Enable Two-Factor For User。Webmin 會顯示 QR code;使用應用程式掃描後,輸入一組產生的驗證碼以確認。之後登入時,輸入密碼後還必須輸入 6 位數 token。請在登出前完成註冊。如果已要求使用 2FA,但帳戶尚未掃描任何驗證碼,仍可從 console 清除這項要求,但先完成註冊會簡單許多。

將 Fail2ban 加入以封鎖暴力破解登入

即使登入端點已受限制,也應對反覆失敗的嘗試進行封鎖。Webmin 會將失敗登入以 webmin[12345]: Invalid login as root from 10.0.0.9 的格式記錄到 syslog;如果使用的使用者名稱甚至不是 Unix 帳戶,則會記錄為 Non-existent login as ...。在 Ubuntu 24.04 上,這些行會寫入 systemd journal,因為標準映像沒有 /var/log/auth.log。Fail2ban 提供可直接使用的 webmin-auth filter,能精確比對這兩行;以下 jail 會自行設定 backend = systemd,因此不需要自訂 regex 或 log path。

建立 /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 列出,ban 計數為 0(使用 journal backend 時,不會有 File list: 行)。若要端對端確認設定有效,請從其他網路故意讓登入失敗數次,然後再次執行 status command,並監看 Currently banned 是否增加。如果計數始終沒有增加,請確認測試來源位址不在 Fail2ban 的 ignoreip 中,並在伺服器上執行 journalctl SYSLOG_IDENTIFIER=webmin,確認 Invalid login 行確實有被寫入。如果這台伺服器尚未安裝 Fail2ban,請參閱 Ubuntu 24.04 上的 Fail2ban SSH 指南,其中涵蓋安裝方式及應與本 jail 同時執行的 SSH jail。

限制每個 Webmin 使用者可操作的範圍

並非所有需要使用控制面板的人都需要對所有項目擁有 root 權限。在 Webmin,接著是 Webmin Users 中建立額外的 Webmin 登入帳號,並只授予每個帳號所需的模組。例如,備份操作人員只需使用 cron 和檔案系統模組。編輯使用者時,畫面會列出所有模組的核取方塊;取消勾選某個模組後,該模組會從使用者的選單中移除,並封鎖其底層 URL。這是縱深防禦的一環:即使低權限的 Webmin 工作階段遭竊,當 Users 模組未列入其權限清單時,也無法改寫 /etc/shadow。

保持 Webmin 更新

因為你是從 apt repository 安裝,sudo apt update && sudo apt upgrade 會隨系統的其他套件一併取得新版 Webmin。請立即套用修補程式,因為控制面板是常見的攻擊目標。Webmin 也能透過 Webmin、再選 Webmin Configuration,接著選 Upgrade Webmin 自行更新,但在 Ubuntu 上使用 apt 的方式更簡潔,因為能讓版本與其他套件管理維持一致。不要把這視為選擇性工作:過去數個 Webmin CVE 曾是遠端程式碼執行漏洞,而「已套用修補程式」與「遭入侵」之間唯一的差別,就是管理員執行升級的速度。

故障情況與你會看到的訊息

「你的連線不是私人連線」/NET::ERR_CERT_AUTHORITY_INVALID。 第一次載入時就會顯示。原因是 Webmin 在安裝時產生的自簽憑證沒有受信任的簽發者。這不是攻擊;通道已加密,只是沒有受信任的憑證背書。修正方式:目前先通過警告頁面,之後申請正式的 Let's Encrypt 憑證;如果你是透過 SSH tunnel 存取 Webmin,也可以永久接受這份憑證。

「此 Web 伺服器正在 SSL 模式中執行。請嘗試使用 URL https://...」 你輸入了 http://server:10000。miniserv 只會在該埠使用 TLS,並以明文告知你這件事。修正方式:在網址列中將 http 改為 https。

頁面逾時、ERR_CONNECTION_TIMED_OUT/「無法連線到此網站」。 請求根本沒有到達 Webmin。在 Ubuntu 上,常見原因是 ufw 捨棄了連至 10000 埠的封包,但請先檢查,不要直接假設如此。執行 sudo ufw status。如果顯示 Status: inactive,表示 ufw 沒有封鎖任何流量(Ubuntu 預設停用 ufw,而且新增允許規則不會啟用它),因此請繼續檢查更上游的位置,例如服務供應商控制面板中的防火牆。如果顯示 Status: active,請執行 sudo ufw status verbose 查看預設的入站政策與其他較廣泛的規則;如果入站流量遭拒絕,且清單中沒有 10000,請使用 sudo ufw allow 10000/tcp 開放該埠,或更建議維持關閉,改用 Option B 的 SSH tunnel。請注意兩者的差異:逾時表示防火牆靜默捨棄封包,而 ERR_CONNECTION_REFUSED 表示該埠可連線,但 Webmin 並未執行,請檢查 sudo systemctl status webmin。

「拒絕存取 <your IP>。」 你已在 Option A 中設定 IP Access Control,但目前的位址不在允許清單中,可能是動態 IP 已變更,也可能是輸入錯誤。無法透過瀏覽器返回。請從主控台修正:編輯 /etc/webmin/miniserv.conf 中的 allow= 行,修正或刪除該行,然後執行 sudo systemctl restart webmin。

使用你確定正確的認證資訊時仍顯示「登入失敗。請再試一次。」 此帳戶沒有 Unix 密碼;在僅使用金鑰的雲端映像檔上,這是標準設定。Webmin 會透過 PAM 使用 Unix 密碼進行驗證,而該使用者並不存在這個密碼。修正方式:在伺服器上執行 sudo passwd youruser,然後登入。如果 /var/webmin/miniserv.log 顯示 Non-existent login as ...,表示你輸入的使用者名稱根本不是 Unix 帳戶。

如果伺服器超過幾台,與其在每台伺服器上安裝控制面板,使用自動化方式更容易擴充:你的第一個 Ansible playbook 就是從這裡開始。

FAQ

將 Webmin 暴露在公開網際網路上是否安全?

請將面向網際網路的 Webmin 視為附有登入頁面的 root shell,因為它實際上就是如此。只有採取多層防護後,安全性才算足夠:使用有效憑證、雙因素驗證、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 名稱;如果已安裝 Certbot 5.3 或更新版本,也可以使用伺服器的公開 IP 位址。挑戰驗證需要能夠連線至 port 80,並由現有的 web server 或 Certbot 自己的 standalone server 回應。如果你只會透過 SSH tunnel 連線至 localhost,這項警告不會造成問題。SSH 已經會加密並驗證連線,因此可以安全地接受自我簽署憑證。

如何將 Webmin 限制為只有我的 IP 位址可以存取?

前往 Webmin、Webmin Configuration、IP Access Control,選取「Only allow from listed addresses」,然後輸入 curl ifconfig.me 顯示的公開 IP。Webmin 會將設定儲存在 /etc/webmin/miniserv.conf 的 allow= 行中。請注意家用網路的動態 IP:如果位址變更,你會被鎖在系統外,只能從伺服器主控台修復 allow= 行。因此,使用固定位址或 SSH tunnel 方法在實務上更可靠。

為什麼使用正確密碼仍然無法登入?

Webmin 會透過 PAM 驗證 Unix 密碼,而 cloud image 通常只允許使用金鑰登入,預設帳號也未設定密碼。因此 PAM 沒有可比對的密碼,登入就會遭拒。在伺服器上執行 sudo passwd youruser 設定密碼,然後再登入。如果 /var/webmin/miniserv.log 中有 Non-existent login as ... 行,則表示該使用者名稱本身不是有效的 Unix 帳號。

相較於直接使用 SSH,Webmin 適合用來做什麼?

Webmin 提供探索與便利操作的介面。它適合用來瀏覽日誌、管理使用者與 cron、編輯防火牆規則,以及查看磁碟與服務狀態,無須記住每個指令。對偶爾管理伺服器的人員或技能各異的團隊而言,這些功能很實用。直接使用 SSH 的速度較快、適合撰寫指令碼,而且在例行工作中暴露的攻擊面小得多。許多管理員會同時使用兩者:日常操作使用 SSH,偶爾需要點選操作時,則將 Webmin 綁定至 localhost,再透過 tunnel 存取。如果你真正想比較的是管理面板,而不是面板與 shell,建議先評估 Cockpit 與 Webmin 的比較,因為兩者在可修改的系統範圍,以及驗證使用者身分的方式上都有差異。