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 Webmin stable repository? (y/N),请输入 y。完成后,安装软件包。--install-recommends 标志会安装常用的 Perl 和 SSL 模块依赖,避免各个模块稍后因缺少库而失败。
sudo apt-get install --install-recommends webminWebmin 以前更改过此脚本的名称,旧版指南会引用 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 自带的服务器镜像默认不会启用 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 证书消除浏览器警告。您需要为证书指定一个名称,并确保 Let's Encrypt 能够在验证期间访问端口 80。该名称通常是 DNS 名称,例如 panel.example.com,并且应有一条指向此服务器的 A 记录。从 Webmin 2.650(发布于 2026 年 6 月 25 日)开始,只要已安装 Certbot 5.3 或更高版本,也可以使用服务器的公网 IP 地址。Let's Encrypt 仅通过其短期配置文件签发 IP 证书,证书有效期约为六天,因此请将 Webmin 的自动续期间隔设置为天数;对于 IP 证书,Webmin 不接受更长的间隔。
Webmin 已内置此功能:Webmin,然后依次选择 Webmin Configuration、SSL Encryption、Let's Encrypt 选项卡。输入主机名或 IP 地址,选择验证方法,然后发起申请。Webmin 会获取证书,为您更新 miniserv.conf 中的 certfile= 和 keyfile= 行,并在证书过期前自动续期。重新加载页面后,浏览器地址栏中的锁形图标应不再显示警告。
需要注意的是:Webmin 自身的服务运行在 10000 端口,而不是 80 端口,因此必须有其他服务在端口 80 上响应 http-01 验证请求。您有三种方式可选。如果 Apache 或 nginx 已在端口 80 上提供该名称的服务,请将验证指向该站点的文档目录(对于 IP 地址,这需要 Certbot 5.4 或更高版本)。如果端口 80 上没有服务,请选择 Certbot 的内置 Web 服务器,即 Webmin 在 2.110 版本中加入的 standalone 模式:Certbot 会短暂地在端口 80 上运行自己的 Web 服务器,因此必须安装 Certbot,且端口 80 必须空闲并在防火墙中放行。您也可以使用 DNS 验证,但它适用于主机名,不适用于 IP 地址。Ubuntu 24.04 自带的 certbot 软件包版本为 2.9,可用于主机名的 standalone 验证,但版本过旧,无法签发 IP 证书;对于 IP 证书,请安装当前版本的 Certbot,例如 snap 版本,截至 2026 年 10 月为 5.8。如果以上方式都不可用,申请会因验证错误而失败。相关操作、DNS 记录、端口 80 验证请求和续期流程,与为任何网站签发证书时相同。如果您需要了解背景信息,使用 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, then Webmin Configuration, then Upgrade Webmin 自行更新,但在 Ubuntu 上使用 apt 路径更整洁,因为它能保持版本与您的其他软件包管理一致。不要将此视为可选项:过去 Webmin 的部分 CVE 属于远程代码执行漏洞,“已修补”和“服务器被入侵”之间的差别,仅取决于管理员执行升级的速度。
故障场景及对应提示信息
“Your connection is not private” / NET::ERR_CERT_AUTHORITY_INVALID。 首次加载时会立即显示。原因是 Webmin 在安装时生成的自签名证书没有受信任的签发者。这不是攻击;通信已加密,只是未经过可信验证。解决方法:暂时通过该警告继续访问,然后申请真实的 Let's Encrypt 证书;如果通过 SSH 隧道访问 Webmin,也可以永久接受该证书。
“This web server is running in SSL mode. Try the URL https://...” 你输入了 http://server:10000。miniserv 仅在该端口上提供 TLS,并以明文提示这一点。解决方法:在地址栏中将 http 改为 https。
页面超时,显示 ERR_CONNECTION_TIMED_OUT / “This site can't be reached”。 请求根本没有到达 Webmin。在 Ubuntu 上,常见原因是 ufw 丢弃了发往 10000 端口的流量,但应先检查,不要直接假设。运行 sudo ufw status。如果输出 Status: inactive,说明 ufw 没有阻止任何流量(Ubuntu 默认禁用 ufw,添加允许规则不会启用它),因此应继续检查上游设备,例如服务商控制面板中的防火墙。如果输出 Status: active,运行 sudo ufw status verbose,查看默认入站策略和更宽泛的规则;如果入站流量被拒绝且列表中没有 10000 端口,可以使用 sudo ufw allow 10000/tcp 开放该端口,或者更好地保持端口关闭,改用选项 B 中的 SSH 隧道。请注意两者的区别:超时表示防火墙静默丢弃数据包,而 ERR_CONNECTION_REFUSED 表示端口可访问,但 Webmin 未运行,请检查 sudo systemctl status webmin。
“Access denied for <your IP>。” 你在选项 A 中设置了 IP 访问控制,但当前地址不在允许列表中,可能是动态 IP 已发生变化,也可能是输入有误。无法通过浏览器恢复访问。请从控制台修复:编辑 /etc/webmin/miniserv.conf 中的 allow= 行,修正或删除该行,然后运行 sudo systemctl restart webmin。
使用确认无误的凭据时显示“Login failed. Please try again.” 该账户没有 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 名称;如果已安装 Certbot 5.3 或更高版本,也可以使用服务器的公网 IP 地址。挑战验证需要能够访问 80 端口,可由现有 Web 服务器响应,也可由 Certbot 自带的 standalone 服务器响应。如果你始终通过 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.conf 的 allow= 行中。注意动态家庭 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 的对比,因为两者在可修改的系统范围以及身份验证方式上都有差异。