11

我收集了用户访问我网站的 IP 地址的统计数据,我注意到只显示了两个 IP 地址,172.16.16.1 和 172.16.16.248。我用来确定 IP 地址的属性是

Request.UserHostAddress

IP 地址信息丢失的原因可能是什么?所有用户都来自世界各地,因此他们不能只支持两个代理。

4

7 回答 7

26

你可能想要这样的东西;

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

于 2008-10-14T10:30:12.313 回答
10

这看起来像是反向代理的工作。当您使用反向代理时,客户端会连接到代理,而代理本身会打开与您的服务器的新连接。由于 ASP.NET 使用传入连接的信息来填充用户地址,因此您将获得反向代理的地址。

如果您确实处于此配置中,则需要反向代理的帮助才能获得正确的信息。大多数反向代理都提供了向 HTTP 请求添加标头的可能性,其中包含客户端的真实 IP 地址。检查代理的文档。

于 2008-10-14T10:04:03.800 回答
6

基于戴夫安德森的回答,这里有一个片段,它考虑了一系列反向代理。

string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
                   ? Request.ServerVariables["REMOTE_ADDR"] 
                   : forwardedFor.Split(',').Select(s => s.Trim()).First();
于 2012-10-31T12:04:56.383 回答
1

我假设您在 NAT/反向代理后面,所以我认为您必须使用:

Request.ServerVariables("REMOTE_ADDR") 

172.16.0.0/12 很可能是您的私有 LAN,其中 172.16.16.248 是您自己的地址,而 172.16.16.1 是您的路由器/代理的地址。

于 2008-10-14T09:44:36.257 回答
1

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>
于 2009-07-03T13:42:27.497 回答
0

您在此处列出的两个地址来自定义为私有的范围之一。(见这里的描述)

听起来您更像是在获取您自己的防火墙的内部地址?

于 2008-10-14T10:10:57.203 回答
0

基于 tomfannings 的回答...

 public static string ClientIp(this HttpRequestBase @this) {
  var clientIp = string.Empty;
  string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"];

  if (string.IsNullOrWhiteSpace(forwardedFor)) {
    clientIp = @this.ServerVariables["REMOTE_ADDR"];
  } else {

    var array = forwardedFor
      .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
      .Select(s => s.Trim());

    foreach (var element in array) {
      if (element.IsValidIp4() || element.IsValidIp6()) {
        clientIp = element;
        break;
      }
    }
  }
  return clientIp;
}

public static bool IsValidIp4(this string @this) {
  var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$");
  return pattern.IsMatch(@this);
}

public static bool IsValidIp6(this string @this) {
  var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))$");
  return pattern.IsMatch(@this);
}
于 2016-08-02T19:42:57.567 回答