Apache拒绝从ip直接访问网页

发布于 2019-09-13  22 次阅读


之前在审计Apache日志的时候发现有大量的恶意扫描,全是使用脚本通过ip访问的网页,虽然本站已经部署了恶意IP访问封禁脚本,但还是感觉有所欠缺。脚本是需要扫描几次后才封禁,所以需要从根源上解决这一现象,需要拒绝掉从ip访问的请求

然而网上的教程全是一模一样的(真的一模一样搜了好几页了...)大概都是下面这种形式,修改在httpd.conf中

<VirtualHost *.*.*.*>
    ServerName *.*.*.*
    <Location />
        Order Allow,Deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *.*.*.*>
    DocumentRoot documentroot位置
    ServerName www.host.cn
</VirtualHost>

<VirtualHost *.*.*.*>
    DocumentRoot documentroot位置
    ServerName host.cn
</VirtualHost>

没有用啊!!!(或许有的可以用)

大致意思是我把服务器的名字定义为我的ip,拒绝掉所有访问,然后再把名字定义为域名,指向网站根目录

好像。。从逻辑上说没什么问题?

其实不对,首先,现在的网站都有SSL的保护,在开启Open_SSL的情况下<VirtualHost>这个配置在ssl.conf下,大概是<VirtualHost localhost:443>这样的形式出现,改为上面的形式会出现问题。其次,定义多个VirtualHost的时候会报错,提示长度超出限制。


所以我们可以从Rewrite入手,开启重写模块后在httpd.conf中找到你网站的根目录Directory所在(<Directory /var/www/html/>)输入以下代码

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^*.*.*.*$
RewriteRule ^.* - [F]       #'-'表示不替换URL,‘F’表示强制URL为被禁止的,即返回403

但其实Apache官方的文档不推荐启用重写功能,官方希望用IF的形式取代掉rewrite,所以我们把代码改成以下形式

<If "(%{HTTP_HOST} == '*.*.*.*')">
    Require all denied
</If>

将其放在最前面即可规避掉大多数问题(如果还是无法解决可以联系我,提供免费帮助)

问题到这里还没有解决,想要返回标准的403页面请进入到默认欢迎页(vim /etc/httpd/conf.d/welcome.conf)注释掉以下代码

<LocationMatch"^/+$">
    Options -Indexes
    ErrorDocument 403 /error/noindex.html
</LocationMatch>

最后重启服务器即可