之前在审计 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>
最后重启服务器即可
Comments NOTHING