我最近设置了一个内部(有防火墙) apache2 网络服务器,我的一位同事由于某种原因无法访问该服务器(PR_END_OF_FILE_ERROR,表示握手/SSL/密码出现问题)。由于我对那里的根本问题没有足够清晰的认识,所以我不打算用这个问题来解决他不明确的问题。但:
在尝试理解问题背后的原因时,我注意到了以下奇怪的行为:如果我运行
openssl s_client -connect 111.222.333.111:443
与IP地址,然后我就可以按预期测试所有密码等。连接基本上是瞬间建立的,一切似乎都很好。但如果我用
openssl s_client -connect my_domainname.com:443
即使用已注册的域名,那么似乎什么都没有发生,openssl-s_client
永远不会返回(好像它仍在尝试永远建立连接?)并且我无法让它给我任何输出。但是,my_domainname.com
在浏览器中打开时,除了一位同事之外,其他人都可以按预期工作,并且ping
、dig
等nmap
也正确解析了域名。相反,
openssl s_client -connect google.com:443
做可以正常工作,所以看起来我配置有误?还是openssl
的 DNS 解析出了问题?
答案1
我发现了这个问题,它可能与其他很多人无关,但这确实是我的具体情况中的问题:
问题
openssl s_client
,显然默认情况下(?),从 DNS 名称服务器请求 IPv4 和 IPv6 地址,然后尝试连接仅通过 IPv6如果它对 IPv6 DNS 请求获得有效响应。问题是我没有打开 IPv6 HTTP(S) 端口,因此openssl
从 DNS 服务器请求 IPv6 地址,获得有效响应和有效 IPv6,然后尝试连接到该 IPv6 地址并被防火墙阻止。
其他程序(例如nmap
Firefox)显然默认使用 IPv4,或者在注意到 IPv6 失败后回退到 IPv4,这就是为什么我一开始无法检测到问题的原因。
如何检测
如果它对其他人有帮助:我通过监听端口 53(DNS)上的 TCP 流量发现这是问题所在:
sudo tcpdump -n port 53
在我执行之后,我注意到了以下交换openssl s_client
:
18:24:57.649939 IP local-ip.50643 > dns-server.53: 12404+ [1au] A? domain-name.com. (55)
18:24:57.650293 IP local-ip.39731 > dns-server.53: 26725+ [1au] AAAA? domain-name.com. (55)
18:24:57.651843 IP dns-server.53 > local-ip.50643: 12404* 2/0/1 CNAME cname-of-server., A server-ipv4-address (146)
18:24:57.651877 IP dns-server.53 > local-ip.39731: 26725* 2/0/1 CNAME cname-of-server., AAAA server-ipv6-address (158)
表示openssl
已请求并随后收到 IPv4 ( A
) 和 IPv6 ( AAAA
) DNS 问题和答案。(此处及下文中的local-ip
、dns-server
、cname-of-server
和为server-ipv6-address
占位server-ipv4-address
符,而非文字。)
然后我检查了作为对 DNS 查询的回复而给出的 IPv4 和 IPv6 地址的流量:
sudo tcpdump host server-ipv6-address # in one tab
sudo tcpdump host server-ipv4-address # in another tab
在运行openssl s_client
命令之前。我注意到IPv6 主机有未答复的会话建立(SYN,输出)数据包,但 IPv4 上没有任何数据包,这表明它[S]
忽略了收到的 IPv4 地址并尝试仅使用 IPv6 答案进行连接。tcpdump
openssl
如果你修复它它就会起作用
在我更改服务器的防火墙设置以允许传入 IPv6 HTTP(S) 数据包后,openssl s_client
能够成功连接并tcpdump
显示与 IPv6 主机的握手正常。附注:端口打开后,Firefox 会自动切换到 IPv6。