RewriteMap调用Shell脚本实现IP封禁失效,请求协助排查
问题:RewriteMap调用Shell脚本实现IP封禁失效排查
我参考相关IP封禁方案实现后功能未生效,以下是我的配置和测试脚本,请求协助排查需要补充的配置:
测试用Shell脚本(filterip.sh)
#!/bin/bash echo "deny"
.htaccess配置
RewriteEngine on RewriteCond ${filterip:%{HTTP:X-FORWARDED-FOR}} deny [NC] RewriteRule ^ - [L,F]
Vhost配置
RewriteMap filterip prg:/path/filterip.sh
说明:已为Shell脚本赋予执行权限,但功能仍未生效。
排查要点
- 确认RewriteMap配置加载:
RewriteMap只能放在服务器主配置(httpd.conf)或虚拟主机(vhost)文件中,你已放在vhost是正确的,但需确保配置文件已被Apache加载,且修改后重启过Apache服务。 - 检查权限链完整性:确保Apache运行用户(通常为
www-data、apache或httpd)对脚本所在的所有上级目录有访问权限(即x权限),同时对脚本本身有r和x权限。可通过chown apache:apache /path/filterip.sh和chmod 755 /path/filterip.sh调整,再检查上级目录权限。 - 修复脚本STDIN处理逻辑:PRG类型的RewriteMap会将请求参数(此处为
X-FORWARDED-FOR的值)通过标准输入传给脚本,你的测试脚本未读取STDIN,虽理论上应封禁所有请求,但可能因输入处理异常导致失效。修改脚本如下测试:#!/bin/bash read ip # 读取Apache传入的IP echo "deny" - 验证依赖模块启用:确保
mod_rewrite和mod_cgi(或mod_cgid)模块已启用。可执行apache2ctl -M(Debian/Ubuntu)或httpd -M(RHEL/CentOS)查看模块列表,未启用则通过a2enmod rewrite cgi(Debian/Ubuntu)或修改httpd.conf加载模块。 - 测试真实客户端IP变量:若服务器未经过反向代理,
HTTP:X-FORWARDED-FOR可能为空,导致RewriteCond不匹配。临时替换为%{REMOTE_ADDR}验证功能:RewriteCond ${filterip:%{REMOTE_ADDR}} deny [NC] - 查看Apache错误日志:检查错误日志(路径通常为
/var/log/apache2/error.log或/var/log/httpd/error_log),日志中会明确记录RewriteMap执行失败的原因,如路径错误、权限不足、模块缺失等。 - 修正脚本换行符:若脚本在Windows环境编辑,可能存在DOS换行符(
\r\n)导致Apache执行报错。使用dos2unix /path/filterip.sh转换为Unix换行符。 - 解除SELinux限制:若服务器启用SELinux,可能阻止Apache执行脚本。临时执行
setenforce 0关闭SELinux测试,若生效则配置永久规则:chcon -t httpd_sys_script_exec_t /path/filterip.sh
内容的提问来源于stack exchange,提问作者Vivek Bansal
相关产品推荐
相关产品推荐

