2010-04-26 19 views
23

Estoy usando TcpClient para escuchar en un puerto las solicitudes. Cuando las solicitudes provienen del cliente, quiero saber la IP del cliente que realiza la solicitud.¿Cómo obtengo la dirección IP del cliente usando TcpClient?

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 10.x.x.x salida direcciones que son direcciones privadas y claramente no son la dirección de los clientes de mi red hacer las solicitudes. ¿Qué puedo hacer para obtener la IP pública de los clientes que realizan las solicitudes?

Edit: Estamos utilizando un Amazon EC2 Load Balancer con tcp forwarding. ¿Hay alguna forma de obtener la ip del cliente verdadero en esta configuración?

+0

cómo puede estar seguro de que las direcciones son "claramente" no las de los clientes fuera de su red. ¿Al menos conoce el rango de IP en el que residen sus clientes? ¿Residen en su red interna, residen en Internet público? –

+4

Porque todos comienzan 10. - Esto indica un rango de ip privado no una dirección de IP pública. http://en.wikipedia.org/wiki/Private_network – brendan

Respuesta

8

Parece que su servidor está detrás de un equilibrador de carga o enrutador usando 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 (en un nivel de IP).

Dependiendo del protocolo de nivel superior que pueda estar utilizando encima de TCP, puede obtener la identificación del cliente a partir de eso, aunque es mucho más fácil falsificar dicha información en niveles superiores, 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 de IP de origen en tiempo real, puede que tenga que reconfigurar su enrutador o hacer que su servidor se mueva a la DMZ, pero eso es una bola de cera adicional. Habla con tus chicos de la red, ya que seguramente sabrían más sobre esto que yo (no soy un experto en redes).

+0

Estamos utilizando un equilibrador de carga Amazon EC2 con reenvío de tcp. ¿Alguna idea sobre cómo puedo conseguir que este me proporcione la IP del cliente solicitante? – brendan

+0

Deberás ponerte en contacto con Amazon al respecto. Puede ser un paquete complementario por una tarifa adicional. –

68

hace este trabajo:

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

Si el cliente se conecta a usted a través de una red interna que no estoy seguro de que puedes conseguir su IP pública ya que la conexión a volver al cliente no sería necesario que la información .

+0

funcionó para mí, gracias! – DrNachtschatten

-6
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString 
+3

¿No es lo mismo que @Kelsey answer, solo en 'vb'? –

+1

Debe agregar una explicación a su respuesta. Si solo proporciona código (especialmente para respuestas más complejas), las personas pueden no saber cómo usarlo. – starbeamrainbowlabs

Cuestiones relacionadas