x-forwarded-for 标头

x-forwarded-for 标头

我目前正在研究高流量高可用性网站的架构。

我们正在使用 AWS。

目前,我们有:

路线 53 -> ELB -> 多个 EC2 实例 -> RDS 多可用区。

每个 EC2 实例都运行 Varnish + Nginx 和 PHP FCGI。会话和一些其他共享数据通过 ElastiCache 存储。

我们计划在每个 EC2 实例上运行 Varnish 和 Nginx,因为这可以让我们减少故障点,并且在负载增加时只需运行额外的实例。

但是,我们必须在此基础上添加 iptables(fail2ban)。当然,我们获取的是 ELB 的 IP,而不是真正的客户端 IP……

我们考虑了以下解决方案:

1)在 Route 53 和 ELB 之间添加一个 EC2 实例,运行 iptables/防火墙(也许还有 varnish?)并将所有内容转发到 ELB。

2)用运行 HAProxy + iptables 的自定义 EC2 替换 ELB。

3)使用 mod_security 并构建一些自定义内容来动态列入黑名单 IP

4)坚持当前架构并从待办事项列表中删除 iptables。

什么是好的方法?

谢谢

答案1

x-forwarded-for 标头

当然,我们获取的是ELB的IP,而不是真实的客户端ip......

您将需要使用 x-forwarded-for 标头,它将为您提供客户端 IP。

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

当您使用 HTTP/HTTPS 负载均衡器时,X-Forwarded-For 请求标头可帮助您识别客户端的 IP 地址。


这里还有一些您可能感兴趣的内容...

安全组和网络 ACL

AWS 提供了两个出色的安全功能,它们与 iptables 的作用相同:

  • 安全组
  • 网络 ACL

安全组(可以替代 iptables)使您能够根据 IP 和端口允许/拒绝流量。还有其他功能可用于提供另一种 AWS 资源来代替 IP 地址。

网络 ACL 让您可以进一步控制网络。您可以根据 IP 和端口允许/拒绝 VPC 内子网内和子网之间的流量。

AWS 安全

  • 如果您使用 VPC,您可以将 EC2 之类的东西放入私有子网中。
  • 需要面向公众的 ELB 可以仅暴露基本内容(443、80)。
  • 您可以将 SSH 等服务锁定到 IP 白名单中。
  • 如果您有一个带有用于管理的 Web 界面的应用程序,则可以在 Web 服务器级别将其锁定,以防止软件级别的任何漏洞。

为 EC2 添加您自己的安全性

如果您希望在 EC2 上添加额外的安全措施(例如 fail2ban)并且在负载均衡器后面使用多个 EC2,则需要设计您的 EC2,使它们上没有任何唯一数据(如果 EC2 #2 上没有规则,则没有必要在 EC2 #1 上添加规则)。

有一些技术可以让 EC2 保持彼此同步,例如将数据存储在 S3 上、从主服务器提取配置管理或从同一存储库提取内容。使用 Golden 映像以及引导脚本(从 S3 提取数据)。

回答你的问题

1)在 Route 53 和 ELB 之间添加一个 EC2 实例,运行 iptables/防火墙(也许还有 varnish?)并将所有内容转发到 ELB。

在 ELB 前面添加 EC2 实例会削弱您的扩展能力。您还会造成单点故障,因此您可能不想这样做。

2)用运行 HAProxy + iptables 的自定义 EC2 替换 ELB。

您可以这样做,但代价是您必须自己管理。您需要对软件、安全性、更新、可用性等负责。如果可能,您应该避免这种情况(即,仅当您无法使用 ELB 解决问题时才这样做)。

3)使用 mod_security 并构建一些自定义内容来动态列入黑名单 IP

这是一个选择,但您可能希望在操作系统/网络级别而不是(仅仅)在软件/应用程序级别管理安全性。

4)坚持当前架构并从待办事项列表中删除 iptables。

当然这是一种选择,但是对于业务/项目来说可以接受吗?

相关内容