我在尝试连接到 HTTPS 服务器时遇到了奇怪的行为。我有一个通过 Apache2 运行的 PHP SOAP 客户端,它无法连接到服务器:
10:15:19.871149 IP 1.1.1.1.57038 > 2.2.2.2.https: Flags [S], seq 3019730905, win 29200, options [mss 1460,sackOK,TS val 2000430949 ecr 0,nop,wscale 7], length 0
10:15:19.878961 IP 2.2.2.2.https > 1.1.1.1.57038: Flags [S.], seq 1419811359, ack 3019730906, win 14480, options [mss 1460,sackOK,TS val 1379727760 ecr 2000430949,nop,wscale 7], length 0
10:15:19.879180 IP 1.1.1.1.57038 > 2.2.2.2.https: Flags [R], seq 3019730906, win 0, length 0
如您所见,客户端在收到来自服务器的 SYN-ACK 数据包后重置连接。
但是,我可以使用 telnet 和 wget 从该服务器连接到服务器。这是 wget 会话的流量捕获示例:
10:14:49.320462 IP 1.1.1.1.56948 > 2.2.2.2.https: Flags [S], seq 2001951126, win 29200, options [mss 1460,sackOK,TS val 2000400398 ecr 0,nop,wscale 7], length 0
10:14:49.329152 IP 2.2.2.2.https > 1.1.1.1.56948: Flags [S.], seq 3563908913, ack 2001951127, win 14480, options [mss 1460,sackOK,TS val 1379697210 ecr 2000400398,nop,wscale 7], length 0
10:14:49.329377 IP 1.1.1.1.56948 > 2.2.2.2.https: Flags [.], ack 1, win 229, options [nop,nop,TS val 2000400407 ecr 1379697210], length 0
10:14:49.331041 IP 1.1.1.1.56948 > 2.2.2.2.https: Flags [P.], seq 1:518, ack 1, win 229, options [nop,nop,TS val 2000400409 ecr 1379697210], length 517
10:14:49.339616 IP 2.2.2.2.https > 1.1.1.1.56948: Flags [.], ack 518, win 122, options [nop,nop,TS val 1379697220 ecr 2000400409], length 0
10:14:49.342199 IP 2.2.2.2.https > 1.1.1.1.56948: Flags [.], seq 1:2897, ack 518, win 122, options [nop,nop,TS val 1379697223 ecr 2000400409], length 2896
../..
我运行的是目标服务器 (2.2.2.2),而不是客户端服务器,但我可以请其管理员进行一些测试。我认为他们可能有一个防火墙阻止了连接。您有什么提示可以解决这个问题吗?
更新
该服务器正在运行 CENTOS 8。
它有一个 IPTables 防火墙,但我认为这不是问题。我问过是否有上游防火墙。
我无法通过 php-cli 尝试 soap 客户端,但我通过 Web 服务器和 php-cli 运行了此代码,第一次失败,但最后一次成功:
<?php
$wsdl = '';
if ( $fd = fopen('https://myservice.mydomain.com/soap/v2/?wsdl', 'r') ) {
while ( !feof( $fd ) ) {
$wsdl .= fread($fd, 1024);
}
fclose( $fd );
}
echo $wsdl;
我觉得这可能是某些安全模块或 Web 服务器权限的问题。
问候,
答案1
@Mircea Vutcovici,感谢您抽出时间帮助我。最终,根据客户告诉我的情况,问题出在 PHP 连接服务器的时间过长。增加 default_socket_timeout 值就可以解决问题。
不过,这很奇怪,因为连接在三次握手中就关闭了,而这只持续了几秒钟。无论如何,我能做的也很多,因为我不是出现问题的机器的管理员。
问候,