Вопрос

Я собираю статистику по IP-адресам, с которых пользователи посещают мой сайт, и заметил, что представлено только два IP-адреса: 172.16.16.1 и 172.16.16.248.Свойство, которое я использую для определения IP-адреса,

Request.UserHostAddress

В чем может быть причина потери информации об IP-адресе?Все пользователи со всего мира, поэтому они не могут использовать только два прокси.

Это было полезно?

Решение

Это похоже на работу обратного прокси.Когда вы используете обратный прокси-сервер, клиент подключается к прокси-серверу, который сам открывает новое соединение с вашим сервером.Поскольку ASP.NET использует информацию о входящем соединении для заполнения адреса пользователя, вы получаете адрес обратного прокси-сервера.

Если вы действительно используете эту конфигурацию, вам понадобится помощь обратного прокси-сервера, чтобы получить нужную информацию.Большинство обратных прокси предлагают возможность добавить заголовок к HTTP-запросу с реальным IP-адресом клиента.Проверьте документацию вашего прокси.

Другие советы

Возможно, вам захочется сделать что-то вроде этого;

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-адреса ваших пользователей

Основываясь на ответе Дэйва Андерсона, вот фрагмент, в котором учитывается цепочка обратных прокси.

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

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
                   ? Request.ServerVariables["REMOTE_ADDR"] 
                   : forwardedFor.Split(',').Select(s => s.Trim()).First();

Я предполагаю, что вы используете NAT/обратный прокси-сервер, поэтому думаю, вам нужно использовать:

Request.ServerVariables("REMOTE_ADDR") 

Скорее всего, 172.16.0.0/12 — это ваша частная локальная сеть, где 172.16.16.248 — ваш собственный адрес, а 172.16.16.1 — адрес вашего маршрутизатора/прокси.

Request.ServerVariables("REMOTE_ADDR") не работает.Эта проблема заключается в том, что ваш сервер, вероятно, находится за каким-то прокси-сервером (или подключен к Интернету через какую-то сеть), или в настройках вашего маршрутизатора установлено значение NAT (трансляция сетевых адресов), этот метод не передает IP-адрес на сервер.В таких ситуациях вы не можете получить IP -адрес, используя ASP.NET, однако 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>

Два адреса, которые вы там указали, относятся к одному из диапазонов, определенных как частные.(видеть здесь для описания)

Это больше похоже на то, что вы подбираете внутренний адрес своего собственного брандмауэра (ов)?

Основываясь на ответе Томфаннинга...

 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top