![机器人如何访问服务器上非公网 IP 地址的 DocumentRoot 目录?我该如何阻止它们?](https://linux22.com/image/1420359/%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E9%9D%9E%E5%85%AC%E7%BD%91%20IP%20%E5%9C%B0%E5%9D%80%E7%9A%84%20DocumentRoot%20%E7%9B%AE%E5%BD%95%EF%BC%9F%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%E5%AE%83%E4%BB%AC%EF%BC%9F.png)
我有一个使用 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.XX
,postrecord.wa.net MY.IP.XXX.XX
他们将获得任何您的 Web 服务器上的站点。您可以使用Block
、Allow
和Order
指令来阻止这种情况,但错误代码为 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 获取内容