我在 VPC 中有两个实例,它们属于不同的安全组,每个都有自己的公共 IP。我希望实例一能够通过其公共 IP 连接到实例二。我发现授予安全组访问权限只允许访问私有 IP,而不允许访问公共 IP。
我现在已经定义了我的安全组,以允许访问驻留在其他安全组中的实例的公共 IP。然而,这很不方便,因为我无法轻松地自动执行此操作(想想 Ansible),因为我首先需要查找 DNS 名称,然后才能将其添加到组中。
有谁知道更简单的方法吗?
总结一下:
- 实例 1 -> 1.2.3.4
- 实例 2 -> 5.6.7.8
实例 1 需要通过其公共 IP 访问实例 2。我目前不得不手动查找实例 1 的 IP,然后将其添加到实例 2 的安全组中。
答案1
恐怕一旦你使用公共 IP,你就不能再使用安全组 ID作为目标 SG 中的源。这仅适用于私有 IP。
但是如果你创建实例 1通过 Ansible,您可以使用Ansible 事实让实例获取其公共 IP 并将其设置为实例 2 SG. 类似这样的操作应该可以做到:
- name: Create Instance 1
ec2:
key_name: mykey
instance_type: t2.micro
image: ami-123456
wait: yes
assign_public_ip: yes <<< Assign Public IP
register: ec2
然后你可以将其作为源添加到实例 2 安全组:
- name: Instance 2 SG
ec2_group:
name: ...
rules:
- proto: tcp
ports:
- 80
cidr_ip: "{{ ec2.instances.public_ip }}" <<< Use it here
类似这样的操作应该可以让你用 Ansible 实现自动化。
希望有帮助:)
答案2
来自实例公共 IP 地址的请求不会被视为来自实例的安全组。这仅适用于使用私有 IP 地址的请求。
我建议源实例使用可解析为目标实例私有 IP 的目标实例 DNS 地址。例如:您创建一个 CNAME 记录,my-service.example.com
该记录指向 AWS 提供的目标实例的公共 DNS 名称。公共 DNS 名称将类似于ec2-public-ipv4-address.compute-1.amazonaws.com
。
AWS 提供水平分割 DNS 解析。当my-service.example.com
在公共互联网上解析时,将返回公共 IP。当my-service.example.com
在您的 VPC 中解析时,将返回私有 IP。因此,您的源实例将使用私有 IP 连接到目标实例,并且您的安全组规则将按预期工作。
这种 DNS 配置并不总是可行或实用的,因此您可能需要将源实例的公共 IP 地址列入白名单。在这种情况下,请确保它是一个弹性 IP 地址 - 否则如果服务器关闭,公共 IP 将会更改。
答案3
通常,您会创建一个命名的安全组,将其附加到这些实例,然后添加一条引用该安全组作为源并允许所需目标端口的规则。
最终图片:
- 所有需要互相通信的实例均已附加
created security group
。 - 包含以下
created security group
规则:created security group
destination port you need
- 通常不包括出站规则,因为安全组是有状态的。但您可以随意添加所需的内容。
因此基本上甚至不需要单个 IP,并且可以通过将安全组附加到需要访问的资源来控制允许/拒绝。此方法也适用于动态环境(例如自动缩放)。