我有一个非常有趣的问题:
我有 Proxmox 虚拟机管理程序和两个 Linux 虚拟机:
- 第一个虚拟机主桥中有几个网卡,每个网卡都添加到虚拟机管理程序上带有特定 vlan 标记的虚拟机中。
- 第二台虚拟机主桥中只有一个网卡,但虚拟机内有 vlan 接口。
网络设置相同,但在第二台虚拟机上,TCP-Handshake 不起作用。另一方面,ICMP 和 UDP 协议工作正常。
问题发生在与第二台机器有关的所有流量方向上:
- 从第二个虚拟机到外部世界。
- 从第二个虚拟机到路由器。(反之亦然)
- 从第二个 vm 到第一个 vm。(反之亦然)
我如何测试它?
- 平: 工作正常
- nslookup(udp 模式):工作正常
- nslookup(tcp 模式):超时错误
- telnet 或 ssh:超时错误
然后我决定捕获流量并在 wireshark 中对其进行分析:
我到处都看到同样的问题: 第二个虚拟机的SYN
数据SYN/ACK
包无法识别。看起来这些数据包没有到达,但它们却完美地到达了。(见下文)
当我尝试通过 telnet 连接虚拟机上的 80 端口时,这里显示了 4 个捕获。
- 路由器:
192.168.32.1
- 第一个虚拟机:
192.168.32.70
- 第二台虚拟机:
192.168.32.80
成功连接到第一个虚拟机(从客户端捕获):
No. Time Source Destination Protocol Length Info
2 1.311927 192.168.32.1 192.168.32.70 TCP 74 38873→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54904054 TSecr=0 WS=32
3 1.347181 192.168.32.70 192.168.32.1 TCP 74 80→38873 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=57170781 TSecr=54904054 WS=128
4 1.347223 192.168.32.1 192.168.32.70 TCP 66 38873→80 [ACK] Seq=1 Ack=1 Win=13856 Len=0 TSval=54904058 TSecr=57170781
成功连接到第一个虚拟机(从服务器捕获):
No. Time Source Destination Protocol Length Info
1 0.000000 192.168.32.1 192.168.32.70 TCP 74 38873→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54904054 TSecr=0 WS=32
2 0.000128 192.168.32.70 192.168.32.1 TCP 74 80→38873 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=57170781 TSecr=54904054 WS=128
3 0.051272 192.168.32.1 192.168.32.70 TCP 66 38873→80 [ACK] Seq=1 Ack=1 Win=13856 Len=0 TSval=54904058 TSecr=57170781
无法连接到第二台虚拟机(从客户端捕获):
No. Time Source Destination Protocol Length Info
25 0.889659 192.168.32.1 192.168.32.80 TCP 74 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54864760 TSecr=0 WS=32
27 0.925075 192.168.32.80 192.168.32.1 TCP 74 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=210548 TSecr=54864760 WS=128
34 1.880028 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54864860 TSecr=0 WS=32
35 1.915204 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=4294967049 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=210795 TSecr=54864760 WS=128
51 2.912418 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=4294966799 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=211045 TSecr=54864760 WS=128
63 3.880067 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54865060 TSecr=0 WS=32
64 3.917480 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=4294966549 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=211295 TSecr=54864760 WS=128
67 5.912529 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=4294966049 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=211795 TSecr=54864760 WS=128
73 7.890030 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54865461 TSecr=0 WS=32
74 7.925401 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=4294965546 Ack=1 Win=28960 Len=0 MSS=1384 SACK_PERM=1 TSval=212298 TSecr=54864760 WS=128
无法连接到第二个虚拟机(从服务器捕获):
No. Time Source Destination Protocol Length Info
1 0.000000 192.168.32.1 192.168.32.80 TCP 74 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54864760 TSecr=0 WS=32
2 0.000105 192.168.32.80 192.168.32.1 TCP 74 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=210548 TSecr=54864760 WS=128
3 0.990176 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54864860 TSecr=0 WS=32
4 0.990240 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=210795 TSecr=54864760 WS=128
5 1.987305 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=211045 TSecr=54864760 WS=128
6 2.991251 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54865060 TSecr=0 WS=32
7 2.991317 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=211295 TSecr=54864760 WS=128
8 4.987338 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=211795 TSecr=54864760 WS=128
11 7.000116 192.168.32.1 192.168.32.80 TCP 74 [TCP Spurious Retransmission] 37740→80 [SYN] Seq=0 Win=13840 Len=0 MSS=1384 SACK_PERM=1 TSval=54865461 TSecr=0 WS=32
12 7.000184 192.168.32.80 192.168.32.1 TCP 74 [TCP Retransmission] 80→37740 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=212298 TSecr=54864760 WS=128
我不明白为什么它不能工作。有什么想法吗?
应 MarkoPolo 的要求,我添加了第二个虚拟机的命令输出:
ifconfig
ens18 Link encap:Ethernet HWaddr 12:7c:7f:a1:8a:b4
inet addr:10.10.100.80 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::107c:7fff:fea1:8ab4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:185759 errors:0 dropped:27 overruns:0 frame:0
TX packets:1186 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23593488 (23.5 MB) TX bytes:173539 (173.5 KB)
ens18.32 Link encap:Ethernet HWaddr 12:7c:7f:a1:8a:b4
inet addr:192.168.32.80 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::107c:7fff:fea1:8ab4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1821 errors:0 dropped:0 overruns:0 frame:0
TX packets:52 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:195803 (195.8 KB) TX bytes:3718 (3.7 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:160 errors:0 dropped:0 overruns:0 frame:0
TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:11840 (11.8 KB) TX bytes:11840 (11.8 KB)
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.100.1 0.0.0.0 UG 0 0 0 ens18
10.10.100.0 0.0.0.0 255.255.255.0 U 0 0 0 ens18
192.168.32.0 0.0.0.0 255.255.255.0 U 0 0 0 ens18.32
答案1
我通过添加ens18
桥br0
并在桥上创建 vlan 接口解决了这个问题br0.32
。
看起来这是 ubuntu 内核错误,我在 arch linux iso 上测试了这个问题,它工作正常。我会在 launchpad 上发送错误报告...