如何从负载均衡器后面获取客户端的 IP 地址?
Posted
技术标签:
【中文标题】如何从负载均衡器后面获取客户端的 IP 地址?【英文标题】:How do I get a client's IP address from behind a load balancer? 【发布时间】:2011-02-12 15:04:11 【问题描述】:我正在使用 TcpClient 在端口上侦听请求。当请求来自客户端时,我想知道发出请求的客户端 IP。
我试过了:
Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString());
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString());
var networkStream = tcpClient.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine(socketIp);
所有这些地址都输出 10.x.x.x 地址,这些地址是私有地址,显然不是我的网络之外的客户端发出请求的地址。我该怎么做才能获得发出请求的客户的公共 IP?
编辑: 我们正在使用带有 tcp 转发的 Amazon EC2 负载均衡器。有没有办法在这个设置中获取真正的客户端 IP?
【问题讨论】:
您如何确定这些地址是“明确”的,而不是您网络外客户端的地址。您至少知道您的客户所在的 IP 范围吗?它们是驻留在您的内部网络中,还是驻留在公共互联网中? 因为它们都以 10 开头。 - 这表示私有 IP 范围而不是公共 IP 地址。 en.wikipedia.org/wiki/Private_network 【参考方案1】:这行得通吗:
((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString()
如果客户端通过内部网络连接到您,我不确定您是否可以获得他们的公共 IP,因为返回客户端的连接不需要该信息。
【讨论】:
【参考方案2】:听起来您的服务器可能位于使用NAT 的负载平衡器或路由器后面。在这种情况下,IP 数据包不会有源客户端的地址,而是 NAT 路由器的地址。只有 NAT 路由器知道发送者的地址(在 IP 级别上)。
根据您可能在 TCP 之上使用的任何更高级别的协议,您可能能够从中获得客户端标识,尽管在更高级别上欺骗此类信息要容易得多,如果这可能是一个问题。
如果您仅出于研究目的需要此数据,您的 NAT 设备可能会保留日志。
如果要求您实时获取真正的原始 IP 数据包,您可能必须重新配置路由器或将服务器移至 DMZ,但这完全是另一回事。与您的网络人员交谈,因为他们肯定会比我了解更多(我不是网络专家)。
【讨论】:
我们正在使用带有 tcp 转发功能的 Amazon EC2 负载均衡器 - 关于如何获得它以向我提供请求的客户端 IP 的任何想法? 您必须就此与亚马逊取得联系。它可能是一个额外收费的附加包。【参考方案3】:只需使用你用来接受客户端的 Socket 类的连接套接字对象。
connectionSocket.RemoteEndPoint.toString();
【讨论】:
【参考方案4】:AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString
【讨论】:
这和@Kelsey 的回答不一样吗,就在vb
?
您应该在答案中添加解释。如果你只是提供代码(尤其是对于更复杂的答案),人们可能不知道如何使用它。以上是关于如何从负载均衡器后面获取客户端的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
从 Google Compute Engine 网络负载平衡器后面访问外部客户端 IP
如何在负载均衡器 Laravel 后面的 nginx 中将远程 IP 地址列入白名单