41

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転送でAmazonEC2ロードバランサーを使用しています。この設定で真のクライアントIPを取得する方法はありますか?

4

4 に答える 4

106

これは機能しますか:

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

クライアントが内部ネットワークを介して接続している場合、クライアントに戻るための接続にはその情報が必要ないため、パブリックIPを取得できるかどうかはわかりません。

于 2010-04-26T22:32:32.367 に答える
6

サーバーがNATを使用するロードバランサーまたはルーターの背後にあるようです。この場合、IPパケットには発信元のクライアントのアドレスは含まれませんが、NATルーターのアドレスが含まれます。NATルーターだけが(IPレベルで)送信者のアドレスを知っています。

TCP上で使用している可能性のある上位レベルのプロトコルによっては、そこからクライアントIDを取得できる場合がありますが、懸念がある場合は、上位レベルでそのような情報をスプーフィングする方がはるかに簡単です。

調査目的でのみこのデータが必要な場合は、NATデバイスがログを保持する場合があります。

真の発信IPパケットをリアルタイムで取得する必要がある場合は、ルーターを再構成するか、サーバーをDMZに移動する必要がありますが、それはまったく別の問題です。彼らは確かに私よりもこれについてもっと知っているので、あなたのネットワークの人と話してください(私はネットワークの専門家ではありません)。

于 2010-04-27T13:32:46.953 に答える
2

クライアントを受け入れるために使用したSocketクラスの接続ソケットオブジェクトを使用するだけです。

connectionSocket.RemoteEndPoint.toString();
于 2020-01-22T06:59:43.013 に答える
-5
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString
于 2014-10-10T22:55:39.890 に答える