我有几个实例在同一个安全组(比如:Group-A)中运行,它们需要相互通信,特别是端口 4369。
每个实例都有不同的弹性 IP。
安全组配置为允许通过 TCP:4369 Soruce:sg-XXXXX (Group-A) 的入站流量
但是,实例只能通过内部 IP (10.xxx.xxx.xx) 或亚马逊公共 DNS 相互通信:ec2-ELASTIC-IP.compute-1.amazonaws.com(显然亚马逊会将其转换为内部 IP) .
如果我使用弹性 IP,它将无法正常工作。如果我使用自己的指向弹性 IP 的 FQDN,它将无法正常工作。
如果我将入站规则中的源从 sg-XXXXX (Group-A) 更改为 0.0.0.0,它将与我自己的 FQDN 和弹性 IP 一起使用。但出于安全考虑,我们不会使用它。如果我删除入站规则,则没有任何效果,甚至使用内部 IP。
那么如果我想使用自己的 FQDN 应该怎么做呢?(worker-1.company.com -> Elastic IP),可读性更强,更易于管理。
您描述的行为是正常的,因为当通过弹性 IP 在实例之间进行通信时,安全组中机器的身份(出于依赖于 sg-xxxxxxxx 源的安全组配置的目的)实际上无法完全建立信心,因为翻译地址(可能)通过中间硬件发送流量,并且流量不再被视为直接来自实例。
解决方案是在 DNS 中使用指向公共 DNS 记录的 CNAME 记录来命名您的主机,而不是指向特定 IP 地址的 A 记录。
在 company.com DNS 区域中:
现在,如果从内部查询,worker-1.company.com 将解析为私有 IP,而从外部查询则解析为公共 IP。
它并不完美,但您可以在每个实例的主机文件中添加从 FQDN 到私有 IP 的显式映射。因此,您的代码将使用 FQDN,但网络实际上将使用私人通信(无论如何这更安全)。
如果您有少量、相对固定的实例集,这是一个合理的选择。如果可能的话,您可能应该自动化这个过程。
您还可以使用 Route 53,Amazon 的 DNS 即服务。将您的 FQDN 映射到实例的公有 DNS 名称。在 EC2 内部,这将映射到私有 IP。您仍然需要使用 route 53 API 自动执行此操作。