lockingvirtualode访问linode上的特定域

我最近在linode(debian 7)上build立了一个虚拟服务器,并希望通过指定以外的任何域来阻止对virtualmin的访问。

我目前可以通过linode成员url访问virtualmin(例如example1234.members.linode.com:10000),但是我也可以通过服务器上托pipe的域访问它。

我怎样才能阻止这些域名?

免责声明:

  • 我从来没有在生产中使用webmin。 过去,我只是在我的devserver中安装了这个软件,但是没兴趣去探索它。
  • 这个解决scheme在这个WebminVirtualmin版本中进行testing

    # 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是一个名为Webmin的基于Web的pipe理模块 。 换句话说, Virtualmin在Webmin上运行 。 Webmin本身使用miniserv.pl作为networking服务器 。 所以,如果你想找出如何限制基于主机头,你应该把它挖到miniserv.pl

Webserver miniserv.pl

所以,我们有坏消息,好新的。 坏消息是,与其他复杂的networking服务器如nginx或apache相比,这个networking服务器只具有基本function。 好消息是它是用Perl(一种脚本语言)编写的,它只包含在单个文件/usr/share/webmin/miniserv.pl 。 这个networking服务器在/etc/webmin/miniserv.conf有configuration文件。 不幸的是,有关miniserv.conf中参数的文档相当有限(或者我可能使用错误的关键字来search:))。

所以,我决定检查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请求中有一个主机头
  • 参数musthostminiserv.conf中定义
  • 主机标头值与参数musthost不相等

那么请求应该被拒绝,错误400无效的HTTP主机名。 是的,这些function正是你想要的。

因此,如果要限制域访问virtualmin接口,则应在带有允许的域的miniserv.conf中设置参数musthost

笔记:

有些问题:

  • 如果没有Host:请求标题,用户可以绕过你的限制。
  • 当您启用ssl,但用户通过http浏览(不是https)时,用户将打印此信息:

该Web服务器正在SSL模式下运行。 尝试URL https://your.allowed.domain:10000 /来代替。

更新:

第二个问题可以通过使用来自OP的补丁修补文件miniserv.pl来防止。 该补丁将在github pull请求 (信贷到OP !!!)中可用。 未来的webmin也有这个function,webmin已经接受拉请求 🙂