当我尝试联系客户虚拟机时,我遇到了一个非常奇怪的问题:数据包的标头丢失。
我有一台运行 CentOS 7 和 VirtualBox v.5.0.14 的裸机。然后我有一个使用桥接网络运行 Ubuntu 15.10 的客户端。它顺利地从我们的 DHCP 服务器获取了 IP 地址。该客户端正在运行 SSH 和 Apache。
VirtualBox 主机、客户机以及以下测试中使用的所有客户端上的所有防火墙均被禁用。
我可以通过 SSH 从客户机连接到我们网络上的任何其他 Linux 主机。我还可以连接到由 Windows 主机提供的 Windows Samba 服务 =D
- 从 VirtualBox 主机访问客户机时,SSH 和 Apache 均可正常工作。同样,我可以从客户机通过 SSH 连接到 VBox 主机 =D
- 从 Ubuntu 笔记本电脑访问客户机时,SSH 和 Apache 可以工作 =D
- 从 CentOS 7 VM 访问客户机时 SSH 和 Apache 可以工作 =D
- 在 Windows 中使用 PuTTY 通过 SSH 连接到 VBox 主机可以正常工作 =D
一切都正常进行,对吧?
- 使用 PuTTY 从任何 Windows 主机进行 SSH 都会导致“数据包在解密时乱码”错误 =(
- 任何 Windows 主机上的 Apache 都会导致屏幕上输出难以理解的文本,或者尝试下载包含相同难以理解的文本的文件,具体取决于浏览器=(
使用 Solaris 获取 Apache 网页或 SSH 可以让我们获得更多见解。我猜它的行为与 Windows 主机相同,只是我们获得了更多的调试输出。
ssh fullyqualifiedguesthostname
0000 0000 0000 a89f
Disconnecting: Bad packet length 0.
该行数字的末尾每次都是不同的,带有十六进制字符串。即 0000 0000 0000 xxxx
当使用 wget 获取网页时...
wget --no-proxy fullyqualifiedguesthostname
--09:57:38-- fullyqualifiedguesthostname
=> `index.html'
Resolving fullyqualifiedguesthostname... x.x.x.x
Connecting to fullyqualifiedguesthostname|x.x.x.x|:80... connected.
HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9
Length: unspecified
[ <=> ] 11,638 2.33K/s
09:57:43 (2.33 KB/s) - `index.html' saved [11638]
注意无标头,假设为 HTTP/0.9
此外,下载这个 11Kb 的文件需要几秒钟。
在 Ubuntu 主机上使用 wget:
wget --no-proxy fullyqualifiedguesthostname
--2016-02-26 10:08:06-- fullyqualifiedguesthostname
Resolving fullyqualifiedguesthostname (fullyqualifiedguesthostname)... x.x.x.x
Connecting to fullyqualifiedguesthostname (fullyqualifiedguesthostname)|x.x.x.x|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11321 (11K) [text/html]
Saving to: ‘index.html’
100%[=========================================================>] 11,321 --.-K/s in 0s
2016-02-26 10:08:06 (160 MB/s) - ‘index.html’ saved [11321/11321]
没有问题,没有关于缺少标题的消息,它就像您所期望的那样,眨眼间就完成了。
现在,以下是在 Solaris 主机上下载的 index.html 文件的前几行:
cat index.html
.1 200 OK
Date: Fri, 26 Feb 2016 10:18:26 GMT
Server: Apache/2.4.12 (Ubuntu)
Last-Modified: Tue, 26 Jan 2016 15:38:24 GMT
ETag: "2c39-52a3e79e18489"
Accept-Ranges: bytes
Content-Length: 11321
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
正常且未受干扰的 HTML 代码遵循此规则。
在 Ubuntu 主机上下载的 index.html 文件不包含这些第一行。它只是 HTML 代码。
我假设,缺少标头是导致从 Windows 主机访问网页时文本难以理解的原因 - 浏览器不知道文件是什么,因此不知道如何显示它。我还假设 SSH 故障也是如此 - 缺少标头。
我还应该注意,我可以从任何地方 ping 客户机,Windows、Linux、Solaris。
我认为这几乎囊括了这个混乱网络中的所有变量。
有人知道到底发生了什么事吗?
答案1
我将客户操作系统的网络适配器类型更改为“半虚拟化网络(virtio-net)”,所有问题都消失了。