Por que em máquinas linux, qualquer pacote não passa exceto icmp, mas passa corretamente no windows

4

Existe um cluster no proxmox. Em um cluster, tenha um roteador configurado para vm (pfsense). Na nossa net temos máquinas Windows e Linux.

Existe o problema: As máquinas Windows têm acesso à internet, mas as máquinas Linux não têm.

Todas as máquinas Linux se comportam da mesma maneira, envia uma solicitação e aguarda uma resposta, mas a resposta não volta. Eu verifiquei com wget, ssh e nslookup para servidores externos (8.8.8.8 exemplo) e ping. Tudo não funciona, exceto o ping. Pacotes ICMP vão corretamente, por isso me atrevo a sugerir que o problema com o TCP. Mas com todas as máquinas windows, tudo funciona corretamente.

Eu não criei regras especiais de filtro para Linux ou Windows.

Eu quebrei a cabeça, mas não consegui resolver este problema.

Linha de base:

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

E então, passei dois testes:

Teste 1. wget da máquina linux:

pacotes capturados do roteador:

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

pacotes capturados do meu servidor externo:

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

Teste 2. wget da máquina do Windows:

pacotes capturados do roteador:

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

pacotes capturados do meu servidor externo:

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    

Por favor me ajude, alguma idéia?

    
por kvaps 11.01.2014 / 20:11

4 respostas

1

Eu já vi um problema semelhante no passado. Acabou sendo devido a um problema com o descarregamento da soma de verificação. O SO convidado de virtualização descarregaria o checksum para o host de virtualização, que supostamente deveria transferi-lo para a interface de rede física.

Mas, no final, a soma de verificação nunca foi calculada e o pacote foi enviado pela rede sem uma soma de verificação válida. Na extremidade de recepção da conexão, o pacote seria descartado devido a uma soma de verificação inválida.

No host de virtualização e no convidado, você pode tentar procurar opções com qualquer um dos nomes a seguir e tentar desativá-los:

  • Descarregamento de soma de verificação UDP
  • Descarregamento de checksum do TCP
  • Transferência de fragmentação UDP
  • descarga de segmentação TCP
por 29.05.2014 / 12:42
1

questão interessante. Não parece um problema de firewall, caso contrário, o handshake TCP de 3 vias inicial não funcionaria. E apesar das retransmissões TCP, não parece ser um problema de MTU, já que os pacotes são bem pequenos e, novamente, você os vê em ambas as extremidades. Realmente parece que o servidor da Web simplesmente não está respondendo à solicitação GET.

As pesquisas de DNS estarão usando o UDP, e isso é outra coisa novamente. O que você vê em uma captura de pacotes tentando SSH? Além disso, e se você fizer telnet para a porta 80 do seu servidor externo e emitir uma solicitação GET manual:

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

Tente o acima para HTTP 1.0 e 1.1. Percebo que é uma diferença entre as solicitações GET nos limites de pacotes do Linux e do Windows. Não importa, mas vale a pena tentar.

    
por 26.04.2014 / 13:57
1

Depois de alguns meses de trabalho, eu converti o driver da placa de rede na máquina windows para o virtio e o problema apareceu também na máquina windows. Isso é verdade, parece que o problema está conectado com incompatibilidade pessoal pfSense (ou freebsd) e virtio-drivers ou algum outro componente do proxmox .

Neste ponto, decidi ignorar esse problema:

  1. Cluster Proxmox conectado diretamente à Internet e configurado para roteador.
  2. Criada outra nova sub-rede entre proxmox e pfsense
  3. Para cada servidor, crie um segundo adaptador de rede nesta nova sub-rede e configure em cada proxmox como o gateway padrão.
  4. No cluster proxmox, criou uma regra que precisa encaminhar algumas portas para esses servidores e todo o tráfego externo para o pfsense.

Como resultado, recebi o seguinte:

  • Todos os computadores clientes da minha rede podem acessar a Internet por meio de pfSense, e use os serviços do pfsense (proxy-server, logging, etc.)
  • Todos os servidores no cluster proxmox têm acesso direto à Internet através do cluster proxmox
  • Como um bom bônus, no caso de o pfSense estar inativo, ainda posso acessar o cluster Proxmox via SSH

Obrigado a todos!

    
por 29.05.2014 / 12:12
0

Infelizmente, não posso comentar ainda :-(
Tanto quanto eu entendi você olhou para os pacotes passando por seu roteador e de / para o servidor de destino. Você já tentou tcpdump ou wireshark em qualquer um dos seus hosts linux se comportando mal para ver o que realmente chega / deixa o host?
Outra coisa para testar pode ser desabilitar completamente o iptables em um dos seus hosts linux apenas para testes. Embora você não tenha configurado nenhuma regra de firewall especial nos hosts, pode haver uma chance de algumas regras padrão mal comportadas.

    
por 14.01.2014 / 10:48