我最近在linode(debian 7)上build立了一个虚拟服务器,并希望通过指定以外的任何域来阻止对virtualmin的访问。
我目前可以通过linode成员url访问virtualmin(例如example1234.members.linode.com:10000),但是我也可以通过服务器上托pipe的域访问它。
我怎样才能阻止这些域名?
免责声明:
这个解决scheme在这个Webmin和Virtualmin版本中进行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
所以,我们有坏消息,好新的。 坏消息是,与其他复杂的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满足所有这些条件
musthost在miniserv.conf中定义 musthost不相等 那么请求应该被拒绝,错误400无效的HTTP主机名。 是的,这些function正是你想要的。
因此,如果要限制域访问virtualmin接口,则应在带有允许的域的miniserv.conf中设置参数musthost 。
笔记:
有些问题:
该Web服务器正在SSL模式下运行。 尝试URL https://your.allowed.domain:10000 /来代替。
更新:
第二个问题可以通过使用来自OP的补丁修补文件miniserv.pl来防止。 该补丁将在github pull请求 (信贷到OP !!!)中可用。 未来的webmin也有这个function,webmin已经接受拉请求 🙂