我在从我的一台服务器连接到 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
答案3
根据您可用的 telnet,可能会有一个 -4 或 -6 开关来强制限制 IP 版本,从而允许您加入或排除 IPv4 与 IPv6 问题。
netstat -arn 输出是什么样的?是否有目标 IPv6 路由和/或可行的默认 IPv6 路由?
答案4
您必须检查 openssl 的版本。有一个奇怪的错误报告 113...如果您深入挖掘,您可能会看到“握手”问题....如果我没记错的话,0.9.8 有问题...如果您使用的是该版本或更低版本...请尝试更新您的 openssl。