3

C#でasp.netWebページを取得しました。私たちがやりたいことの1つは、IPアドレスを含むサイトへのヒットを追跡することです。私はいくつかのコードを実装しましたが(SOのおかげで)、ログに記録されたIPアドレスは常にローカルのようです。 ISPですが、ログには常に同じ2〜3個の異なる内部IPアドレスがリストされます(日が経つにつれて少し変わるようです)。

これがIPを取得する私の関数です(これもSOへの投稿のおかげです):

protected IPAddress GetIp(HttpRequest request)
{
    string ipString;
    if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
        ipString = request.ServerVariables["REMOTE_ADDR"];
    else
        ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();

    IPAddress result;
    if (!IPAddress.TryParse(ipString, out result))
        result = IPAddress.None;

    return result;
}

public void logHit()
{
    IPAddress ip = GetIp(Request);
    string sIP = ip.ToString();
}

私もこれを試しましたが、同じ結果が得られました:

HttpContext.Current.Request.UserHostAddress;

appspotのサービスのようなものを使用してクライアント側で電話をかけると、問題なく機能します。

<script type="application/javascript">
    function getip(json) {
        //txtIP is a input box on the form
        document.getElementById("txtIP").value = json.ip;
    }
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

そのappspotリンクを押して解析することで、ラウンドアバウトの方法を実行できると思いますが、それは単純なはずの何かにとっては非常に多くの問題のように思えます。

サーバー上のIISでしょうか?ある種のリダイレクトが起こっていますか?ログに記録されるIPアドレスはサーバーではありません。問題は、私はそれに直接アクセスできないので、それを管理している人たちと話をしなければならず、彼らが物事を変え始める前に彼らにいくつかの指示を与えたいと思っています。

ありがとう

アーニー

4

2 に答える 2

2

HTTP_X_FORWARDED_FORヘッダーが本当にサポートされている場合、これはフォワードプロキシサーバーまたはリバースプロキシサーバーではなく、TCP/IPスタックのアプリケーション層の下で発生している動的ネットワークアドレス変換または動的ポートアドレス変換である可能性が高いと思います。したがって、HTTPリクエストヘッダーには影響しません。

NATを構成する方法はたくさんありますが、そのほとんどはこれらの症状を引き起こしませんが、この問題が発生するような方法でNATを構成することは確かに可能です。動的NATまたは動的PATはそのような2つの例であり、これがネットワーク管理者に尋ねるものであることをお勧めします。

ダイナミックNAT/PATの詳細については、良い例を使用して、次のレビューを参照してください。http: //www.cisco.com/en/US/docs/security/asa/asa82/configuration/guide/nat_dynamic.html

一般的なNATシナリオでは、要求パケットは次のようにNATデバイス(ファイアウォールまたはルーター)に到達します。FROM-5.5.5.5(クライアントのパブリックアドレス)TO-6.6.6.6(サーバーのパブリックアドレス)

「通常の」NAT構成では、次のように宛先のみが書き換えられます。FROM --5.5.5.5 TO --192.168.6.6(サーバーのプライベートアドレス)

この一般的なケースでは、サーバーはREMOTE_ADDRを5.5.5.5と見なします。これは、着信要求の送信元アドレスであるためです。次に、パケットは5.5.5.5に返され、応答はクライアントに正常に返されます。

たとえば、動的PATの場合、要求は次のようにNATデバイスに到達します。FROM-5.5.5.5 TO-6.6.6.6

次に、NATデバイスは送信元パケットと宛先パケットの両方を書き換え、要求の存続期間中のみこの「動的」マッピングを維持します。FROM--192.168.1.1:12345(動的PATアドレス)TO--192.168.6.6(のプライベートアドレスサーバー)

これで、サーバーがこのリクエストを確認すると、プライベートアドレス192.168.1.1からのものであるように見えます。実際、厳密なPATを使用すると、すべてのリクエストはこのアドレスからのものであるように見えます。あなたの場合、これらのアドレスは2つまたは3つあります。これは、動的PATアドレスを1つだけ使用すると、トラフィックが不足してポートが不足するリスクがあるためと考えられます。

したがって、REMOTE_ADDRは192.168.1.1です。これは、実際には要求パケットの送信元アドレスであるためです。動的PATは下位のTCP/IP層(アプリケーションではなくアドレス)で発生しているため、HTTP_X_FORWARDED_FORはありません。

最後に、応答は192.168.1.1:12345に返送され、NATデバイスにルーティングされます。NATデバイスは、要求/応答の期間中(上記のシスコのドキュメントを参照)、5.5.5.5にマップし直してから、「動的」マッピング。

サーバーの観点から実際のクライアントアドレスがわからない場合を除いて、すべてが完全に機能し、クライアントは応答を返します。また、動的NATが機能している場合、サーバーからこの情報を取得する方法がわかりません。

幸い、クライアントでjavascriptの情報を取得するために正確に正しいことを行ったので、これで問題が解決するだけでなく、解決できる可能性があります。

于 2013-02-06T05:05:11.820 に答える
0

ネットワーク構造によって異なります。ファイアウォールまたはロードバランサーだけで、チェックしている変数を変更できます。

ロードバランサーを使用している場合は、次を確認してください: asp.netを使用してロードバランシングマシンでビジターIPを取得する方法

サーバーがファイアウォールの背後にある場合は、次のことを確認してください。 リクエストがファイアウォールからIISに転送されたかどうかを確認します

于 2013-02-06T05:37:20.977 に答える