web-dev-qa-db-ja.com

TcpClientを使用してクライアントIPアドレスを取得するにはどうすればよいですか?

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.x.x.xアドレスを出力しますが、これはプライベートアドレスであり、明らかにネットワーク外のクライアントのアドレスではありません。リクエストを行っているクライアントのパブリックIPを取得するにはどうすればよいですか?

編集: tcpフォワーディングでAmazon EC2ロードバランサーを使用しています。この設定で真のクライアントIPを取得する方法はありますか?

34
brendan

サーバーが [〜#〜] nat [〜#〜] を使用してロードバランサーまたはルーターの背後にある可能性があります。この場合、IPパケットには発信元クライアントのアドレスはありませんが、NATルーターのアドレス。NATルーターのみが送信者のアドレスを知っています。 (IPレベルで)。

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

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

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

6
P Daddy

これは機能しますか:

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

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

90
Kelsey