背景
我有 2 个域名。我需要允许以下某些 IP 地址:
- a.domain.io- 允许所有 IP
- b.domain.io- 仅允许 IP 1.2.3.4
建议的解决方案
我不是基础设施人员,但我有这个想法。
- Route53 将指向a.domain.io应用程序负载均衡器白蛋白A 或者b.domain.io作为ALB-B
- 白蛋白A将直接指向资源(EC2)
- ALB-B将使用某种“防火墙”(可能是ACL 或安全组)将只允许 IP 1.2.3.4 到达,并将流量转发到EC2
问题
所提出的解决方案是否是一个好的设置,还是我应该完全保留它或以某种方式对其进行调整?
答案1
2 个平衡器解决方案的问题在于,它们中的任何一个都会不加区分地接受任何Host
标头并将请求转发到服务器。将多个平衡器指向同一台服务器没有任何问题,但如果恶意用户知道,此配置会轻易绕过您的安全组设置a.example.com
- 他们只需连接到 a.example.com 平衡器并注入Host: b.example.com
他们的请求,而实例无法分辨出差异。
ALB 为每个传入请求添加一个 HTTP 标头X-Forwarded-For
。此标头中最右边的值表示连接客户端的实际 IP 地址,并且无法伪造。最右边值左侧的任何地址均由客户端(通常是代理或脚本小子)提供,对于您的目的而言是不可信且毫无意义的。但右边的地址是准确的。
最简单的配置是使用单个 ALB,对于实例上接受 HTTP 连接的任何内容(例如 Nginx、Apache),当标Host
头包含 b.example.com 但X-Forwarded-For
不包含时,简单地拒绝 HTTP 请求结束于受信任的 IP,例如 203.0.113.50。错误可能是,403 Forbidden
但也许更好的可能是503 Service Unavailable
。
使用两个平衡器设置,并且一个平衡器受安全组或 NACL 限制,您的实例或平衡器需要阻止b.example.com
通过a.example.com
平衡器的请求。实例不能,因为识别哪个平衡器发送的请求并不实用。当它们扩展或发生故障(并恢复)时,它们的内部地址会发生变化。
可以通过 ALB 对特定请求进行黑洞处理,方法是通过Host
标头或路径模式匹配正如我在 SF 上讨论的那样通过创建一个没有分配实例的虚拟目标组...因此 a.example.com 平衡器可以使用这样的配置将 b.example.com 的请求黑洞化。
或者,您可以将 Amazon Web Application Firewall (WAF) 与 ALB 结合使用来阻止任何意外请求。无论如何,如果您打算使用 WAF,这是一个不错的选择。
但是...如果你做使用 WAF,那么您就不需要两个平衡器……您可以为两个站点使用一个平衡器,并在 WAF 上添加规则以阻止对Host: b.example.com
除非客户端 IP 与允许列表匹配。WAF 的唯一缺点是,由于它会检查每个请求,这意味着 WAF 的中断会导致您的网站中断……所以 WAF 的设计注定会失败打开。 WAF 故障意味着允许所有流量,无论这种故障发生的可能性有多小。WAF 是完全托管的,因此您无需维护任何内容。