C# 如何获得客户';从负载平衡器后面的IP地址?

C# 如何获得客户';从负载平衡器后面的IP地址?,c#,.net,tcpclient,C#,.net,Tcpclient,我正在使用TcpClient在端口上侦听请求。当请求从客户端传入时,我想知道发出请求的客户端ip 我试过: Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString()); Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString()); var networkStream = tcpClient.GetStream(); var pi = networkStream.GetTy

我正在使用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转发的AmazonEC2负载平衡器。有没有办法在这个设置中获得真正的客户端ip?

这是否有效:

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

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

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

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

如果您仅出于研究目的需要此数据,您的NAT设备可能会保留日志


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

只需使用socket类的connection socket对象,您已经使用它来接受客户端

connectionSocket.RemoteEndPoint.toString();

您如何确保这些地址“明显”不是您网络以外的客户机的地址。您是否至少知道您的客户所在的IP范围?它们是否存在于您的内部网络中,是否存在于公共互联网中?因为它们都是从10开始的。-这表示专用ip范围而不是公用ip地址。我们正在使用一个带有tcp转发的Amazon EC2负载平衡器-关于我如何获得它来给我请求的客户端ip有什么想法吗?你必须就此与Amazon联系。它可能是一个额外费用的附加包。这与@Kelsey answer不一样吗,就在
vb
中?你应该在你的答案中添加一个解释。如果您只是提供代码(特别是对于更复杂的答案),人们可能不知道如何使用它。
connectionSocket.RemoteEndPoint.toString();