请注意:端口 22 只是一个示例端口,有些情况下它不是我要处理的端口 22。
安全组
"server-1" has a security group "group-1"
"server-2" has a security group "group-2"
"server-1" has an elastic ip address assigned to it i.e 111.222.333.444
和
"group-2" is allowed to connect to "group-1" via port 22
因此,如果我通过以下命令从server-2 ssh到server-1
ssh -iKEY.pem [email protected]
连接正常,按预期工作。
但是,如果我尝试通过此命令进行连接。
ssh -iKEY.pem [email protected]
由于我认为显而易见的原因,它不起作用
我已经离开 aws 网络以连接到server-1,因此 aws 将来自server-2的连接视为外部资源,不再是 aws 实例。这意味着它不会使用说的安全组:
"group-2" is allowed to connect to "group-1" via port 22
实际问题
我想通过 ElasticIP 地址连接到server-1 ,这样我就可以愉快地重启server-1和/或server-2,而不必担心 aws 实例名称/ip 地址已更改,即第一个 ssh 示例中的域名将在重新启动/新实例接管时发生变化。
所以我的问题真的是这样做的最佳实践方法是什么。我目前可以看到的选项是:
对 ElasticIP 地址进行反向 dns 查找,并使用此域名从服务器 2连接到服务器 1 ,即弹性 IP 地址为 111.222.333.444,反向查找将返回我
ec2-111-222-333-444.eu-west-1.compute.amazonaws.com
我无法继续手动构建它,因为我还需要知道实例所在的可用区才能做到这一点(我非常希望不关心它在哪里)。
我假设我可以执行一个 aws api 调用来获取附加到 ElasticIP 地址的当前实例名称。我并不过分关注该应用程序,因为它知道它位于 aws 服务器上,并且希望远离 api。
在 aws 中使用 vpc 实例。这样我就可以始终将相同的私有 IP 地址附加到server-1并可靠地连接到它,即使在任一服务器重新启动后也是如此。然而,这似乎伴随着大量的配置和维护。
我可以在重启后手动更新指向server-1的任何配置设置(这不是系列建议)。
向世界开放server-1端口 22(注意:我想打开其他端口,而不仅仅是 22)并担心应用程序进行身份验证。(再次不是一个真正明智的选择,因为如果我想打开端口 80 到server-2然后必须使用 .htaccess 或类似的来验证连接,因此只是移动这个问题而不是真正解决它)。
我对选项 1 和 2 的问题是,我必须始终执行这些查找,这会在应用程序上产生大量开销,或者我缓存它并且必须忍受这样一个事实,即如果server-1的实例发生更改,即发生重新启动然后有一段时间server-2将无法连接到server-1,直到它取消缓存实例名称。
选项 3 可能是最好的解决方案,但它伴随着耗时的配置和维护,并且需要我们公司内部的额外知识。
有没有人有其他可行的建议?
鉴于您的要求,我同意使用 VPC 是最佳解决方案。由于听起来您已经完成了研究,您知道 VPC 允许对子网和主机寻址进行更细粒度的控制。要回答您的问题,那就是“最佳实践”方法。
我要做的是创建两个私有子网,每个 AZ 一个,然后在每个子网中放置一个具有静态私有 IP 地址的弹性网络接口。然后您可以随意将 ENI 附加/分离到适当的实例。这允许一些很酷的东西和功能,比如在流量仍在流经它时在服务器之间热交换 NIC。是的,设置 VPC 有一个重要的学习曲线,但是当使用需要相互通信的多个 EC2 实例时,权衡会大大提高安全性和灵活性。
值得注意的是,利用 AWS API(正如您也提到的)也是满足您即时需求的可行解决方案。但是,在编写自定义解决方案的这条道路上走得越远,随着需求的增长,维护它所花费的时间就越多。
查找实例的公共 dns 的 AWS api 方法是这样的:
(这是 AWS 内部 ip,不是外部服务。)
但至于问题的根源,弹性 IP 的公共 DNS 应该与该弹性 IP 永久关联,无论它指向的重启/新实例如何。我所有的弹性 IP 公共 DNS 看起来都像 ec2-11-22-33-44.compute-1.amazonaws.com。你怎么在公共 DNS 中有一个区域?上面的api返回什么?