我目前正在研究高流量高可用性网站的架构。
我们正在使用 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/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。
当然这是一种选择,但是对于业务/项目来说可以接受吗?