我想维护一个文件,其中包含被阻止使用站点的 ip 列表。我知道拒绝可用于实现这一目标(例如,从 127.0.0.1 10.0.0.1 某个.other.ip.地址拒绝)。
但是,我想要一个外部文件,以便无法访问配置的个人可以使用 ip 更新 txt 文件,然后将其包含在拒绝发件人中。
有没有人对如何实现这一目标有任何建议?任何帮助都非常感谢。
看看 Apache Include 指令:
http://httpd.apache.org/docs/2.2/mod/core.html#include
您可以创建一个单独的配置文件,其中包含您的拒绝列表,并包含在任何其他配置文件中,即站点可用中的站点。用法示例如下:
In/etc/apache2/sites-enabled/yoursite.conf
<VirtualHost *:80>
...
Include /etc/apache2/sites-access/yoursite.conf
...
</VirtualHost>
In/etc/apache2/sites-access/yoursite.conf
order allow,deny
deny from 10.0.0.1
allow from all
使用RewriteMap
映射作为外部 IP 地址文件适用于单个 IP 地址的列表:
RewriteEngine on
RewriteMap allowed "txt:${site_dir}/etc/allowed_ip_addresses"
UnsetEnv ALLOWED
RewriteCond ${allowed:%{REMOTE_ADDR}} 1
RewriteRule ^ - [E=ALLOWED]
<Location />
Deny from all
Allow from env=ALLOWED
</Location>
然后allowed_ip_addresses
包含如下行:
10.42.1.123 1
192.168.100.456 1
这将允许的 IP 地址映射到值 1
,并将所有其他 IP 地址映射到空字符串。
RewriteCond
在地图中查找REMOTE_ADDR
,如果1
,则设置环境变量。 UnsetEnv
确保变量绝对未设置,否则。
然后,Allow from
仅在设置了该环境变量时才允许访问。
外部映射文件可以具有与 Apache 配置不同的文件系统权限,并且对其所做的更改会立即生效,而无需重新启动 Apache。
真正的安全方法,但您可以将此 txt 文件放在共享目录中,并使用 cron 作业更新 apache 配置...
另一种方法是使用htaccess。
order allow,deny
deny from 10.0.0.1
allow from all
'In windows httpd.conf'
'<Directory />'
'Include "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/logs/deny.txt"'
'</Directory>'
'deny.txt contain'
'Deny from xxx.xxx.xxx.xxx'
'etc'
我使用 .htaccess、一个文件夹和一个以禁止的 ip 作为标题的文件列表四处走动。
如果 banned_ips 中的 IP 文件存在,则返回禁止标志:
RewriteCond "%{DOCUMENT_ROOT}/banned_ips/%{HTTP:X-FORWARDED-FOR}" -f
RewriteRule .* - [F]
我的示例适用于 AWS Cloudfront,但您可以将HTTP:X-FORWARDED-FOR
替换为REMOTE_ADDR
或任何包含访问者 ip 的变量。
或者,您可以使用HTTP_HOST来按站点保留目录,例如:
RewriteCond "%{DOCUMENT_ROOT}/banned_ips/%{HTTP_HOST}/%{HTTP:REMOTE_ADDR}" -f
RewriteRule .* - [F]
这样,您永远不需要更新htaccess文件,甚至可以以编程方式从蜜罐列表中添加ip,我们自己的跟踪器。
请在评论中让我知道您对此方法在可扩展性和/或安全性方面的看法。
从 Apache httpd 版本 2.3.6 及更高版本,您可以使用指令
IncludeOptional /etc/myfilewithrequireip.conf
见 https://httpd.apache.org/docs/2.4/mod/core.html#includeoptional
也可以使用"包含",但如果文件 conf 不存在,则会报告错误。