用ssl“没有路由到主机”,但没有telnet

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

当我input:

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压缩虚拟机。

编辑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并成功。

你能检查你是否可以ping通目标主机? (IPv4)看来

  • 您的IPv4连接中断
  • 有一个AAAA和一个logging
  • telnetpipe理更喜欢IPv6
  • openssl避免了IPv6

这可能只是一个简单的IPv4连接问题,不适用于目标主机。 两台机器上的IPv4路由是否正常?

正如你注意到的,它看起来像是在运行openssl缺乏ipv6支持。 一篇LWN文章给出了一些背景知识,但看起来像你最简单的解决scheme(短重build一个自定义打补丁openssl)是切换到gnutls 。

根据您可以使用的telnet,可能会有一个-4或-6开关来强制限制IP版本,从而允许您规划IPv4或IPv6的关注点。

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

 Connected to athena.hidden.tld. 

看起来像你通过主机名连接。 尝试使用IP地址来消除DNS问题的可能性:

 openssl s_client -connect puppet.master.ip.address:8140 

你必须检查openssl的版本。 在那里有一个奇怪的错误报告113 …如果你深入挖掘一下,你可能会看到一个“握手”问题…. IIRC,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