我最近在 linode(debian 7)上设置了一个虚拟服务器,并且想阻止通过除指定域之外的任何域访问 virtualmin 安装。
我目前可以通过 linode 成员 url(例如 example1234.members.linode.com:10000)访问 virtualmin,但我也可以通过服务器上托管的域访问它。
我该如何阻止这些域名?
答案1
免责声明:
- 我从未在生产中使用过 webmin。过去,我只是在我的开发服务器中安装了这个软件,但没有兴趣去探索它。
此解决方案已在此进行测试 网页管理和虚拟分钟版本
# dpkg -l ii webmin 1.710 all web-based administration interface for Unix systems ii virtualmin-base 1.0-35 all Meta-package that runs a postinstall script to configure all of the services managed by Virtualmin.
一些背景
Virtualmin是一个模块基于 Web 的管理,称为 Webmin。换句话说,Virtualmin 在 Webmin 上运行. Webmin 本身使用 miniserv.pl 作为网络服务器。因此,如果您想了解如何基于 Host 标头进行限制,您应该深入研究 miniserv.pl
网络服务器 miniserv.pl
因此,我们有好消息也有坏消息。坏消息是,与其他复杂的 Web 服务器(如 nginx 或 apache)相比,此 Web 服务器仅具有基本功能。好消息是,它是用 Perl(一种脚本语言)编写的,仅包含在单个文件中/usr/share/webmin/miniserv.pl
。此 Web 服务器的配置文件位于 中/etc/webmin/miniserv.conf
。不幸的是,有关参数的文档位于迷你服务配置文件非常有限(或者也许我使用了错误的关键字进行搜索:))。
因此,我决定检查一下源代码miniserv.pl
。我感兴趣的代码来自这个代码片段。
if (defined($header{'host'})) {
if ($header{'host'} =~ /^\[(.+)\]:([0-9]+)$/) {
($host, $port) = ($1, $2);
}
elsif ($header{'host'} =~ /^([^:]+):([0-9]+)$/) {
($host, $port) = ($1, $2);
}
else {
$host = $header{'host'};
}
if ($config{'musthost'} && $host ne $config{'musthost'}) {
# Disallowed hostname used
&http_error(400, "Invalid HTTP hostname");
}
}
好的,这些行告诉我们:
假设请求到达 miniserv.pl,并且所有这些条件都得到满足
- HTTP 请求中有 Host 标头
- 参数
musthost
定义在miniserv.conf
- 主机标头值与参数不相等
musthost
那么请求应该被拒绝,并出现错误 400 无效的 HTTP 主机名。是的,这些功能正是您想要的。
因此,如果您想限制域访问 virtualmin 接口,您应该设置参数必须主办与允许的域一起miniserv.conf
。
笔记:
一些问题:
- 如果没有,用户可以绕过你的限制主持人:在请求标头中。
- 当您启用 SSL,但用户通过 http(而非 https)浏览时,用户将打印此信息:
此 Web 服务器正在 SSL 模式下运行。请尝试 URLhttps://your.allowed.domain:10000/反而。
更新:
第二个问题可以通过使用 OP 的补丁来修补文件来预防miniserv.pl
。该补丁将在Github 拉取请求(感谢 OP!!!)。未来的 webmin 也将具有此功能,因为 webmin 已经接受请求:)