ASP.NET Request.ServerVariables产生的本地IP地址不是远程IP

时间:2013-02-05 15:39:55

标签: c# asp.net iis ip

在c#中有一个asp.net网页。我们想要做的一件事是跟踪网站的点击量,包括他们的IP地址。我实现了一些代码(感谢SO)但是记录的IP地址似乎总是本地的,即:192.168.x.x.我已经尝试过各种各样的设备,甚至是我的手机和版本MiFi,只是为了确保它与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地址不是服务器。问题是我没有直接访问它所以我必须与管理它的人交谈,并希望在他们开始改变之前给他们一些方向。

由于

欧尼

2 个答案:

答案 0 :(得分:2)

如果真的支持HTTP_X_FORWARDED_FOR标头,那么我认为这不会是正向或反向代理服务器造成这种情况,但更可能是动态网络地址转换或动态端口地址转换,它发生在TCP上的应用层之下/ IP堆栈因此不会影响HTTP请求标头。

有很多方法可以配置NAT,其中大部分都会导致这些症状,但是肯定可以以一种会出现此问题的方式配置NAT。动态NAT或动态PAT将是两个这样的示例,我建议这是您向网络管理员询问的内容。

有关动态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地址,您可能有足够的流量可能会耗尽端口。

因此,您的REMOTE_ADDR是192.168.1.1,因为这实际上是请求数据包的源地址。没有HTTP_X_FORWARDED_FOR,因为动态PAT发生在较低的TCP / IP层(地址而非应用程序)。

最后,响应被发送回192.168.1.1:12345,它会路由到NAT设备,在请求/响应期间(请参阅上面的思科文档)将其映射回5.5.5.5,然后放弃“动态”映射。

一切都运行良好,客户端得到响应,除了从服务器的角度来看你不知道实际的客户端地址。如果它是动态NAT,我不知道如何从服务器获取此信息。

幸运的是,您在客户端上使用javascript获取信息是完全正确的,因此这可能解决您的问题并且可以解决。

答案 1 :(得分:0)

这取决于您的网络结构。只需防火墙或负载均衡器就可以更改您正在检查的变量。

如果您使用的是负载均衡器,请检查: How to get visitor IP on load balancing machine using asp.net

如果您的服务器位于防火墙后面,请检查: Find if request was forwarded from firewall to IIS

相关问题