因此,我在 redhat centos 7 机器上运行 apache 2.4.54。我使用以下配置通过 mod_wsgi 运行我的 django 应用程序:
# create new
#LoadModule wsgi_module modules/mod_wsgi.so
LoadModule wsgi_module "/home/ec2-user/.virtualenvs/myproj_prod/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ec2-user/.virtualenvs/myproj_prod"
#LogLevel Info
<VirtualHost *:80>
LogLevel Info
#LogLevel Error
ServerName www.mysite.com
ServerAlias mysite.com
ServerAdmin [email protected]
#DocumentRoot /usr/local/www/documents
#Alias /robots.txt /usr/local/www/documents/robots.txt
#Alias /favicon.ico /usr/local/www/documents/favicon.ico
#Alias /media/ /usr/local/www/documents/media/
#Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /var/www/mysite.com/static/favicon.ico
#Alias /media/ /path/to/mysite.com/media/
Alias /static/ /var/www/mysite.com/static/
<Directory "/var/www/mysite.com/static">
<RequireAll>
Require not ip 47.222.213.25
Require not ip 34.207.41.127
Require not ip 54.209.63.240
Require not ip 44.196.220.146
Require not ip 34.206.83.67
Require not ip 34.194.232.56
Require not ip 44.194.69.200
Require all granted
</RequireAll>
</Directory>
WSGIDaemonProcess mysite.com processes=1 threads=5 display-name=%{GROUP} home=/home/ec2-user/DjangoProjects/myproj python-path=/home/ec2-user/.virtualenvs/myproj
WSGIProcessGroup mysite.com
WSGIScriptAlias / /home/ec2-user/DjangoProjects/myproj/myproj/wsgi.py process-group=mysite.com application-group=%{GLOBAL}
<Directory "/home/ec2-user/DjangoProjects/myproj">
<RequireAll>
#Require not ip 47.222.213.25
Require not ip 34.207.41.127
Require not ip 54.209.63.240
Require not ip 44.196.220.146
Require not ip 34.206.83.67
Require not ip 34.194.232.56
Require not ip 44.194.69.200
Require all granted
</RequireAll>
<Files "wsgi.py">
<RequireAll>
#Require not ip 47.222.213.25
Require not ip 34.207.41.127
Require not ip 54.209.63.240
Require not ip 44.196.220.146
Require not ip 34.206.83.67
Require not ip 34.194.232.56
Require not ip 44.194.69.200
Require all granted
</RequireAll>
</Files>
</Directory>
</VirtualHost>
我想阻止<RequireAll></RequireAll>
标签中标记的 IP 地址 - 但是它并没有阻止 IP 地址。当我插入我的 IP 地址进行测试时,它允许我直接通过。当我使用deny from
它时,它至少会阻止我的 IP 地址,但我读到它已被弃用。所以我觉得在尝试阻止这些 IP 地址的同时,我不妨修复配置文件。
它会运行,我可以访问网站(讽刺的是,这正是问题所在,因为我正试图通过阻止我的 IP 来测试这一点),所以我认为这可能是一个逻辑配置问题,但我太业余了,不知道那是什么,所以非常感谢您的指导!谢谢。
我在 Google 上搜索过,尝试过许多建议的答案,所以我认为这一定是我这边的配置问题 - 但看到文档在我的配置文件中是这样的,我很困惑。我见过有人提到文件中的别名可能会绕过配置文件的任何 ip 限制,但我认为在这种情况下我可以排除这种可能性 - 我有 1 个文件别名static
,如果我可以只阻止主站点,我就不一定会关心被阻止的 ip 可以找到哪些静态文件。
我还没有尝试过 .htaccess 文件,但我可能会开始尝试。我从某处读到,它比在 .conf 文件中配置它要慢。
更新 .htaccess 文件- 我不知道为什么有人会期望这会有所不同,但它没有起作用。
编辑- 我不确定这有多么相关,但我在错误日志中收到此错误:
[Thu Oct 13 16:53:59.234764 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] Invalid HTTP_HOST header: 'x.x.x.x'. You may need to add 'x.x.x.x' to ALLOWED_HOSTS.
[Thu Oct 13 16:53:59.234764 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] Traceback (most recent call last):
[Thu Oct 13 16:53:59.234769 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] File "/home/ec2-user/django/django/core/handlers/exception.py", line 55, in inner
[Thu Oct 13 16:53:59.234772 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] response = get_response(request)
[Thu Oct 13 16:53:59.234776 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] File "/home/ec2-user/django/django/utils/deprecation.py", line 136, in __call__
[Thu Oct 13 16:53:59.234779 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] response = self.process_request(request)
[Thu Oct 13 16:53:59.234783 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] File "/home/ec2-user/django/django/middleware/common.py", line 48, in process_request
[Thu Oct 13 16:53:59.234786 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] host = request.get_host()
[Thu Oct 13 16:53:59.234789 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] File "/home/ec2-user/django/django/http/request.py", line 148, in get_host
[Thu Oct 13 16:53:59.234793 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] raise DisallowedHost(msg)
[Thu Oct 13 16:53:59.234796 2022] [wsgi:error] [pid 4234] [remote y.y.y.y:port] django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: 'x.x.x.x'. You may need to add 'x.x.x.x' to ALLOWED_HOSTS.
当我尝试访问无效路由并且我的 IP 不在 ALLOWED_HOSTS 中时,我没有收到此错误,这对我来说很有趣。这可能并不意味着什么。
答案1
我想知道您是否可以简化配置以准确找出哪些地方不起作用?以下操作似乎完全符合预期:
<VirtualHost *:80>
ServerName www.mysite.com
<Directory /var/www/html/protected>
<RequireAll>
Require not ip 192.168.1.200
Require not ip 192.168.1.201
Require all granted
</RequireAll>
</Directory>
</VirtualHost>
如果我从不在拒绝列表中的地址访问它,它可以正常工作:
$ curl -H 'Host: www.mysite.com' 192.168.122.67/protected/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Root</title>
</head>
<body>
This is the protected document.
</body>
</html>
但如果我从禁止的 IP 访问,我会收到响应403 Forbidden
:
$ curl -H 'Host: www.mysite.com' 192.168.122.67/protected/ --interface 192.168.1.200
<!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 this resource.</p>
</body></html>
您能重现该行为吗?首先尝试一下,如果可行,则开始引入配置的其他部分,直到行为发生变化。
如果您的 Web 服务器位于代理后面,则需要稍微不同的解决方案。首先,您需要确保您的前端代理在 HTTP 标头中为您提供原始客户端地址,例如X-Forwarded-For
或者Forwarded
。
您有以下几种选择:
您可以直接匹配标头。例如,如果原始客户端 IP 位于
X-Forwarded-For
,我们可以阻止特定客户端的访问,如下所示:<Directory "/usr/local/apache2/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require expr %{HTTP:X-Forwarded-For} != '172.25.0.1' </Directory>
您可以告诉 Apache 将标头中的 IP 地址视为客户端地址,以便使用
mod_remoteip
模块。在这种情况下,您可能有:
LoadModule remoteip_module modules/mod_remoteip.so RemoteIPHeader X-Forwarded_for <Directory "/usr/local/apache2/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require not ip 172.25.0.1 </Directory>