繁体   English   中英

如何从负载均衡器后面获取客户端的 IP 地址?

[英]How do I get a client's IP address from behind a load balancer?

我正在使用 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.xxx 地址,这些地址是私有地址,显然不是我的网络外发出请求的客户端的地址。 我该怎么做才能获得发出请求的客户的公共 IP?

编辑:我们正在使用带有 tcp 转发的 Amazon EC2 负载均衡器。 有没有办法在这个设置中获得真正的客户端 IP?

这是否有效:

((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString()

如果客户端通过内部网络连接到您,我不确定您是否可以获得他们的公共 IP,因为返回到客户端的连接不需要该信息。

听起来您的服务器可能位于使用NAT的负载平衡器或路由器后面。 在这种情况下,IP 数据包将没有原始客户端的地址,而是 NAT 路由器的地址。 只有 NAT 路由器知道发送者的地址(在 IP 级别)。

根据您可能在 TCP 之上使用的任何更高级别的协议,您可能能够从中获取客户端标识,尽管在更高级别欺骗此类信息要容易得多,如果这可能是一个问题。

如果您仅将这些数据用于研究目的,您的 NAT 设备可能会保留日志。

如果您需要实时获取真正的原始 IP 数据包,您可能必须重新配置您的路由器或将您的服务器移至 DMZ,但这完全是另外一回事。 与您的网络人员交谈,因为他们肯定会比我了解更多(我不是网络专家)。

只需使用您用来接受客户端的 Socket 类的连接套接字对象。

connectionSocket.RemoteEndPoint.toString();
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM