为什么在Linux机器上,除了icmp之外,任何数据包都不能通过,而是正确地通过窗口

在proxmox上有一个集群。 在一个集群中有vmconfiguration的路由器(pfsense)。 在我们的网上有Windows和Linux的机器。

有问题:Windows机器可以访问互联网,但是Linux机器没有。

所有Linux机器的行为都是一样的,它发送一个请求并等待响应,但响应不会回来。 我用wget,ssh和nslookup检查了外部服务器(8.8.8.8例子)和ping。 除了ping,一切都不起作用。 ICMP数据包正确地去,因此我冒昧地提出与TCP的问题。 但所有的Windows机器,一切正常的作品。

我并没有为linux或windows创build特殊的过滤规则。

我打破了头,但还没有能够解决这个问题。

基线:

Our External IP: XX.XXX.XX.XX External Server IP: Y.YYY.Y.YYY (which was used to test) 

所以,我花了两个testing:

testing1.从linux机器上的wget:

从路由器捕获数据包:

 No. Time Source Destination Protocol Length Info 1 0.000000 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 GET / HTTP/1.1 2 21.798340 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 74 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128 3 21.850793 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 74 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024 4 21.850849 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 66 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522 5 21.850868 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 GET / HTTP/1.1 6 22.101939 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 7 22.605999 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 8 23.613997 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 9 25.629983 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 10 28.931894 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 78 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110 11 28.932001 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 66 [TCP Previous segment not captured] 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610 12 29.661996 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 13 31.360021 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 174 [TCP Retransmission] GET / HTTP/1.1 

从我的外部服务器捕获数据包:

 No. Time Source Destination Protocol Length Info 1 0.000000 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 76 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128 2 0.000059 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 76 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024 3 0.059242 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 68 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522 4 0.059247 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 GET / HTTP/1.1 5 0.303398 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 6 0.809767 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 7 1.815634 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 8 3.836576 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 9 7.088059 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 80 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110 10 7.134903 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 68 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610 11 7.864582 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 12 9.564772 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 176 [TCP Retransmission] GET / HTTP/1.1 

从Windows机器testing2. wget:

从路由器捕获数据包:

 No. Time Source Destination Protocol Length Info 1 0.000000 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 2 0.053994 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024 3 0.054129 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0 4 0.054450 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 150 GET / HTTP/1.0 5 0.110034 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0 6 0.113011 Y.YYY.Y.YYY XX.XXX.XX.XX HTTP 931 HTTP/1.1 200 OK (text/html) 7 0.115990 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0 

从我的外部服务器捕获数据包:

 No. Time Source Destination Protocol Length Info 1 0.000000 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 2 0.053994 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024 3 0.054129 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0 4 0.054450 XX.XXX.XX.XX Y.YYY.Y.YYY HTTP 150 GET / HTTP/1.0 5 0.110034 Y.YYY.Y.YYY XX.XXX.XX.XX TCP 60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0 6 0.113011 Y.YYY.Y.YYY XX.XXX.XX.XX HTTP 931 HTTP/1.1 200 OK (text/html) 7 0.115990 XX.XXX.XX.XX Y.YYY.Y.YYY TCP 54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0 

请帮助我,有什么想法?

过去我也遇到类似的问题。 原来,这是由于校验和卸载的问题。 虚拟化客户操作系统会将校验卸载到虚拟化主机,虚拟化主机应该将其卸载到物理networking接口。

但是最后校验和从来没有被计算过,并且数据包通过networking被发送,没有有效的校验和。 在连接的接收端,由于具有无效校验和,数据包将被丢弃。

在虚拟化主机和来宾中,您可以尝试使用以下任一名称查找选项,并尝试将其closures:

  • UDP校验和卸载
  • TCP校验和卸载
  • UDP碎片卸载
  • TCP分段卸载

有趣的问题。 它看起来不像防火墙问题,否则最初的3路TCP握手将不起作用。 尽pipe有TCP重传,但它似乎并不是一个MTU问题,因为数据包非常小,而且你又在两端看到它们。 它看起来像Web服务器只是没有响应GET请求。

DNS查找将使用UDP,所以这是另一回事。 您在尝试SSH的数据包捕获时看到了什么? 另外,如果您telnet到外部服务器的80端口并发出手动GET请求,该怎么办:

 telnet yyyy 80 GET / HTTP/1.1 host: yyyy <line feed> 

尝试上面的HTTP 1.0和1.1。 我注意到这是在Linux和Windows数据包上限GET请求之间的区别。 应该不重要,但值得尝试。

经过几个月的工作,我把Windows机器上的网卡驱动程序转换成了virtio,问题也出现在windows机器上。 这是真的,这似乎是问题与个人不兼容pfSense (或freebsd)和virtio驱动程序或proxmox其他组件。

在这一点上,我决定绕过这个问题:

  1. Proxmox群集直接连接到Internet并configuration到路由器。
  2. 在proxmox和pfsense之间创build了另一个新的子网
  3. 对于每个服务器,在此新的子网中创build第二个networking适配器,并在每个proxmox上configuration为默认网关。
  4. 在proxmox-cluster上,创build了一个规则,必须将某些端口转发到此服务器,并将所有外部stream量转发到pfsense。

结果我得到了以下结果:

  • 我networking上的所有客户端计算机都可以通过pfSense访问Internet,并使用pfsense的服务(代理服务器,日志logging等)
  • proxmox集群上的所有服务器都可以通过proxmox集群直接访问Internet
  • 作为一个很好的奖励,如果pfSenseclosures,我仍然可以通过SSH访问Proxmox群集

谢谢你们!

不幸的是,我无法评论:-(
据我所知,你已经看过了通过你的路由器和/从目标服务器的数据包。 你有没有尝试tcpdump或wireshark在你的任何行为不端的主机上看到实际到达/离开主机?
另一个要testing的可能是在你的一个linux主机上完全禁用iptables来进行testing。 虽然您没有在主机上configuration任何特殊的防火墙规则,但可能会出现一些错误的默认规则。