3

在 c# 中有一个 asp.net 网页。我们想做的一件事是跟踪网站的点击,包括他们的 IP 地址。我实现了一些代码(感谢 SO),但记录的 IP 地址似乎总是本地的,即:192.168.xx 我已经从各种设备上尝试过,甚至是我的手机和版本 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;

当我使用 apppot 上的服务之类的东西在客户端进行呼叫时,它工作得很好:

<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 将是两个这样的示例,我建议这是您向网络管理员询问的内容。

有关动态 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 地址)到 - 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 设备,在请求/响应期间(请参阅上面的 Cisco 文档)将其映射回 5.5.5.5,然后丢弃“动态”映射。

一切正常,客户端得到响应,除了你从服务器的角度不知道实际的客户端地址。如果它是动态 NAT,我看不出你如何从服务器获取这些信息。

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

于 2013-02-06T05:05:11.820 回答
0

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

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

如果您的服务器位于防火墙后面,请检查: 查找请求是否从防火墙转发到 IIS

于 2013-02-06T05:37:20.977 回答