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

43

我正在使用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地址?

编辑:我们正在使用Amazon EC2负载均衡器进行TCP转发。在此设置中,有办法获取真实的客户端IP吗?


你怎么确定这些地址“明显”不是你网络外的客户端地址?你至少知道你的客户端所在的IP范围吗?他们是在你的内部网络中还是在公共互联网中? - Miguel Sevilla
5
因为它们都以10开头,这表明它们属于私有IP地址范围,而不是公共IP地址。请参考http://en.wikipedia.org/wiki/Private_network。 - brendan
4个回答

107

这个是否有效:

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

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


6

看起来你的服务器可能在使用NAT的负载均衡器或路由器后面。在这种情况下,IP数据包将不会有原始客户端的地址,而是NAT路由器的地址。只有NAT路由器知道发送者的地址(在IP层面上)。

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

如果你只需要这些数据进行研究,你的NAT设备可能会保留日志。

如果实时获取真正的原始IP数据包是必需的要求,你可能需要重新配置你的路由器或将你的服务器移动到DMZ,但这是一个完全不同的问题。与你的网络人员交谈,因为他们肯定比我更了解这个问题(我不是网络专家)。


我们正在使用Amazon EC2负载均衡器进行TCP转发 - 有什么想法可以让我获取请求客户端的IP地址吗? - brendan
你需要联系亚马逊咨询这个问题。可能需要额外支付费用购买附加包。 - P Daddy

2

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

connectionSocket.RemoteEndPoint.toString();

-5
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString

4
这不就是 @Kelsey 的回答吗,只是用 vb 写的吗? - Philip Pittle
1
你应该在你的回答中添加解释。如果你只提供代码(特别是对于更复杂的答案),人们可能不知道如何使用它。 - starbeamrainbowlabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接