通过 NTLM 代理的 Perl 包管理器

通过 NTLM 代理的 Perl 包管理器

我已经在工作中安装了 ActivePerl 和包含 PPM,但无法通过代理将其连接到模块存储库。我设置了一个环境变量

HTTP_PROXY = http://user:[email protected]:port

但 PPM 仍然显示 407 错误需要代理身份验证。我认为它是一个 NTLM 代理,但我不确定。

做完之后,我得到一个错误 500:主机名错误为了ppm4.activestate.com。结果 PPM 要求我的 DNS 服务器解析该名称,但我的本地 DNS 服务器无法解析此类外部域名。只有代理才能执行此类操作,并且仅适用于 HTTP 流量...

以下是 Wireshark (在同一 Windows XP 机器上的 BackTrack VM 上运行) 显示的屏幕截图:

我的 Windows 盒子是10.75.82.221 DNS 服务器是10.7.3.110

Wireshark 嗅探

这是 TraceRoute 在 Windows 上显示的内容:

G:\>tracert ppm4.activestate.com
No se puede resolver el nombre de destino ppm4.activestate.com.

意思是:

无法解析 ppm4.activestate.com

正如预期的那样。

正如我在评论中所说,浏览器似乎没有启动任何 DNS 查询。以下是 Wireshark 屏幕截图(来自 BT),显示了从 Firefox(来自 WXP)访问 www.google.es:

我的 Windows 盒子是10.75.82.221 代理是10.7.8.46

Wireshark 嗅探

如您所见,通过浏览器访问时根本不需要任何 DNS 查询...

对我来说,它似乎只是一个安全功能,我必须请求允许我使用 ActiveState 的 PPM 工具......这是不合理的,即使我在这里编写的大多数(99%)脚本都是为了加快工作速度。

答案1

perl.org 中描述了解决错误 407 的方法问题与解答

问:即使 http_proxy 设置为具有正确凭据的正确服务器(使用约定用户名:[电子邮件保护]:port) 我仍然无法通过 cpan 安装软件包。“LWP 失败,代码为 [407] 消息 [需要代理身份验证 (ISA 服务器需要授权才能满足请求。拒绝访问 Web 代理服务。)]”

A:CPAN 不支持 NTLM 身份验证,而且很难让 Authen::NTLM 与 CPAN 协同工作。我最终使用 ntlmaps 作为 NTLM 身份验证的本地代理。

您需要做的第一件事是从他们的 svn repo 获取最新版本的 NTLMAPS,并将其解压到某个位置。接下来,您需要获取最新版本的 python 并安装它。打开 NTLMAPS 的 server.cfg,将 PARENT_PROXY 设置为代理的地址或 IP,将 PARENT_PROXY_PORT 设置为代理运行的端口(通常为 80 或 8080),将 NT_DOMAIN 设置为您的域,将 USER 设置为您的用户名。

运行 runserver.bat。它会要求您输入密码,输入后按回车键。接下来,您必须配置 cpan 以使用 NTLMAPS 作为代理。转到 strawberry\perl\lib\CPAN 并打开 Config.pm。将 http_proxy 设置为 http://本地主机:5865. 运行 CPAN 并像平常一样使用它。现在您只需要在运行 CPAN 之前启动 NTLMAPS 即可使其正常运行。

需要注意的是,您可能需要强制 LM + NT 身份验证而不是 LM;为此,打开 NTLMAPS server.cfg,将 NT_PART 设置为 1,将 NTLM_FLAGS 设置为 07820000。

按照说明删除 HTTP_PROXY 并修改 CPAN/Config.pm 可能会解决问题。

评论摘要如下:

对 wireshark 转储的研究表明,ActivePerl 发出的 DNS 请求被 DNS 服务器返回为未知。可能的解决方案只有:

  1. 重新配置 DNS 服务器(对于发帖者来说不可能)
  2. ActiveState 社区网站停止这些无用的要求(不能保证任何快速的救济)
  3. 手动下载并安装模块(仅剩下实际解决方案)。

答案2

如果是 NTLM,则需要NTLMPerl 模块。ActiveState PPM 文档说,您可以ppmx存储库,但我找不到这样的链接。不过,你仍然可以下载ppdtar.gz文件并安装它们:

wget http://ppm4.activestate.com/MSWin32-x86/5.12/1205/N/NB/NBEBOUT/NTLM-1.09.ppd
wget http://ppm4.activestate.com/MSWin32-x86/5.12/1205/N/NB/NBEBOUT/NTLM-1.09.tar.gz
ppm install NTLM-1.09.ppd

另请注意,如果您的计算机属于 Windows 域,则您不需要明确提供凭据 -http://proxy.full.name:port对于 NTLM/Kerberos 来说应该足够了,而且更安全。


最近,微软软件已经从 NTLM 切换到 Kerberos——尽管通常代理都支持这两种协议,但它您的系统中可能会禁用 NTLM。关于使用 PPM 的 Kerberos 代理的文档并不多,但HTTP-Negotiate如果您无法使 NTLM 正常工作,则可能值得尝试。

答案3

这是盲目的尝试……没有人提到尝试这个,但听起来好像每个人都没有主意……如果这是真的:

"Turns out PPM asks my DNS server to resolve that name, but my local DNS server cannot resolve such external domain names."

然后编辑:

C:\Windows\System32\Drivers\etc\hosts

添加以下行:

204.244.102.19  ppm4.activestate.com

看看是否有区别。


对于 ntlmaps 的故障排除:

server.cfg 中有两个选项 DEBUG 和 BIN_DEBUG,如果您在使用服务器时遇到问题,请在请求问题页面(或资源)之前将这些选项设置为 DEBUG:1 和 BIN_DEBUG:1。您必须重新启动代理服务器才能重新读取 server.cfg。这将为您提供每个 http 请求(确切地说是每个连接)的 3 个日志文件,例如 127.0.0.1-1048、127.0.0.1-1048.bin.client 和 127.0.0.1-1048.bin.rserver。第一个日志文件包含有关 APS 所做工作的信息,另外两个日志文件包含来自客户端和代理的原始流量。

http://ntlmaps.sourceforge.net/

答案4

而不是执行 set http_proxy =http://用户:[电子邮件保护]:港口,只需尝试设置无需用户名和密码的代理。

做就是了:

设置 http_proxy =http://proxy.full.name:端口

原因:我从某处读到,最新版本的 Perl 5.22 不需要代理身份验证。对我来说,它就像魔术一样有效。

希望它能解决您的问题。

相关内容