c# - example - ¿Cómo obtengo la dirección IP del cliente usando TcpClient?
tcpclient c# ejemplo (3)
Estoy usando TcpClient para escuchar las solicitudes en un puerto. Cuando lleguen las solicitudes del cliente, quiero saber la dirección IP del cliente que realiza la solicitud.
He intentado:
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);
Todas estas direcciones dan como resultado direcciones 10.xxx que son direcciones privadas y claramente no son la dirección de los clientes fuera de mi red que realizan las solicitudes. ¿Qué puedo hacer para obtener la IP pública de los clientes que realizan las solicitudes?
Edición: estamos utilizando un equilibrador de carga de Amazon EC2 con el reenvío de TCP. ¿Hay alguna manera de obtener la verdadera IP del cliente en esta configuración?
Esto funciona:
((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString()
Si el cliente se está conectando a usted a través de una red interna, no estoy seguro de que pueda obtener su IP pública, ya que la conexión para regresar al cliente no necesitaría esa información.
Parece que tal vez su servidor está detrás de un equilibrador de carga o enrutador que utiliza NAT . En este caso, el paquete IP no tendrá la dirección del cliente de origen, sino la dirección del enrutador NAT. Solo el enrutador NAT conoce la dirección del remitente (a nivel de IP).
Dependiendo de cualquier protocolo de nivel superior que pueda estar usando sobre TCP, puede obtener una identificación de cliente a partir de eso, aunque es mucho más fácil falsificar dicha información en niveles más altos, si eso puede ser una preocupación.
Si necesita estos datos solo para fines de investigación, su dispositivo NAT puede mantener un registro.
Si es un requisito que obtenga el verdadero paquete IP de origen en tiempo real, es posible que tenga que reconfigurar su enrutador o que su servidor se mueva a la DMZ, pero esa es una bola de cera. Hable con sus colegas de la red, ya que seguramente sabrían más sobre esto que yo (no soy un experto en redes).
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString