Apache 拒绝从 ip 直接访问网页

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


之前在审计 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>

最后重启服务器即可