使用端口(例如 localhost:12345)访问 IPv6 可解析 URL 会导致 Strawberry Perl 5.30.1 中出现错误地址
Posted
技术标签:
【中文标题】使用端口(例如 localhost:12345)访问 IPv6 可解析 URL 会导致 Strawberry Perl 5.30.1 中出现错误地址【英文标题】:Accessing IPv6 resolvable URL with port (e.g. localhost:12345) results in Bad Address in Strawberry Perl 5.30.1 【发布时间】:2020-08-10 18:44:06 【问题描述】:在启用 IPv6 的 Windows 10 下使用草莓 perl 5.30.1 时,由于 Perl 的 DNS 解析器中似乎存在错误,因此无法正确解析带有端口号的 URL。
对于以下测试,我们有一个简单的网络服务器在端口 8810 上侦听所有接口。
端口 12345 确实不托管任何东西。
以下是我们用于复制的脚本:
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $result=$ua->get("http://localhost:8810/");
print "(DNS Expect: Success) The server responded with Status Code ".$result->status_line.".\n";
$result=$ua->get("http://localhost:12345/");
print "(DNS Expect: Failure) The server responded with Status Code ".$result->status_line.".\n";
$result=$ua->get("http://127.0.0.1:8810/");
print "(IPv4 Expect: Success) The server responded with Status Code ".$result->status_line.".\n";
当使用 5.28.0 执行时,我得到了正确的响应
C:\perl-test>strawberry-perl-5-28-0-original\perl\bin\perl.exe test2.pl
(DNS Expect: Success) The server responded with Status Code 200 OK.
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (No connection could be made because the target machine actively refused it.).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.
但是,当尝试使用 5.30.1 时,我得到错误地址,无论是否实际打开端口
C:\perl-test>strawberry-perl-5-30-1-original\perl\bin\perl.exe test2.pl
(DNS Expect: Success) The server responded with Status Code 500 Can't connect to localhost:8810 (Bad address).
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (Bad address).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.
请注意,如果我们直接提供 IPv4 地址,5.30.1 仍然能够实际请求信息。此外,对于不解析为 IPv6 而仅解析为 IPv4 的 DNS,5.30.1 似乎没有问题。
还有其他人有这个问题吗?如果有,这是否被认为是一个错误,或者我们只是以某种错误的方式使用 perl?
更新:我发现了另一个似乎有帮助的难题:
到目前为止,我们只在公司的 windows 机器上进行了尝试,所有机器在 Perl 5.30.1 和 5.30.2 上都有相同的行为。但是,我现在也尝试了我的私有 Windows 10,它工作正常。
然后我挖掘了一点关于 IPv4 和 IPv6 的知识,并想出了这篇来自微软的知识库文章:https://support.microsoft.com/en-us/help/929852/guidance-for-configuring-ipv6-in-windows-for-advanced-users
底线:我在注册表中设置了 Windows 应该更喜欢 IPv4 而不是 IPv6(设置 0x20),重新启动 - 它在我的公司 Windows 10 上运行!
显然我们有一些设置与 perl 相关,但似乎仍然存在一个问题:当尝试访问无法访问的 localhost 端口时,我们仍然收到“错误地址”错误而不是“连接被拒绝”,这意味着仍然有一些东西在错误解析我们的 dns:port 字符串。
另外,我希望 perl 现在可以完全支持 IPv6。
【问题讨论】:
检查脚本末尾的keys %INC
,看看两个版本之间是否有任何区别,表明您在 5.28 中安装了 IPv6 所需的一些模块,但在 5.30 中没有安装?
我们发现唯一没有在 5.30 调用中列出的模块是“Storage/Limit.pm” - 但这听起来与问题无关。
确保在两个版本上都安装了 IO::Socket::IP。 (测试:perl -mIO::Socket::IP -e1
)如果这是两台不同的机器,我会检查localhost
的定义
Socket::IP 安装在两个安装中。我们在同一台机器上检查了两个安装,所以不同的 localhost 定义是不可能的。它也发生在我们测试过的每台 Windows 10 机器上。我不知道我们在两个安装中使用的 Socket::IP 的确切版本,但我相信它们是相同的。明天检查
因为我不能编辑我的旧评论,我就写在这里:我们测试的两个 Perl 安装(5.28.0 和 5.30.1)都有 IO::SOCKET::IP in 0.39 版。
【参考方案1】:
我在 KVM 虚拟机(在 Ubuntu 20.04 上)中尝试了这个,运行 Windows 10、Strawberry Perl 5.30.1、XAMPP 7.4.5,虚拟主机在 8080 上侦听,根据网络和 Internet 设置启用 IPv4 和 IPv6在控制面板中。
这似乎在这里工作正常,您的test2.pl
脚本的输出是:
(DNS Expect: Success) The server responded with Status Code 200 OK.
(DNS Expect: Failure) The server responded with Status Code 500 Can't connect to localhost:12345 (No connection could be made because the target machine actively refused it.).
(IPv4 Expect: Success) The server responded with Status Code 200 OK.
【讨论】:
好的,那么到底有什么不同呢?虽然这似乎不是一个普遍的问题,但令人放心 好的,我们走得更远了。我会相应地更新我的问题以上是关于使用端口(例如 localhost:12345)访问 IPv6 可解析 URL 会导致 Strawberry Perl 5.30.1 中出现错误地址的主要内容,如果未能解决你的问题,请参考以下文章