2016-12-15 62 views
1

我正试图在Amazon EC2上实现基本的洋葱路由服务。 我的网络背后的基本概念如下:我有一个目录节点,链节点和发起者(客户端)。链节点向目录节点注册,从而确定流量的路由。AWS传入请求的来源(IP)

当我在本地机器上运行它时,一切正常。当我从单独的EC2实例运行每个组件时,它不起作用。这是因为目录节点没有看到链节点的“真实”位置,所以当它们注册时,它认为它们有其他IP。当注册我的机器上运行的链节点时,我注意到这种行为,目录节点在EC2实例上运行。目录节点将注册请求视为来自亚马逊网络。节点彼此通信的方式是通过REST。目录节点从请求头中获取链节点的地址,这似乎始终指向AWS网络中的某个位置,而不是指向请求的真正来源。

我是新来的云计算,这是我与AWS的第一次互动。为了尽我所能,我无法在网上找到我的问题的答案,所以我决定在这里问。也许值得一提的是,我的确了解了弹性IP,但据我了解,它们是一种“静态”IP,用于实现这些实例。这不会对我有所帮助,因为链节点最终应该根据活动节点的数量最终在其自己的VM中动态生成。在这种情况下,目录节点将不知道新链节点的IP,无论它是否弹性。

对我有什么建议吗? 在此先感谢!

+0

为什么你不能在请求头中使用IP来进行通信? – helloV

+1

由于以下情形:目录节点位于EC2上。链节点在我的PC上并尝试注册。目录节点会看到以下内容:收到的注册请求来自:,而不是<我的本地计算机的IP>。然后,当它试图告诉该节点必须路由一段流量时,它会尝试与对话,并且链节点不知道它必须执行任何操作,因为它位于本地计算机的 。 – Syn

+0

PC上的软件如何到达EC2上的目录节点?什么是您的网络配置? –

回答

0

除非您自己创建一个代理(例如使用Elastic Load Balancer),否则没有代理与AWS流量内联。

我怀疑混淆如下解释。

每个在EC2中具有公共IP地址的实例都有一个自动DNS主机名。例如,如果你在美国西2区的情况下,与公网IP地址203.0.113.254,该机器会也有一个类似的主机名:

ec2-203-0-113-254.us-west-2.compute.amazonaws.com 

AWS之外,此主机名的作品如预期。

在一个VPC中,它是不同的。

所有EC2实例都有私有IP地址。如果实例也有有一个公共地址,它不会直接知道它。公共IP由VPC Internet网关转换为专用IP。

当VPC内的一个实例访问采用与上述所示的一个主机名VPC 内的另一个实例,VPC内部的DNS解析器将默认在您的默认VPC每个区域,返回的私人 IP目标实例,而不是公共IP。因此,目标机器将看到客户端的IP,而不是公共IP。

这很有用,因为VPC内部的计算机使用其公共IP地址与VPC内的其他实例通话时会产生额外的数据传输费用,但使用专用IP时附加费用不适用。

如果你使用一个不同的主机名,而不是由AWS提供的一个,访问实例,不会发生此重新映射。例如...

my-chain-node-zero.203.0.113.254.xip.io 

...也将解析为203.0.113.254,但不会显示此重新映射行为。 (请阅读http://xip.io的工作原理,我不属于该服务的提供者)。

或者如果您有自己的域名,请创建A记录指向有问题的公有IP地址。请勿创建引用Amazon提供的主机名的CNAME - 当遵循CNAME链时,那些将会重新映射

Using DNS with your VPC见。

+0

谢谢你的回答。然而,我仍然不清楚如何使用xip.io来获取链节点的真实IP。唯一已知的地址是目录节点之一。然后链节点向它发出请求,目录节点必须找出并存储它们的位置。根据我的理解,目录节点会看到链节点的私有IP,而不是公有节点。可以在不知道发出请求的节点位置的情况下使用xip.io(在本例中是链节点)? – Syn

+0

还是你的意思是我应该使用xip.io来访问目录节点?像my-directory-node.203.0.113.254.xip.io而不是my-chain-node-zero.203.0.113.254.xip.io? – Syn

+0

由于您没有提供问题中的具体示例,我假定您的节点正在使用其ec2主机名连接到其他节点。这里的想法并不是在相反的方向上,而是在向前的方向上。您可能想要提供具体的例子,说明什么与什么相关,以及如何(按名称或IP)以及实际与预期结果。看到我对这个问题的评论,关于ec2metadata。 –