精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
这次调试bug,让大家深刻认识到了模块越多问题越多越不好查的特性,ip分为版本4和6导致了模块增加,也让各类新问题出现。另外做开发,要掌握网络通信知识,才能是全才,只会编程语言范畴函数和类,远远不够。
我最近设置了一个内部(有防火墙的)apache2 Web 服务器,由于某种原因,我的一位同事无法访问它(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_clientmy_domainname.compingdignmap openssl s_client -connect google.com:443 确实有效,所以似乎我配置错误了什么?或者 的 DNS 解析可能出了问题?openssl
我发现了这个问题,这可能与许多其他人无关,但它确实是我具体情况下的问题: 问题 openssl s_client,显然默认情况下 (?) 从 DNS 名称服务器请求 IPv4 和 IPv6 地址,然后显然仅在获得对 IPv6 DNS 请求的有效响应时才尝试通过 IPv6 进行连接。 问题是我没有打开 IPv6 HTTP(S) 端口,因此从 DNS 服务器请求 IPv6 地址,获得有效的响应和有效的 IPv6,然后尝试连接到该 IPv6 地址并被防火墙阻止。openssl 其他程序(如 Firefox )显然要么默认使用 IPv4,要么在注意到 IPv6 失败后回退到 IPv4,因此我一开始无法检测到问题。nmap 如何检测 如果它帮助了其他人: 我通过侦听端口 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) 表示已请求并随后收到了 IPv4 () 和 IPv6 () DNS 问题和答案。 (此处和下面的 , , , 和 是占位符,而不是字面意思。opensslAAAAAlocal-ipdns-servercname-of-serverserver-ipv6-addressserver-ipv4-address 然后,我检查了作为 DNS 查询的回复给出的 IPv4 和 IPv6 地址的进出流量: sudo tcpdump host server-ipv6-address # in one tab sudo tcpdump host server-ipv4-address # in another tab 就在运行命令之前。 我注意到 IPv6 主机有未应答的会话建立(SYN,在输出中)数据包,但 IPv4 上没有数据包,这表明它忽略了它收到的 IPv4 地址并尝试仅使用 IPv6 应答进行连接。openssl s_client[S]tcpdumpopenssl 如果你修复它,它就会起作用 在我更改服务器的防火墙设置以允许传入的 IPv6 HTTP(S) 数据包后,我能够成功连接并显示与 IPv6 主机进行了正常的握手。旁注:Firefox 在端口打开后自动切换到 IPv6。openssl s_clienttcpdump
您还可以在基于 glibc 的 Linux DNS 解析器中将 IPv4 的优先级设置为高于 IPv6,方法是在 /etc/gai.conf 中添加类似于 precedence ::ffff:0:0/96 100 的行。systemd 解析器可能也有类似的机制
这可能也可以解决问题,尽管我认为很明显,最好不要配置错误的 IPv6。理想情况下,openssl s_client可以在 IPv6 超时并通知我 IPv6 超时后切换到 IPv4,但我找不到让它这样做的方法