Żądanie HTTP z PowerShell ma zły zdalny adres IP

0

Próbuję napisać skrypt PowerShell, który wykonuje żądanie HTTP. Żądanie jest obsługiwane przez skrypt PHP, który musi znać adres IP klienta. W tym celu czyta $_SERVER['REMOTE_ADDR'].

Teraz występuje następujące dziwne zachowanie:

  • Kiedy korzystam z usługi takiej jak whatismyip.com, mój adres IP to xxx.yyy.141.183
  • Gdy używam przeglądarki internetowej do wywoływania mojego skryptu PHP, $_SERVER['REMOTE_ADDR']zwraca ten sam adres IP, co powyżej xxx.yyy.141.183(zgodnie z oczekiwaniami).
  • Kiedy używam skryptu PowerShell do wywoływania tego samego skryptu PHP, $_SERVER['REMOTE_ADDR']zwraca inny adres IP, a mianowicie xxx.yyy.51.111.

Skrypt PowerShell jest bardzo prosty:

$wc = New-Object System.Net.WebClient
$wc.DownloadString("http://example.net/myscript.php")

Obserwuję to zachowanie związane z siecią mojej uczelni. Dlatego nie znam żadnych szczegółów na temat konfiguracji sieci. Zauważyłem, że różne maszyny wydają się mieć różne adresy IP przy użyciu metod opisanych w punktach 1 i 2, ale wszystkie mają takie same adresy IP przy użyciu trzeciej metody.

Pytanie: Jak mogę zmodyfikować skrypt PowerShell, aby „zachowywał się jak przeglądarka internetowa”, tj. Aby wysłać żądanie, w którym adres zdalny widziany przez serwer jest równy adresowi zdalnemu widzianemu podczas odbierania żądania z przeglądarki internetowej?

Pytanie dodatkowe: Dlaczego tak się dzieje?

CL.
źródło
Skąd pochodzi PHP? $_SERVER['REMOTE_ADDR']Jest względne oczywiście .. Również co ma ipconfigpowiedzieć Twój IP jest? Najprawdopodobniej *.*.141.183jest to zapora twojego uniwersytetu. Ale to tylko spekulacja.
Pogrindis,
@Pogrindis Nie jestem pewien, czy rozumiem twoje pytanie. Siedzę przed laptopem, używając metod od punktu 1-3 po drugim. Wszystkie 3 połączenia pochodzą od tego samego klienta. ipconfigpodaje mój 141.183jako mój adres IPv4.
CL.
Cóż, nie do końca, pozostałe dwa działają w sieci, która będzie miała własne reguły routera / zapory sieciowej itp. Uderzenie php bezpośrednio (zakładając, że jest to na laptopie) z poziomu PowerShell nie prowadzi poza lokalną maszynę.
Pogrindis,
@Pogrindis Wydaje mi się, że wszystkie wnioski przechodzą przez sieć uniwersytetów (co jeszcze?) I ostatecznie wszystkie ostatecznie docierają do serwera (co obserwuję w plikach dziennika). Czym różnią się żądania PowerShell?
CL.
Czy przypadkiem jest to PowerShell Direct?
Pogrindis,

Odpowiedzi:

0

Na podstawie odkrycia, że ​​tylko Firefox wysyła żądania z poprawnym publicznym adresem IP, xxx.yyy.141.183podczas gdy IE i Chrome tego nie robią , znalazłem następujące rozwiązanie:

  • Fakt, że różne przeglądarki zachowują się inaczej, oznacza, że ​​problem nie jest bezpośrednio związany z PowerShellem, ale wynika z ustawień proxy.
  • Zdałem sobie sprawę, że Firefox został ustawiony na „korzystanie z ustawień proxy systemu”. Kiedy zmieniłem to na „wykrywaj ustawienia proxy dla sieci automatycznie” (przybliżone tłumaczenie, przepraszam), Firefox (podobnie jak IE i Chrome) generował żądania z adresem xxx.yyy.51.111IP.
  • Z tego wywnioskowałem, że PowerShell musi używać konfiguracji, która automatycznie wykrywa ustawienia proxy. Przypuszczenie to potwierdza dokumentacja :

Właściwość Proxy identyfikuje instancję IWebProxy, która komunikuje się ze zdalnymi serwerami w imieniu tego obiektu WebClient. Serwer proxy jest ustawiany przez system za pomocą plików konfiguracyjnych i ustawień lokalnej sieci Internet Explorer. Aby określić, że nie należy używać serwera proxy, ustaw serwer proxy do instancji proxy zwróconej przez metodę GetEmptyWebProxy.

  • Ponieważ nie chcę zmieniać konfiguracji systemu i jak GlobalProxySelection.GetEmptyWebProxyzostało przestarzałe, teraz z powodzeniem korzystam z zaproponowanego tutaj rozwiązania : po prostu ustaw proxywłaściwość na null.

    $wc = New-Object System.Net.WebClient
    $wc.Proxy = $null
    $wc.DownloadString("http://example.net/myscript.php")
    
CL.
źródło