TCP 握手错误:无法识别 SYN 和 SYN/ACK 数据包

TCP 握手错误:无法识别 SYN 和 SYN/ACK 数据包

我有一个非常有趣的问题:

我有 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

我通过添加ens18br0并在桥上创建 vlan 接口解决了这个问题br0.32

看起来这是 ubuntu 内核错误,我在 arch linux iso 上测试了这个问题,它工作正常。我会在 launchpad 上发送错误报告...

相关内容