使用 SSL 时出现“无到主机的路由”,但使用 telnet 时不会出现此问题

使用 SSL 时出现“无到主机的路由”,但使用 telnet 时不会出现此问题

我在从我的一台服务器连接到 https 站点时遇到了一个奇怪的问题。

当我输入:

 telnet puppet 8140

我看到了一个标准的 telnet 控制台,并且可以像往常一样与服务器通信:

Connected to athena.hidden.tld.
Escape character is '^]'.
GET / HTTP/1.1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://athena.hidden.tld:8140/"><b>https://athena.hidden.tld:8140/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.16 (Debian) Server at athena.hidden.tld Port 8140</address>
</body></html>
Connection closed by foreign host.

但是当我尝试使用 ssl 连接到同一主机和端口时:

openssl s_client -connect puppet:8140

它不起作用

connect: No route to host
connect:errno=113

我很困惑。乍一听像是防火墙问题,但事实并非如此,不是吗?因为这也会阻止 telnet 连接。

我在两台服务器上都使用 ferm 作为防火墙。系统是 debian squeeze vm-boxes。

[编辑1]

即使我尝试直接使用 IP 地址连接:

openssl s_client -connect 198.51.100.1:8140 #address exchanged
connect: No route to host
connect:errno=113

使用以下命令关闭两台主机的防火墙

service ferm stop

也无济于事。

但当我这样做

openssl s_client -connect localhost:8140

在服务器机器上,连接正常。

[编辑2]

如果我使用 telnet 连接到 IP,它也不起作用。

telnet 198.51.100.1 8140
Trying 198.51.100.1...
telnet: Unable to connect to remote host: No route to host

混淆可能来自 IPv6。我的所有主机上都有 IPv6。看来 telnet 默认使用 IPv6,并且这有效。例如:

telnet -6 puppet 8140

有效,但是

telnet -4 puppet 8140

不起作用。因此 IPv4 路由似乎存在问题。openssl 似乎仅(或默认)使用 IPv4,因此失败,但 telnet 使用 IPv6 并成功。

答案1

你能检查一下是否能 ping 通目标主机吗?(IPv4)似乎

  • 您的 IPv4 连接已中断
  • 有 AAAA 和 A 记录
  • telnet 倾向于使用 IPv6
  • openssl 避免 IPv6

这可能只是由于 IPv4 连接无法与目标主机正常工作而导致的问题。两台机器上的 IPv4 路由是否正常?

答案2

正如您所注意到的,您似乎遇到了 openssl 中缺乏 ipv6 支持的问题。LWN 文章给出了一些背景信息,但看起来最简单的解决方案(除了重建自定义修补的 openssl)是切换到格努特尔斯

答案3

根据您可用的 telnet,可能会有一个 -4 或 -6 开关来强制限制 IP 版本,从而允许您加入或排除 IPv4 与 IPv6 问题。

netstat -arn 输出是什么样的?是否有目标 IPv6 路由和/或可行的默认 IPv6 路由?

答案4

您必须检查 openssl 的版本。有一个奇怪的错误报告 113...如果您深入挖掘,您可能会看到“握手”问题....如果我没记错的话,0.9.8 有问题...如果您使用的是该版本或更低版本...请尝试更新您的 openssl。

看一下这个... https://stackoverflow.com/questions/8619706/running-curl-with-openssl-0-9-8-against-openssl-1-0-0-server-causes-handshake-er/8621263#8621263

相关内容