ASP.NET请求.ServerVariables产生本地IP地址,而不是远程IP
本文关键字:IP 地址 请求 NET ServerVariables ASP | 更新日期: 2023-09-27 17:57:52
在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地址不是服务器。问题是我不能直接访问它,所以我必须和管理它的人谈谈,并希望在他们开始改变事情之前给他们一些指导。
感谢
Ernie
如果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配置将只重写目的地,如下所示:自-5.5.5TO-192.168.6.6(服务器的私人地址)
在这种典型的情况下,服务器仍然会将REMOTE_ADDR视为5.5.5.5,因为这是传入请求上的源地址。然后,数据包将返回到5.5.5.5,响应将成功返回到客户端。
现在,例如,在动态PAT的情况下,请求将如下到达NAT设备:自-5.5.5至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设备,在请求/响应期间(请参阅上面的Cisco文档),NAT设备将其映射回5.5.5.5,然后放弃"动态"映射。
一切都很顺利,客户端会得到响应,只是从服务器的角度来看,您不知道实际的客户端地址。如果是动态NAT,我不知道你怎么能从服务器上得到这些信息。
幸运的是,您在客户端上用javascript获取信息做得非常正确,所以这很可能解决了您的问题。
这取决于您的网络结构。简单地说,防火墙或负载均衡器可以更改您正在检查的变量。
如果您正在使用负载平衡器,请检查以下内容:如何使用asp.net 在负载平衡机上获取访问者IP
如果您的服务器位于防火墙后面,请检查以下内容:查找请求是否已从防火墙转发到IIS