规格
我有一个具有以下规格的亚马逊 VPC 实例:
- Windows 2003(32 位)。
- 两个网络接口,每个接口有 6 个 IP。
- 机器上安装了 6 个软件实例(称为 backweb)。每个实例针对不同的客户。(例如客户 1 至客户 6)。
- backweb 的每个客户实例在 2 个 IP 上进行通信。
要求
我的实例主要有 12 个 IP,我想阻止这 12 个 IP 中的 2 个 IP 上的 TCP 80 INBOUND TO。请记住,所有 12 个 IP 都分配给同一个实例。
- 阻止所有 http 流量客户1backweb 实例,比如 IP 10.0.10.1 和 10.0.10.2。
- 允许 http 流量客户1来自几个特定的 IP,例如 2.96.219.283。
- 允许所有其他客户(客户 2 至客户 6)的 http 流量,比如 IP 10.0.10.3 至 10.0.10.12。
可能的解决方案和限制
- (更不用说)Amazon SG 和 ACL 并不是为了根据我的用例控制流量,如上所述(请参阅最后的注释)。
- Windows 2003 R2 防火墙不支持这种细粒度的控制,无法过滤到本地实例上的特定 IP 的入站流量,同时让其他 IP(属于同一实例)接收该流量。
- IPSec 策略没有选项来提及我的 Windows 实例的特定 IP 来控制流量。它只提供了一个选项“我的 IP 地址”,这实际上意味着我机器上的所有 IP 地址。
- 向实例添加另一个网络接口;将需要阻止 http 的 IP 放在这个额外的 NIC 上,并使用该 NIC 上的 SG 控制流量。在我们的情况下这是不可能的,因为它是一台 32 位机器,最大的可能实例类型是 m1.medium 或 c1.medium。它们都支持最多 2 个 NIC,而机器已经有了,我们无法添加第三个。
请注意为什么无法通过 SG 和 ACL 实现这一点:
- 安全组旨在控制交通实例(或通过 ENI)。
- 网络 ACL旨在控制交通子网。
参考:
- http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html
- http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
PS 请仔细阅读上述详细信息,如果问题不清楚,请询问我。不要只看标题就将其解释为简单的场景。请坚持问题,欢迎提出建议,但不要完全偏离问题。
答案1
Amazon SG 和 ACL 并不旨在根据 IP 控制流量(请参阅最后的注释)。
这绝对是错误的。
安全组能可以使用实例 ID 构建,但您也可以使用 CIDR 子网。这适用于进入/离开 VPC 的流量此外也适用于交通之内您的 VPC。如果您有“默认”VPC 配置,则有一个默认 SG 允许 SG 成员之间的所有流量,但如果您选择,您可以完全删除该 SG 并构建您自己的 SG 结构。
关于 ACL,正如 Mxx 上面所说,它们通过子网进行限制,包括单主机/32
子网。此外,ACL 仅适用于跨越子网边界的流量,因此在您的情况下使用它们可能不适用。
Windows 防火墙默认是禁用的。启用它很危险,因为这可能会导致各种看不见的问题。由于这是一台生产机器,所以我们不想冒这个险。不过,这是我们最后的手段。
这就是测试/开发环境的用途。模拟您提议的规则集并进行测试,然后部署到您的生产机器上。
并且我希望这 12 个 IP 中只有 2 个停止监听 TCP 80,而其他 10 个 IP(再次在同一个实例上)继续监听 TCP 80。
嗯,问题就在这里。你说得对,你不能限制访问到使用安全组来限制特定 IP 的访问。您只能限制到特定的主持人。但是,通过一些有创意的网络 ACL,您可能能够想出适合您的配置。但是...
在我看来,你的做法完全是错误的。为了这些目的,在服务器上拥有 12 个 IP 地址是疯狂的。你应该要做的是让软件的每个实例监听不同的端口,然后在其前面放置一个路由层。一个带有 nginx 或类似程序的小型实例就足够了,并且该服务器可以将 http 流量反向代理到应用程序。这将为您提供一个执行访问控制的单一位置,该位置可以是 nginx 中的应用程序层或者通过安全组。
至于下一步该怎么做——我并不羡慕你的处境。你正在一个(几乎)EOL、不再支持的操作系统上运行一个 EOL、不再支持的应用程序,并且部署在一个显然不适合使用它的环境中。我怀疑这就是你被否决的原因,尽管正如下面提到的,我并没有给你否决。
老实说,如果您无法升级到最新的操作系统或最新版本的软件(支持绑定到任意端口),我会考虑退出 EC2,并将该应用程序移动到“遗留”托管平台。
答案2
如果有人好奇我是如何解决的,或者遇到了类似的情况。我必须选择我在问题中提到的可能解决方案之一。
向实例添加另一个网络接口;将需要阻止 http 的 IP 放在这个额外的 NIC 上,并使用该 NIC 上的 SG 控制流量。
我还提到了上述可能的解决方案的局限性。
在我们的情况下这是不可能的,因为它是一台 32 位机器,最大可能的实例类型是 m1.medium 或 c1.medium。它们都支持最多 2 个 NIC,而机器已经拥有 2 个 NIC,我们无法添加第三个。
尽管限制仍然存在,但这是我可以证明在我的环境中唯一可行的选择。因此,我决定将一些客户转移到另一台机器上,并在两台机器上执行上述操作。详细的逻辑步骤可以表述如下:
- 将 6 个客户安装中的 3 个从第一个 Windows 实例移动到该 Windows 实例的克隆。这将导致一个 Windows 实例上有 6 个 IP。
- 每个 Windows 实例都有 2 个网络接口。例如 ENI-1 和 ENI-2。
- 那些需要接收 HTTP 流量的 IP 将它们附加到 ENI-1。
- 将需要阻止 HTTP 流量的 IP 附加到 ENI-2。
- 创建两个安全组;例如 http_sg_ALLOW 和 http_sg_BLOCK。
- 向 http_sg_ALLOW 添加规则,以允许来自您想要的任何来源的 HTTP 流量。
- 将 http_sg_ALLOW 应用于 ENI-1。
- 向 http_sg_BLOCK 添加规则,以阻止来自任何您想要的来源的 HTTP 流量。
- 将 http_sg_BLOCK 应用于 ENI-2。