我的 Apache 2.4(CentOS 7)服务器托管多个网站。有时,当我访问任何网站文件(主要是 php 脚本)时,我会收到 403 禁止访问(您无权访问此服务器上的文件 X)错误。按 F5 几秒钟即可解决该问题并正常加载页面。文件具有正确的权限。我还启用了 mod_evasive,但日志没有显示当时有任何 IP 被阻止。
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
cloudflare_module (shared)
access_compat_module (shared)
actions_module (shared)
alias_module (shared)
allowmethods_module (shared)
auth_basic_module (shared)
auth_digest_module (shared)
authn_anon_module (shared)
authn_core_module (shared)
authn_dbd_module (shared)
authn_dbm_module (shared)
authn_file_module (shared)
authn_socache_module (shared)
authz_core_module (shared)
authz_dbd_module (shared)
authz_dbm_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_owner_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cache_module (shared)
cache_disk_module (shared)
data_module (shared)
dbd_module (shared)
deflate_module (shared)
dir_module (shared)
dumpio_module (shared)
echo_module (shared)
env_module (shared)
expires_module (shared)
ext_filter_module (shared)
filter_module (shared)
headers_module (shared)
include_module (shared)
info_module (shared)
log_config_module (shared)
logio_module (shared)
mime_magic_module (shared)
mime_module (shared)
negotiation_module (shared)
remoteip_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
slotmem_shm_module (shared)
socache_dbm_module (shared)
socache_memcache_module (shared)
socache_shmcb_module (shared)
status_module (shared)
substitute_module (shared)
suexec_module (shared)
unique_id_module (shared)
unixd_module (shared)
userdir_module (shared)
version_module (shared)
vhost_alias_module (shared)
dav_module (shared)
dav_fs_module (shared)
dav_lock_module (shared)
lua_module (shared)
mpm_prefork_module (shared)
proxy_module (shared)
lbmethod_bybusyness_module (shared)
lbmethod_byrequests_module (shared)
lbmethod_bytraffic_module (shared)
lbmethod_heartbeat_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
ssl_module (shared)
systemd_module (shared)
cgi_module (shared)
php5_module (shared)
evasive20_module (shared)
上面的输出apachectl -M
。知道是什么原因造成的吗?
答案1
我遇到了同样的问题,我不确定下面的原因是否总是导致这个错误(特别是以问题中描述的方式)但对我来说就是这种情况,所以我只是想分享我的想法。
Debian 7 wheezy(7.7),Apache 2.2.2
我正在制作一个功能,当用户点击“链接”时,将消息的状态更改为已读/未读,此时 ajax 正在发送到服务器,因此,在测试时 - 快速点击该链接查看它是否正常工作(因此不会有 2 个并发 ajax 请求)我收到此错误
Forbidden
You don't have permission to access /messages on this server.
奇怪的是,在此之前,有几个成功的 ajax 请求,路径正常,包括域名,如http://example.com/messages/changeStatus/11
。这意味着代码没问题。但是,另一方面,如果我能等几秒钟再试一次,它就会正常工作。
/var/log/apache2/modsec_audit.log
我安装了 mod-security 和 mod-evasive,因此出现此错误后,我在文件中发现了最后几行。
--ba0f4035-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /messages/changeStatus/24
on this server.</p>
</body></html>
--ba0f4035-H--
Apache-Error: [file "mod_evasive20.c"] [line 246] [level 3] client denied by server configuration: /home/user_name/www/example/messages, referer: http://example.com/messages
Stopwatch: 1421177262896100 4724 (- - -)
Stopwatch2: 1421177262896100 4724; combined=10, p1=0, p2=0, p3=2, p4=0, p5=7, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.6.6 (http://www.modsecurity.org/).
Server: Apache/2.2.22 (Debian) PHP/5.4.36-0+deb7u1 mod_ssl/2.2.27 OpenSSL/1.0.1h
--ba0f4035-Z--
经过进一步搜索,我发现了本文中的日志错误。 https://www.atomicorp.com/wiki/index.php/Mod_evasive
因此,mod evasive 是原因,因为它的默认参数太敏感了,主要是在/etc/apache2/mods-available/mod-evasive.conf
文件中默认情况下我有这些选项
<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir /var/log/mod_evasive
DOSEmailNotify [email protected]
DOSWhitelist 127.0.0.1
</ifmodule>
正如我们从上面的链接中了解到的
MODEV_DOSPageCount - 这是每个页面间隔内对同一页面(或 URI)的请求数量的阈值。一旦超出该间隔的阈值,客户端的 IP 地址将被添加到阻止列表中。
和
MODEV_DOSPageInterval - 页数阈值的间隔;默认为 1 秒间隔。
因此,根据默认选项,如果我在 1 秒内对同一个 url 发出 2 次请求,它会显示 403 错误,这就是发生在我身上的事情:ASA 我将数字增加到 20,但我无法复制错误消息。
在另一方面
MODEV_DOSBlockingPeriod 阻塞期是客户端被添加到阻塞列表后被阻塞的时间(以秒为单位)。在此期间,来自客户端的所有后续请求都将导致 403(禁止)并且计时器将被重置(例如再重置 10 秒)。由于计时器会针对每个后续请求重置,因此没有必要设置较长的阻塞期;如果发生 DoS 攻击,此计时器将继续重置
因此,正如我们所看到的,经过DOSBlockingPeriod
一段时间后,该 IP 将从黑名单中删除;我猜这是因为日志中没有被禁止的 IP,而且,几秒钟后单击 F5 时,它可以正常工作,因为阻止期已经过去。
我还使用较长的阻塞期和较小的页数值对此进行了测试,主要分别设置 1000 和 1。在 2-3 个 ajax 请求之后,它开始显示 403 并且几秒钟后并没有消失。
希望这对某人有帮助。
答案2
你刚刚从 2.2 升级到 2.4 吗?试试从 2.2 升级到 2.4。
答案3
刚刚遇到了同样的问题 - 除了 mod_evasive 没有安装。我 100% 确定它没有安装或启用。
解决方案是安装 libapache2-mod-evasive 然后禁用它。也许它正在合并到 Apache 核心中?
服务器版本:Apache/2.4.18 (Ubuntu) 服务器建立时间:2017-07-27T14:34:01