ユーザーがサイトにアクセスした場所の IP アドレスに関する統計を収集したところ、172.16.16.1 と 172.16.16.248 の 2 つの IP アドレスしか表示されていないことに気付きました。IPアドレスを決定するために使用するプロパティは
Request.UserHostAddress
IP アドレス情報が失われる理由は何ですか? すべてのユーザーは世界中から集まっているため、2 つのプロキシだけの背後にいることはできません。
ユーザーがサイトにアクセスした場所の IP アドレスに関する統計を収集したところ、172.16.16.1 と 172.16.16.248 の 2 つの IP アドレスしか表示されていないことに気付きました。IPアドレスを決定するために使用するプロパティは
Request.UserHostAddress
IP アドレス情報が失われる理由は何ですか? すべてのユーザーは世界中から集まっているため、2 つのプロキシだけの背後にいることはできません。
このようなことがしたいかもしれません。
string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0];
HTTP_X_FORWARDED_FOR ヘッダーは、プロキシ サーバーの背後にある IP アドレスを取得します。
理由を詳しく説明しているこのページを参照してください。ユーザーの実際の IP を取得する
これはリバース プロキシの動作のように見えます。リバース プロキシを使用すると、クライアントはプロキシに接続し、それ自体がサーバーへの新しい接続を開きます。ASP.NET は着信接続の情報を使用してユーザー アドレスを入力するため、リバース プロキシのアドレスを取得します。
実際にこの構成になっている場合は、正しい情報を取得するためにリバース プロキシの助けが必要になります。ほとんどのリバース プロキシは、クライアントの実際の IP アドレスを使用して、HTTP 要求にヘッダーを追加する可能性を提供します。プロキシのドキュメントを確認してください。
Dave Anderson の回答に基づいて、一連のリバース プロキシを考慮したスニペットを次に示します。
string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
string ipStr = string.IsNullOrWhiteSpace(forwardedFor)
? Request.ServerVariables["REMOTE_ADDR"]
: forwardedFor.Split(',').Select(s => s.Trim()).First();
Request.ServerVariables("REMOTE_ADDR") が機能しません。この問題は、サーバーがおそらく何らかのプロキシの背後にある (またはネットワーク経由でインターネットに接続されている) か、ルーター設定が NAT (ネットワーク アドレス変換) として設定されているためです。この手法では IP がサーバーに渡されません。このような状況では、Asp.net を使用して IP アドレスを取得することはできませんが、Java はどのような場合でも IP アドレスを取得できるアプレットを提供します。
(Netscape、Mozilla、および Firefox のみ。Java を有効にする必要があります)
<script language="javascript" type="text/javascript">
if (navigator.appName.indexOf("Netscape") != -1){
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
document.write("<b>Your IP address is " + ip+'</b>');
}
else {
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>");
}
</script>
NAT/リバース プロキシの背後にいると仮定するため、以下を使用する必要があると思います。
Request.ServerVariables("REMOTE_ADDR")
ほとんどの場合、172.16.0.0/12 はプライベート LAN で、172.16.16.248 は自分のアドレス、172.16.16.1 はルーター/プロキシのアドレスです。
そこにリストした 2 つのアドレスは、非公開として定義された範囲の 1 つからのものです。(説明はこちらをご覧ください)
自分のファイアウォールの内部アドレスを取得しているように聞こえますか?