我正在使用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,但这是一个完整的蜡球.和你的网络人员交谈,因为他们肯定会比我更了解这一点(我不是网络专家).