web-dev-qa-db-fra.com

Comment obtenir l'adresse IP du client à l'aide de TcpClient?

J'utilise TcpClient pour écouter sur un port les demandes. Lorsque les demandes proviennent du client, je veux connaître l'adresse IP du client qui fait la demande.

J'ai essayé:

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);

Toutes ces adresses produisent des adresses 10.x.x.x qui sont des adresses privées et qui ne sont clairement pas l'adresse de les clients hors de mon résea effectuant les requêtes. Que puis-je faire pour obtenir l'adresse IP publique des clients qui font les demandes?

Edit: Nous utilisons un équilibreur de charge Amazon EC2 avec transfert tcp. Existe-t-il un moyen d'obtenir la véritable adresse IP du client dans cette configuration?

34
brendan

Il semble que votre serveur soit peut-être derrière un équilibreur de charge ou un routeur utilisant NAT . Dans ce cas, le paquet IP n'aura pas l'adresse du client d'origine, mais l'adresse du routeur NAT. Seul le routeur NAT connaît l'adresse de l'expéditeur) (au niveau IP).

Selon le protocole de niveau supérieur que vous utilisez en plus de TCP, vous pourrez peut-être obtenir l'identification du client, bien qu'il soit beaucoup plus facile d'usurper de telles informations à des niveaux supérieurs, si cela peut être un problème.

Si vous avez besoin de ces données uniquement à des fins de recherche, votre appareil NAT peut tenir un journal.

Si vous devez obtenir le véritable paquet IP d'origine en temps réel, vous devrez peut-être reconfigurer votre routeur ou déplacer votre serveur vers la DMZ, mais c'est une toute autre boule de cire. Parlez à vos gars du réseau, car ils en sauraient certainement plus que moi (je ne suis pas un expert du réseau).

6
P Daddy

Est-ce que ça marche:

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

Si le client se connecte à vous via un réseau interne, je ne suis pas sûr que vous puissiez obtenir leur adresse IP publique, car la connexion pour revenir au client n'aurait pas besoin de ces informations.

90
Kelsey