机器人如何访问服务器上非公网 IP 地址的 DocumentRoot 目录?我该如何阻止它们?

机器人如何访问服务器上非公网 IP 地址的 DocumentRoot 目录?我该如何阻止它们?

我有一个使用 apache2 设置的本地网络,并在 OpenSuse 13.1 Linux 上运行“命名”。

我使用“命名”服务将我的计算机用作域服务器。我将路由器设置为指向我的计算机进行域查找,这样我就有机会让它将我网络上的一堆域重写为其自己的本地 IP,192.168.0.111

这很有效。

我使用虚拟主机配置来允许各种域和子域(通过命名重新路由到同一个 IP)在我的计算机中调出不同的目录。

更新——(添加了基本域 VirtualHost 信息) 对于我的域名:

<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias for.us 192.168.0.111
    DocumentRoot /home/personal/network/for.us

    # if not specified, the global error log is used
    ErrorLog /var/log/apache2/for.us-error_log
    CustomLog /var/log/apache2/for.us-access_log combined
</VirtualHost>
<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias wa.net 192.168.0.111
    DocumentRoot /home/work/wa.net

    # if not specified, the global error log is used
    ErrorLog /var/log/apache2/ip-error_log
    CustomLog /var/log/apache2/ip-access_log combined
</VirtualHost>

然后对于我的子域名:

<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias fmb.wa.net
    DocumentRoot /home/work/wa.net/fmb
</VirtualHost>
<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias postrecord.wa.net
    DocumentRoot /home/work/wa.net/postrecord
</VirtualHost>
<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias cvalley.wa.net
    DocumentRoot /home/work/wa.net/cvalley_local
</VirtualHost>

这使得我可以从我网络中的任何设备访问 cvalley.wa.net 并获取位于 /home/work/wa.net/cvalley_local 的站点

我决定将端口 80 转发到这台计算机,这样我就可以与同事共享一些开发站点。我无法控制他们使用同名服务访问哪个站点,因为他们必须使用我的计算机作为他们的域名服务器...

所以我添加了这样一行:

<VirtualHost *:80>
    ServerName 192.168.0.111
    ServerAlias MY.IP.XXX.XX
    DocumentRoot /home/work/wa.net/cvalley
</VirtualHost>

其中“MY.IP.XXX.XX”是我的公共IP地址。

一切按预期进行,当您从公共网络访问我的 IP 地址时,您会看到位于 /home/work/wa.net/cvalley 的站点。

更新——澄清混淆之处 我感到困惑的是,除了“wa.net”网站外,我的日志中还有“for.us”网站的公共 IP 地址。我希望“wa.net”有一些公共 IP 访问权限,但我不明白公共机器人是如何进入“for.us”网站的。

我原本以为无法访问“为我们”我网络中的站点,除非公共用户以某种方式弄清楚了我正在调用的 ServerAliases,并模仿我的域设置......

公共交通如何冲击我的“为了我们”网站?我该如何重新创建这种访问权限?

以下是一些公共 IP 访问我的 VirtualHost 网站的示例:

更新——更好地描述日志

此日志显示活动“为了我们”VirtualHost——我原本预计活动只存在于“wa.net”域,我确实有预期的日志

162.253.66.76 - - [15/Aug/2014:19:20:47 -0600] "GET /xmlrpc.php HTTP/1.0" 404 1004 "-" "-"
162.253.66.74 - - [16/Aug/2014:10:50:28 -0600] "GET / HTTP/1.0" 200 262 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
185.4.227.194 - - [16/Aug/2014:11:16:45 -0600] "GET http://24x7-allrequestsallowed.com/?PHPSESSID=1rysxtj500143WQMVT%5E_NAZ%5BQ HTTP/1.1" 200 262 "-" "-"
101.226.254.138 - - [16/Aug/2014:13:32:14 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"
162.253.66.74 - - [16/Aug/2014:14:26:19 -0600] "GET / HTTP/1.0" 200 262 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
212.129.2.119 - - [16/Aug/2014:16:00:51 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"
91.240.163.111 - - [16/Aug/2014:18:34:32 -0600] "GET / HTTP/1.0" 200 262 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
162.253.66.74 - - [16/Aug/2014:19:02:53 -0600] "GET / HTTP/1.0" 200 262 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
122.226.223.69 - - [17/Aug/2014:05:53:09 -0600] "GET http://www.k2proxy.com//hello.html HTTP/1.1" 404 1006 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)"
::1 - - [17/Aug/2014:10:19:26 -0600] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (Linux/SUSE) OpenSSL/1.0.1e PHP/5.4.20 (internal dummy connection)"
162.209.65.196 - - [17/Aug/2014:15:31:53 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"
111.206.199.163 - - [18/Aug/2014:11:12:56 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"
37.187.180.168 - - [18/Aug/2014:15:40:00 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"
62.210.38.226 - - [18/Aug/2014:18:35:16 -0600] "HEAD / HTTP/1.0" 200 - "-" "-"

我可以做些什么来默认可靠地拒绝公共访问,但只在一个 VirtualHost 中允许它?

答案1

wa.net 和 for.us 都解析为同一个 IP,因此网络无法判断 IP 数据包(以及 TCP 段和 UDP 数据报)是针对哪个 DNS 域的。例如,HTTP 通过检查 HTTP Host: 标头来查看请求的目标域(这就是虚拟网络托管的工作方式),从而消除发往同一 IP 的网络流量的歧义,但 named 对传入数据报的 DNS 地址没有概念。

我建议将 wa.net 和 for.us 放在不同的 IP 地址上,并在物理接口上配置这两个地址。这应该会在 IP 级别分离流量,虚拟化软件可以将数据包传送到适当的虚拟接口。

答案2

for.us是第一个 VirtualHost,使其成为“默认”VirtualHost,因此任何没有Host标头(或与任何其他 VirtualHost 不匹配)的请求都将在那里结束。

HTTP/1.0不需要Host标题来工作所以它采用默认 VH。


编辑:如果是家庭设置,那么最快的解决方案是将“公共”虚拟主机移至顶部,因此任何连接都默认为该站点。

请记住,对于 NameVirtualHost,如果 Host 标头不存在或与您配置的任何名称/别名不匹配,您将始终拥有“默认”VirtualHost(为该 IP 定义的第一个 VirtualHost)

此外,我会将 ServerName 指令配置为您分配给每个 ServerAlias 的值,而不是在您的案例中使用 ServerAlias。如果您设置了 NameVirtualHost,ServerName 旨在区分应该使用哪个 VirtualHost,因此在所有 ServerName 中具有相同的值没有任何好处。ServerAlias 用于标记其他名称(例如,ServerName hostname ServerAlias hostname.domain.com

请注意,如果您的同事编辑他们的/etc/hosts并添加诸如、等条目fmb.wa.net MY.IP.XXX.XXpostrecord.wa.net MY.IP.XXX.XX他们将获得任何您的 Web 服务器上的站点。您可以使用BlockAllowOrder指令来阻止这种情况,但错误代码为 403 的条目仍会出现在您的 access_log 中。


最后,为了正确解决这个问题,并且由于有足够的私有 IP 可供您使用,我将执行以下操作:

  • 首先,为你的 OpenSuse 分配一个额外的 IP。你当前的主 IP 将用于你的内部服务器,而新的 IP 将用于内部和公共服务器。
    • 找到/etc/sysconfig/network-scripts/ifcfg-eth*。如果您的服务器只有一张网卡,那么应该只有一个文件。
    • 编辑它并添加以下行(将其附加到您的方便处):

IPADDR1='192.168.0.112'
NETMASK1='255.255.255.0'
LABEL1='0' 
  • 重启网络:/etc/init.d/network restart
  • 更改您当前的<VirtualHost *:80>除了<VirtualHost 192.168.0.111:80>公共 VirtualHost 之外,它应该有<VirtualHost 192.168.0.112:80>
  • 重启 Apache
  • 如果有必要,编辑您的named“公共”名称以指向新的 IP(供您内部使用)
  • 更改路由器上可能存在的 NAT 以指向新的 IP。

通过该配置,从您的公共 IP,他们只能从 IP 为 192.168.0.112 的 VirtualHost 获取内容

相关内容