SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-13

Ubuntu 24.04 安装并安全配置 Webmin

在 Ubuntu 24.04 安装 Webmin,并保护 HTTPS 10000 端口:使用 SSH 隧道或 IP 白名单、配置真正的 Let's Encrypt 证书、启用双因素认证和 Fail2ban。

构建内容

Webmin 是一个 Web 控制面板,可通过浏览器管理整台 Linux 服务器,包括用户、软件包、cron 作业、防火墙、Apache、BIND、磁盘以及上百个其他模块。它通过 HTTPS 的 10000 端口提供访问。安装只需执行三条命令,大约需要一分钟。本指南大部分篇幅用于介绍后续配置,因为 Webmin 以 root 身份登录,并且可以执行 root 能执行的所有操作。完全开放访问或未进行身份验证的 Webmin 不是“需要管理的风险”,而是一个带有登录页面的完整服务器入侵入口。因此,您可以在十分钟内完成安装,然后用剩余时间确保只有您能够访问它。

先决条件和一个坦诚的警告

您需要一台全新的 Ubuntu 24.04 KVM VPS,并拥有 root 或 sudo 用户权限。Webmin 使用 Perl 编写,资源占用较低,1 GB RAM 足够使用,空闲时占用远低于四分之一 GB。它通过自带的 Web 服务器(miniserv.pl)监听 TCP 10000 端口,而不是 Apache 或 nginx,因此无需先安装其他组件。

开始前需要决定两件事。第一,确定用于登录的账户:Webmin 通过 PAM 对 Unix 账户进行身份验证,因此您需要使用 root 账户,或使用属于 sudo 组的用户,并输入该账户的 Unix 密码 登录。云镜像通常只允许使用密钥登录,默认用户未设置密码,而 Webmin 无法登录无密码账户。请先使用 sudo passwd youruser 设置密码,否则无论输入什么内容,登录都会失败。

第二,这是一条警告:不要直接将 10000 端口开放到互联网后置之不理。现在就决定您是通过 SSH 隧道访问 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;在 Ubuntu 24.04 上,失败的登录会写入 syslog,即 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 自带的服务器镜像默认不会启用 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 服务器正在 SSL 模式下运行。请尝试使用 URL https://...”。解决方法是在地址栏中将 http 改为 https

安全决策:您将如何访问 Webmin?

现在进入关键部分。一个具有 root 等效权限的面板不应直接暴露在公网,接受全球扫描器发起的登录尝试。您有两个合理的选项,推荐顺序如下。所有自托管管理界面都会遇到同一个问题。因此,Vaultwarden 是否安全取决于其管理端点和备份文件,而不是其加密机制。

选项 B 中的 SSH 隧道更好,因为它完全不暴露服务。选项 A 中的 IP 允许列表在您的地址固定时可以接受。两者都不采用,正是本指南要避免的错误。如果您更希望通过私有网络而不是上述任一方式访问 Webmin,可以将服务器置于自托管的 WireGuard VPN之后,并让 Webmin 绑定隧道地址,而不是公网地址。

选项 A:将 Webmin 限制为仅允许您的 IP 访问

在面板中依次打开 Webmin、Webmin Configuration、IP Access Control。选择 “Only allow from listed addresses”,然后输入您的公网 IP。您可以在笔记本电脑上运行 curl ifconfig.me 获取该地址。保存设置。Webmin 会将配置写入 /etc/webmin/miniserv.conf 中的 allow= 行,然后自动重启。

注意:如果您的家庭 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

删除 /etc/webmin/miniserv.conf 中的 allow= 行会恢复完全开放的访问权限。因此只能在恢复访问时执行此操作,然后立即设置正确的值。

选项 B:绑定到 localhost,并通过 SSH 建立隧道(推荐)

比任何允许列表更安全的做法,是完全不在公网接口上监听。让 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 已由您的密钥完成身份验证并加密,因此可以在此安全地接受自签名证书;真正提供保护的是 SSH 层。关闭 SSH 会话后,Webmin 就无法访问了。不需要配置允许列表,也没有暴露的服务,不需要额外加固其他服务。

如果设置了 bind=127.0.0.1 后忘记建立隧道,远程访问会直接停止。这表示功能正常,而不是发生故障。按照选项 A 的方式恢复:从控制台删除 bind 行,或设置 bind=0.0.0.0,然后重启。这与访问 在 tmux 中运行 Claude Code 的远程开发主机时使用的隧道方式相同:一个 SSH 会话,所有内容都保持私有,不在公网接口上监听额外服务。

替换自签名证书

如果您在选项 A 中通过主机名公开 Webmin,可以使用正式的 Let's Encrypt 证书消除浏览器警告。您需要一个 DNS 名称,例如 panel.example.com,并为其配置指向服务器的 A 记录;验证期间,还需要有服务响应端口 80 上的 HTTP challenge。

Webmin 内置了此功能:Webmin,然后依次选择 Webmin Configuration、SSL Encryption 和 Let's Encrypt 选项卡。输入主机名,将“website root directory”指向该域名在端口 80 上提供服务的路径,然后提交申请。Webmin 会获取证书,为您更新 miniserv.conf 中的 certfile=keyfile= 行,并在证书过期前自动续期。重新加载页面后,浏览器地址栏中的锁形图标将不再显示警告。

需要明确的一点是:Webmin 自身运行在端口 10000,而不是端口 80。因此,http-01 challenge 需要由 Apache 或 nginx 等实际 Web 服务器在端口 80 上为 panel.example.com 提供响应;也可以改用基于 DNS 的验证。在仅运行 Webmin、端口 80 没有任何服务的服务器上,申请会因验证错误而失败,直到您为 Let's Encrypt 提供访问 challenge 文件的方式。具体机制、DNS 记录、端口 80 challenge 和续期流程,与为任意网站签发证书相同。如果您需要了解相关背景,使用 Certbot 和 nginx 配置 Let's Encrypt TLS 证书指南会详细介绍验证流程和 DNS 配置。如果您采用了 SSH 隧道方式,可以完全跳过本节:自签名证书在 SSH 隧道后使用没有问题;而为 panel.example.com 签发的正式证书在访问 https://localhost:10000 时仍会因名称不匹配而产生警告。

启用双因素身份验证

仅靠密码不足以保护 root 管理面板,因此应添加第二个因素。打开 Webmin,然后依次进入 Webmin Configuration 和 Two-Factor Authentication。选择 Google Authenticator 提供程序,即标准 TOTP,因此可与 Authy、1Password 或任何身份验证器应用配合使用,然后保存。Webmin 会安装所需的小型 Perl 模块(Authen::OATH 以及 QR 码生成器)并启用该功能;仅完成此步骤还不会保护任何账户。

随后,每个账户都需要单独注册自己的设备。启用 2FA 后,打开 Webmin,然后进入 Webmin Users,选择账户,再选择 Enable Two-Factor For User。Webmin 会显示 QR 码;使用应用扫描该二维码,并输入一个生成的代码进行确认。此后,登录时会要求在密码之后输入六位数令牌。请在退出登录前完成注册;如果已要求使用 2FA,但您的账户从未扫描过代码,仍可通过控制台清除该要求,但先完成注册会简单得多。

为 Webmin 添加 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 过滤器,能够准确匹配这两行;下面的 jail 会自行设置 backend = systemd,因此无需自定义正则表达式或日志路径。

创建 /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 已列出,封禁计数为 0(使用 journal 后端时不会显示 File list: 行)。要端到端验证配置,请从其他网络故意多次登录失败,然后重新运行状态命令并监控 Currently banned 是否递增。如果计数始终不变,请确认测试地址不在 Fail2ban 的 ignoreip 中,并在服务器上运行 journalctl SYSLOG_IDENTIFIER=webmin,确认 Invalid login 行确实已写入。如果此服务器尚未安装 Fail2ban,请参阅 Ubuntu 24.04 上用于 SSH 的 Fail2ban 指南,其中介绍了安装步骤以及应与本 jail 同时运行的 SSH jail。

限制每个 Webmin 用户可操作的内容

并非所有需要使用面板的用户都需要对所有内容拥有 root 权限。在 Webmin,然后是 Webmin Users 中创建其他 Webmin 登录账户,并仅授予每个账户所需的模块。例如,备份操作员只需要访问 cron 和文件系统模块。编辑用户时会显示所有模块的复选清单;取消选中某个模块后,该模块会从用户菜单中移除,同时阻止访问相应的底层 URL。这属于纵深防御:即使低权限 Webmin 会话的凭据被窃取,只要其模块列表中没有 Users 模块,也无法重写 /etc/shadow

保持 Webmin 最新

由于您是从 apt 软件源安装的,sudo apt update && sudo apt upgrade 会与系统的其他软件包一起获取新的 Webmin 版本。请及时安装补丁,因为控制面板经常是攻击目标。Webmin 也可以通过 Webmin,然后 Webmin Configuration,再选择 Upgrade Webmin 自行更新,但在 Ubuntu 上使用 apt 更简单,因为这样可以让 Webmin 版本与其他软件包的管理保持一致。不要将更新视为可选操作:过去 Webmin 的多个 CVE 都属于远程代码执行漏洞,“已修补”和“服务器被入侵”之间的差别,只有管理员执行升级的速度。

故障模式及其对应提示

“您的连接不是私密连接” / NET::ERR_CERT_AUTHORITY_INVALID 首次加载时就会显示。原因是 Webmin 在安装时生成的自签名证书没有受信任的签发者。这不是攻击;通信通道已加密,只是没有受信任的签名。解决方法:暂时继续访问,然后申请真正的 Let's Encrypt 证书;如果您通过 SSH 隧道访问 Webmin,也可以永久接受该证书。

“此 Web 服务器正在 SSL 模式下运行。请尝试使用 URL https://...” 您输入了 http://server:10000。miniserv 在该端口上只提供 TLS,并通过明文提示这一点。解决方法:将地址栏中的 http 改为 https

页面超时,ERR_CONNECTION_TIMED_OUT / “无法访问此网站”。 请求根本没有到达 Webmin。在 Ubuntu 上,这几乎总是因为 ufw 丢弃了 10000 端口的数据包。使用 sudo ufw status 确认;如果未列出 10000,请使用 sudo ufw allow 10000/tcp 放行该端口,或者更好的做法是保持端口关闭,使用选项 B 中的 SSH 隧道。请注意两者的区别:超时表示防火墙静默丢弃了数据包,而 ERR_CONNECTION_REFUSED 表示端口可访问,但 Webmin 未运行;请检查 sudo systemctl status webmin

“拒绝访问 <your IP>。” 您在选项 A 中设置了 IP 访问控制,而当前地址不在允许列表中,也可能是动态 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 隧道访问。这样,公网中的任何人都无法连接 10000 端口。

如何消除 Webmin 的证书警告?

出现警告(NET::ERR_CERT_AUTHORITY_INVALID)是因为 Webmin 随附的是自签名证书。通过 Webmin、Webmin Configuration、SSL Encryption、Let's Encrypt 申请有效证书。验证时需要使用一个指向该服务器的 DNS 名称,并确保有服务响应端口 80 的验证请求。如果您始终通过 SSH 隧道访问 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= 行。因此,静态地址或 SSH 隧道方式在实际使用中更可靠。

为什么密码正确但登录仍然失败?

Webmin 通过 PAM 使用 Unix 密码进行身份验证,而云镜像通常只允许使用密钥登录,默认账户没有设置密码。因此 PAM 没有可匹配的密码,登录会被拒绝。在服务器上运行 sudo passwd youruser 设置密码,然后登录。如果 /var/webmin/miniserv.log 中存在 Non-existent login as ... 行,则表示该用户名本身不是有效的 Unix 账户。

与直接使用 SSH 相比,Webmin 适合做什么?

Webmin 提供了便于发现和操作的管理层。它适合浏览日志文件、管理用户和 cron、编辑防火墙规则,以及查看磁盘和服务状态,无需记住每条命令。对于偶尔进行管理的管理员或技能水平不同的团队,这些功能确实很有用。直接使用 SSH 速度更快、便于编写脚本,并且日常操作暴露的攻击面小得多。许多管理员会同时使用两者:日常操作使用 SSH,偶尔需要点击操作时,将 Webmin 绑定到 localhost,并通过隧道访问。如果您真正想比较的是不同管理面板,而不是面板与 shell,那么值得先权衡 Cockpit 与 Webmin 的比较,因为两者能够实际修改的系统范围不同,身份验证方式也不同。