Envie TCP com checksums incorretos

2

Estou com problemas para enviar arquivos grandes para uma máquina OpenStack.

Nossa conexão com a Internet está acima do LTE, então pacotes ruins são esperados. No entanto, até mesmo enviar dados por TCP resulta em dados corrompidos ao enviar alguns MB.

Eu gostaria de testar se as somas de verificação TCP estão realmente sendo verificadas, então eu preciso de uma ferramenta para enviar pacotes TCP com somas de verificação inválidas.

Existem programas que me permitem enviar pacotes IP arbitrários, mas eu prefiro uma ferramenta que também inicia a conexão (executa o handshake de três vias, etc.) para mim.

Em seguida, posso usar tcpdump para verificar se o servidor confirma os pacotes ou solicita um reenvio. (Se a ferramenta pudesse fazer isso também, melhor ainda.)

Alguns pensamentos e notas:

  • Eu tentei diferentes versões do Linux no cliente e no servidor.
  • Não temos mais pacotes corrompidos ao alternar para uma linha DSL (mais lenta).
  • Não temos pacotes corrompidos ao enviar para outro servidor a partir de um host diferente.
  • Eu tenho tcpdumps de uma transmissão TCP do cliente e do servidor, mas o host do OpenStack não quer vê-los, e é por isso que eu gostaria de descobrir se as somas de verificação são o problema e também ter um programa de teste para o host.
  • O servidor é uma instância em um ambiente OpenStack.
  • O recente erro de corrupção da soma de verificação veth TCP no kernel do Linux explicaria esse bug.

Quaisquer outras ideias para depurar isso também são bem-vindas.

    
por close2 10.03.2016 / 07:45

2 respostas

1

link

explica como fazer isso.

Aqui uma versão (abreviada):

Na máquina de recebimento, execute nc -l -p 12345

Na máquina de envio, execute (i=0; while true; do echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa $i; i=$((i+1)); sleep 1; done) | netcat IP_OF_RECEIVING_MACHINE 12345

Para corromper os pacotes, execute o seguinte comando na máquina emissora:

sudo tc qdisc add dev eth0 root netem corrupt 100%; sleep 10; sudo tc qdisc del dev eth0 root netem

Note que durante 10 segundos todos os pacotes no eth0 serão corrompidos!

Se o checksum funcionar corretamente, você não receberá nenhum texto durante os 10 segundos e, em seguida, os receberá de uma só vez. Se, no entanto, a soma de verificação não funcionar, você receberá um texto corrompido.

    
por 19.04.2016 / 15:18
0
  • Você pode usar uma ferramenta de elaboração de pacotes , como hping, hping3. Confira o link abaixo, é muito útil;

    exemplos de hping3

    No link acima, acho que é isso que você está pesquisando;

    -b --badcksum (try to) send packets with a bad IP checksum many systems will fix the IP checksum sending the packet so you'll get bad UDP/TCP checksum instead.

  • Se você tem habilidades de programação (programação de socket, sockets BSD no linux, você pode google-los), você pode enviar pacotes tcp fictícios usando sockets raw , construir seu próprio pacote de camada de transporte .

por 31.03.2016 / 10:03