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を取得する方法はありますか?
サーバーが [〜#〜] nat [〜#〜] を使用してロードバランサーまたはルーターの背後にある可能性があります。この場合、IPパケットには発信元クライアントのアドレスはありませんが、NATルーターのアドレス。NATルーターのみが送信者のアドレスを知っています。 (IPレベルで)。
TCPの上で使用する高レベルのプロトコルに応じて、そこからクライアントの識別情報を取得できる場合がありますが、懸念がある場合は、高レベルでそのような情報をスプーフィングする方がはるかに簡単です。
このデータが調査目的でのみ必要な場合、NATデバイスはログを保持する場合があります。
真の発信元IPパケットをリアルタイムで取得する必要がある場合は、ルーターを再構成するか、サーバーをDMZに移動する必要がありますが、これはまったくのワックスです。あなたがネットワークの人と話をしてください。彼らは私よりもこれについて確かに知っているでしょう(私はネットワークの専門家ではありません)。
これは機能しますか:
((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString()
クライアントが内部ネットワークを介してあなたに接続している場合、クライアントに戻るための接続はその情報を必要としないので、あなたが彼らのパブリックIPを取得できるかどうかはわかりません。