2008-10-14 13 views
9

Zbieram statystyki adresów IP, z których użytkownicy odwiedzają moją witrynę, i zauważyłem, że prezentowane są tylko dwa adresy IP, 172.16.16.1 i 172.16.16.248. Nieruchomość użyć do określenia adresu IP jestUserHostAddress podaje niewłaściwe adresy IP

Request.UserHostAddress 

Co może być przyczyną utraty informacji o adresie IP? Wszyscy użytkownicy są z całego świata, więc nie mogą być za tylko dwoma serwerami proxy.

Odpowiedz

9

To wygląda na pracę odwrotnego proxy. Gdy używasz odwrotnego proxy, klient łączy się z serwerem proxy, który sam otwiera nowe połączenie z serwerem. Ponieważ ASP.NET wykorzystuje informacje o połączeniu przychodzącym, aby wypełnić adres użytkownika, otrzymasz adres odwrotnego proxy.

Jeśli rzeczywiście jesteś w tej konfiguracji, potrzebujesz pomocy od odwrotnego proxy, aby uzyskać właściwe informacje. Większość odwrotnych serwerów proxy oferuje możliwość dodania nagłówka do żądania HTTP, z rzeczywistym adresem IP klienta. Sprawdź dokumentację swojego serwera proxy.

1

zakładam jesteś za NAT/reverse proxy więc myślę, że trzeba użyć:

Request.ServerVariables("REMOTE_ADDR") 

Najprawdopodobniej 172.16.0.0/12 jest twoja prywatna sieć LAN gdzie 172.16.16.248 jest własny adres i 172,16 .16.1 adres routera/serwera proxy.

+0

zrobił pan na myśli/16? – leppie

+0

Nie,/12 powinno mieć domyślnie rację. =) http: //en.wikipedia.org/wiki/Private_network – Node

0

Dwa wymienione tam adresy pochodzą z jednego z zakresów zdefiniowanych jako prywatne. (zobacz opis here)

To brzmi trochę tak, jakbyś podniósł adres wewnętrzny swoich własnych zapór ogniowych?

23

Możesz chcieć czegoś takiego;

string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0]; 

Nagłówek HTTP_X_FORWARDED_FOR pobiera adres IP za serwerów proxy.

Zobacz tę stronę, która wyjaśnia, dlaczego bardziej szczegółowo; Getting The Real IP of your Users

+0

Wiem o nagłówku HTTP_X_FORWARDED_FOR, ale jestem bardziej zainteresowany przyczynami problemu. Dzięki i tak! –

+5

Pamiętaj, że powiązane serwery proxy mogą prowadzić do kilku nagłówków HTTP_X_FORWARDED_FOR. –

+0

@Marc Climent: Czy możesz dodać nową odpowiedź na to pytanie, które to wyjaśnia? Chciałbym zobaczyć, jak to działa. Czy 'Request.ServerVariables [" HTTP_X_FORWARDED_FOR "] zwróci rozdzielany ciąg adresów IP, czy też po prostu zwróci pierwszy/ostatni nagłówek? – MikeWyatt

1

Request.ServerVariables ("REMOTE_ADDR") nie działa. ten problem jest spowodowany tym, że serwer jest prawdopodobnie za jakimś proxy (lub podłączony do Internetu przez jakąś sieć) lub ustawienia routera są ustawione jako NAT (Network Address Translation), ta technika nie przekazuje adresu IP na serwer. w takich sytuacjach nie można uzyskać adresu IP za pomocą Asp.net , jednak aplet Java Provide, za pomocą którego można uzyskać adres IP w każdym przypadku.

(dla Netscape, Mozilla i Firefox tylko i Java musi być włączony)

<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

Opierając się na odpowiedź Dave Anderson, o to fragment, który uwzględnia łańcuch reverse proxy.

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

Opierając się na tomfannings odpowiedzieć ...

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); 
} 
+0

Wyjaśnienie kodu w odniesieniu do zadanego pytania pomogłoby. – Prateek

Powiązane problemy