从外部文件中的 ip 列表中拒绝 Apache



我想维护一个文件,其中包含被阻止使用站点的 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 不存在,则会报告错误。

最新更新