PowerShell 发出的 HTTP 请求有错误的远程 IP

PowerShell 发出的 HTTP 请求有错误的远程 IP

我正在尝试编写一个执行 HTTP 请求的 PowerShell 脚本。该请求由 PHP 脚本处理,该脚本需要知道客户端的 IP 地址。为此,它读取$_SERVER['REMOTE_ADDR']

现在,出现以下奇怪的行为:

  • 当我使用 whatismyip.com 之类的服务时,我的 IP 是xxx.yyy.141.183
  • 当我使用 Web 浏览器调用我的 PHP 脚本时,$_SERVER['REMOTE_ADDR']返回与上面相同的 IP xxx.yyy.141.183(如预期的那样)。
  • 当我使用 PowerShell 脚本调用同一个 PHP 脚本时,$_SERVER['REMOTE_ADDR']返回不同的 IP,即xxx.yyy.51.111

PowerShell 脚本非常简单:

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

我在连接到我所在大学的网络时观察到了这种行为。因此,我不知道有关网络配置的任何细节。我注意到,使用要点 1 和 2 中的方法,不同的机器似乎具有不同的 IP,但使用第三种方法,它们都具有相同的 IP。

问题:如何修改我的 PowerShell 脚本以“像 Web 浏览器一样运行”,即发送请求,其中服务器看到的远程地址等于从 Web 浏览器接收请求时看到的远程地址?

附加问题:为什么会发生这种情况?

答案1

由于发现只有 Firefox 会使用正确的公网 IP 进行请求,xxx.yyy.141.183而 IE 和 Chrome 则不会,因此我找到了以下解决方案:

  • 不同浏览器的行为不同意味着问题与 PowerShell 没有直接关系,而是源于代理设置。
  • 我意识到 Firefox 被设置为“使用系统的代理设置”。当我将其更改为“自动检测网络的代理设置”(粗略翻译,抱歉)时,Firefox(就像 IE 和 Chrome 一样)会使用 IP 发出请求xxx.yyy.51.111
  • 由此我得出结论,PowerShell 必须使用一种配置,使其自动检测代理设置。这一猜想得到了以下事实的证实:文档

Proxy 属性标识代表此 WebClient 对象与远程服务器通信的 IWebProxy 实例。系​​统使用配置文件和 Internet Explorer 局域网设置来设置代理。若要指定不应使用代理,请将 Proxy 属性设置为 GetEmptyWebProxy 方法返回的代理实例。

  • 由于我不想更改系统配置,并且GlobalProxySelection.GetEmptyWebProxy已被弃用,我现在成功地使用了建议的解决方案这里:只需将proxy属性设置为null

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

相关内容