我正在尝试了解问题reported by a user against one of my open source projects。当他们查询checkip.amazonaws.com
时,有时会获得多个逗号分隔的IP地址。
我找不到有关此的任何信息,所以很好奇:
checkip.amazonaws.com
在什么情况下返回多个地址?答案 0 :(得分:2)
使用最右边的值作为权威性值,将任何其他值用作参考性但不可信的值,因为它们实际上是从传入请求的标头中复制的。
测试表明该端点使用HTTP X-Forwarded-For
语义并返回最终结果值...因此,如果用户位于注入X-Forwarded-For
的任何类型的代理后面,则这些值来自响应中包含传入的请求,并且用于联系该服务的实际地址显示在右侧,作为最后一个值。
您可以通过向请求中插入一个或多个X-Forwarded-For
标头来证明这一点。
左边的值(如果存在)可能是请求者网络上的私有内部IP地址,但是X-Forwarded-For
的设计意味着既不能证明也不能证明它们是准确的。最右边的那个永远是正确的那个。
请注意,如果使用https访问终结点,则完全看不到此行为,因为代理不太可能注入这样的标头。 (对于MITM代理和证书伪造并非没有可能,但是行为良好的系统永远不会这样做。)
AWS的这项服务是一种故障排除功能,似乎没有正式记录在案。它使用X-Forwarded-For
的事实表明,毫无疑问,该测试站点托管在负载均衡器后面,并且响应中出现多个地址可能是由于以下原因导致的意外功能:最初的实现方式。
最佳实践可能是创建自己的“我的IP是什么”服务以嵌入到自己的产品中,因为有时公共服务会被恶意软件/僵尸网络作者滥用。发生这种情况时,您的软件可能被误认为是恶意软件,这使您一团糟,无法解释可能发生的恐慌。第三方服务,即使是“公共”服务,也可能希望不要未经允许就调用其服务。
答案 1 :(得分:0)
DNS名称可以与多个IP地址关联。
来自AWS | Amazon Route 53 | FAQs:
问。我可以将多个IP地址与一条记录关联吗?
是的。通常将多个IP地址与一条记录相关联,以平衡地理位置分散的Web服务器的负载。 Amazon Route 53允许您列出A记录的多个IP地址,并使用所有已配置IP地址的列表来响应DNS请求。
另请参阅:StackOverflow: Multiple IP addresses for Resource Record Sets of Route 53
答案 2 :(得分:0)
服务checkip.amazonaws.com
提供发出请求的客户端的公共IP地址。我可以想到两个原因,即可以返回多个IP地址。但是,我无权访问AWS编写的代码以确切知道它们正在处理什么。我编写了一个PHP服务,可以完成相同的功能。
我确信还有更多的情况。但是,您应该解析IP地址字符串,并在逗号,制表符等处分割或终止该字符串,以便仅指定第一个valid
IP地址。
答案 3 :(得分:0)
checkip.amazonaws.com
服务似乎不再返回多个IP:
$ curl --header "X-Forwarded-For: 10.10.10.3" \
--header "X-Forwarded-For: 10.10.10.2" \
--header "X-Forwarded-For: 10.10.10.1" \
http://checkip.amazonaws.com/
10.10.10.3
有人还会返回多个IP吗?