昨天在无意间通过百度搜索自己的博客的时候,突然发现被收录的第一条竟是自己的网站,但是越看越不对劲?



这个情况就有点头皮发麻了,为什么我的项目地址却被其他域名给解析了呢?随后我又看了一下这个域名解析到的ip,没错就是解析到了我的主机下面。随后我从阿里云的工单工程师那里了解到,这种情况属于独立IP被其他恶意域名给恶意解析了,嗯,了解的差不多了我也就没细问直接把工单给关闭了,因为我知道剩下的活是我自己的了。

00 首先,让我们了解一下什么叫恶意域名解析

一般情况下,要使域名能访问到网站需要两步,第一步,将域名解析到网站所在的主机,第二步,在web服务器中将域名与相应的网站绑定。但是,如果通过主机IP能直接访问某网站,那么把域名解析到这个IP也将能访问到该网站,而无需在主机上绑定,也就是说任何人将任何域名解析到这个IP就能访问到这个网站。好吧,当时我的服务器是可以通过IP访问的,那么任何域名其实就可以直接恶意解析到我的IP了。

01 恶意域名解析的危害

假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。比如我就看到一个网友的叙述:“今天太倒霉了,发现通过IP无法访问服务器的80端口很无语,昨天都还好的啊,也没有修改过配置,其他端口又是正常的,防火墙也没问题。于是问了下机房,给了个崩溃的回复说我们的服务器有个域名没有备案被电信多次通告,然后就把我们ip端口给封了。。。。封了啊。。。疯了,关键是这个域名TMD不是我的啊。”

10 已知了原因和危害,我们再来谈一谈如何解决

当然我的web服务器是nginx,我就以我的服务器来演示。在我们的nginx配置目录里有个nginx.conf配置文件,需要在这个文件里面配置这样一段话:

server {

listen 80 default_server;
server_name _;
return 403;
}
或者
server {
listen 80 default_server;
server_name "";
return 403;
}

这时不要忘记nginx -t 检查一下语法,然后平滑重启nginx

再去访问恶意域名我们就会发现


嗯可以,终于能挡住被恶意解析造成的危害了,不过还不过瘾,是不是要对这个域名来点什么惩罚呢?我选择用重定向来搞,把这个域名下访问进来的流量全都重定向到我的域名下,这样就舒服很多了,只需要把

return      403;
改成
return 301 https://www.mrsongopen.top;

11 其他办法

除了nginx的处理办法外,我还在网上搜索到了其他web服务器的解决办法,我把结果粘贴上来,没有试错不保证正确,大家斟酌

1.tomcat服务器
修改server.xml这个配置文件
比如服务器IP地址是 10.0.0.60 ,相应域名是 www.wzlinux.com
打开 %TOMCAT_HOME%/conf/server.xml文件
找到 Engine节点作如下Xml代码 ,事例: <Engine name="Catalina" defaultHost="www.piis.cn">
  <Host name="www.piis.cn" appBase="webapps"
   unpackWARs="true" autoDeploy="true"
   xmlValidation="false" xmlNamespaceAware="false"/>
  <Host name="10.0.0.60" appBase="ipapps"
   unpackWARs="true" autoDeploy="true"
   xmlValidation="false" xmlNamespaceAware="false"/>
</Engine>

注意事项:
  1. Engine 节点配置的 defaultHost 表明缺省访问的Host。defaultHost对应的名称必须存在于Engine节点下配置的host节点中。
  当一台机器有多个IP,而按照规定只允许通过一个指定的域名访问时很有用。此时,把defaultHost指定为非域名对应的host,这样不通过域名访问时就都定位到指定的非域名HOST了
  2. Host 节点 name 对应IP地址,以及域名。一个Host只有指定一个IP或域名。
  3. Host 节点的 appBase ,对应的是存放web应用的目录。这里输入的目录相对于 %TOMCAT_HOME%,
  如上面的www.wzlinux.com对应的目录是 %TOMCAT_HOME%/webapps,而10.0.0.60 对应的目录是 %TOMCAT_HOME%/ipapps。

2.apache服务器
在用apache搭建的WEB服务器的时候,如何想只能通过设定的域名访问,而不能直接通过服务器的IP地址访问呢,有以下两种方法可以实现(当然肯定还会有其他方法可以实现),都是修改httpd.conf文件来实现的,下面举例说明。

方法一:在httpd.conf文件最后面,加入以下代码
NameVirtualHost 221.*.*.*
<VirtualHost 221.*.*.*>
ServerName 221.*.*.*
<Location />
Order Allow,Deny
Deny from all
</Location>
</VirtualHost>
    
<VirtualHost 221.*.*.*>
DocumentRoot "/www/web"
ServerName www.wzlinux.com
</VirtualHost>

说明:上部分是实现拒绝直接通过221.*.*.*这个IP的任何访问请求,这时如果你用221.*.*.*访问,会提示拒绝访问。下部分就是允许通过www.wzlinux.com这个域名访问,主目录指向/www/web(这里假设你的网站的根目录是/www/web)

方法二:在httpd.conf文件最后面,加入以下代码

NameVirtualHost 221.*.*.*
<VirtualHost 221.*.*.*>
DocumentRoot "/www/test"
ServerName 221.*.*.*
</VirtualHost>
 
<VirtualHost 221.*.*.*>
DocumentRoot "/www/web"
ServerName www.wzlinux.com
</VirtualHost>

说明:上部分是把通过221.*.*.*这个IP直接访问的请求指向/www/test目录下,这可以是个空目录,也可以在里面建一个首页文件,如index.hmtl,首面文件内容可以是一个声明,说明不能通过IP直接访问。下部分的意思跟方法一是一样的。