2008-10-14 2 views
9

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

Request.UserHostAddress 

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

ответ

9

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

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

1

Я предполагаю, что вы находитесь за NAT/Reverse Proxy, так что я думаю, что вы должны использовать:

Request.ServerVariables("REMOTE_ADDR") 

Скорее всего 172.16.0.0/12 ваш приват LAN, где 172.16.16.248 ваш собственный адрес и 172,16 .16.1 адрес вашего маршрутизатора/прокси.

+0

Вы имели в виду вратаря/16? – leppie 2008-10-14 10:14:21

+0

Нет,/12 должен быть прав по умолчанию. =) http: //en.wikipedia.org/wiki/Private_network – Node 2008-10-14 10:21:32

0

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

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

23

Возможно, вы захотите чего-то подобного;

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-адрес за прокси-серверами.

См. Эту страницу, которая объясняет, почему более подробно; Getting The Real IP of your Users

+0

Я знаю об заголовке HTTP_X_FORWARDED_FOR, но меня больше интересуют причины проблемы. Спасибо, в любом случае! – 2008-10-15 05:20:15

1

Request.ServerVariables ("REMOTE_ADDR") не работает. Эта проблема связана с тем, что ур-сервер, вероятно, находится за некоторым прокси-сервером (или подключен к интернету через какую-либо сеть), или настройки вашего маршрутизатора установлены как NAT (Network Address Translation), этот метод не передает ip-сервер. в таких ситуациях u не может получить IP-адрес, используя Asp.net , но Java Provide апплет, с помощью которого u может получить 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> 
5

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

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

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
        ? Request.ServerVariables["REMOTE_ADDR"] 
        : forwardedFor.Split(',').Select(s => s.Trim()).First(); 
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); 
}