【问题标题】:Django HTTP_HOST errors on AWS EC2 behind Load Balancer负载均衡器后面的 AWS EC2 上的 Django HTTP_HOST 错误
【发布时间】:2016-08-09 04:26:00
【问题描述】:

我有一个 Django 应用程序,它使用 Apache 和 mod_wsgi 在 AWS ELB 平衡器后面的 EC2 实例上运行。平衡器将 SSL 流量(端口 443)映射到 EC2 实例上的端口 8080。 Apache 在端口 8080 上配置了一个 VirtualHost 来为 Django 应用程序提供服务,其中 ServerName 设置为网站的域名。 Django 在生产模式下运行(DEBUG=False),并公开了一个 healthcheck 端点(在 /healtcheck 中)。 ALLOWED_HOSTS 设置设置为网站的域名,加上 EC2 实例的私有 IP 地址,以允许负载均衡器访问运行状况检查端点。

这个设置一切正常。问题是我偶尔会收到来自 Django 的电子邮件,其中包含类似以下的错误消息:ERROR (EXTERNAL IP): Invalid HTTP_HOST header: '52.51.147.134'. You may need to add u'52.51.147.134' to ALLOWED_HOSTS. 标头还包含HTTP_X_FORWARDED_FOR = '139.162.13.205'

我想我得到了属于脚本小子的各种 IP 地址(有时还有主机名)。

如何阻止此流量到达 Django 应用程序,同时仍然允许有效流量(其中 HTTP_HOST 是我的域名)和 ELB 运行状况检查流量(其中 HTTP_HOST 是我的 EC2 私有 IP 地址)?

【问题讨论】:

  • 如果我理解正确,这只是烦人,您没有遇到任何其他不良影响吗?无论如何,您应该能够在 Apache 中简单地过滤它,但如果您可以提供 Apache 版本和当前的 VirtualHost .conf 会很有用

标签: python django apache amazon-web-services amazon-ec2


【解决方案1】:

如果您通过 SSH 连接到 EC2 实例,我建议您仅允许使用安全组和办公室/家庭 IP 地址的负载均衡器上的 EC2 实例上的流量。

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-security-groups.html#elb-vpc-instance-security-groups

这将阻止脚本小子直接访问 EC2 实例,这就是这里发生的情况。

【讨论】:

  • 我已经这样做了。端口 8080 流量仅限于负载均衡器的安全组。端口 22 (SSH) 流量向全世界开放,但这不是问题。不需要的流量会通过负载均衡器。
  • 看起来你受到了这个 bug code.djangoproject.com/ticket/19866 的摆布,但它在很久以前就被修复了。你用的是什么版本的django?一定有人在欺骗 HTTP_HOST,现在应该向他们返回 400,并且由于 500 错误而不会向您发送电子邮件
  • 我使用的是 Django 1.10。该行为似乎与此错误有关。看起来 bug 确实已经修复,返回的响应代码是 400,但仍然记录了安全异常,所以我(作为管理员)收到了一封电子邮件。现在,我当然可以使用日志配置来禁用它,但如果我能在它到达 Django 之前过滤掉它会很好。无论如何,谢谢,这很有用。
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多