Estou usando a seguinte regra do iptables:
iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH,ACK -m length --length 52 -m state --state ESTABLISHED -j DROP
Ele funciona bloqueando pacotes indesejados do meu servidor, mas também bloqueia coisas que não deveriam.
Aqui estão os pacotes capturados com wireshark:
unwanted packet:source=192.168.0.100 destination=192.168.0.111 TCP lenght=66 [TCP Retransmission] 62401→38111 [PSH, ACK] Seq=15 Ack=19 Win=65536 Len=12
needed packet:source=192.168.0.100 destination=192.168.0.111 TCP lenght=66 [TCP Retransmission] 62433→38111 [PSH, ACK] Seq=344 Ack=37855 Win=62825 Len=12
Minha pergunta é como modificar a regra para permitir o pacote necessário e bloquear o indesejado.
Responder1
Você não pode fazer isso na camada do firewall (bem, você pode - mas não realizará o que você pensa, nem o que deseja). O segundo pacote (que você deseja) faz parte do mesmo fluxo TCP do primeiro pacote (que você não deseja) e o TCP é um mecanismo de entrega confiável. Isso significa que o sistema operacional sabe se um pacote no meio do fluxo desapareceu (em virtude do número de sequência no cabeçalho de cada pacote, veja, por exemplo,http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structurePara maiores informações).
Se você filtrar um pacote no meio de um fluxo, o kernel simplesmente continuará informando a outra extremidade que um pacote está faltando, e a outra extremidade continuará retransmitindo-o (comportamento que você já está vendo, observe os [TCP Retransmission]
marcadores acima). Se você continuar a bloquear essas retransmissões, o stream ficará dessincronizado, a conexão será interrompida e nada no stream será processado.
Você terá que fazer isso na camada de aplicação.
Editaruma troca de comentários entre nós dois (muitos dos quais já foram excluídos) deixou claro que a pergunta pode não conter todos os detalhes que deveria. Recomendo que você feche esta pergunta - aceite minha resposta ou exclua a pergunta inteira - e escreva uma nova onde descreva com detalhes consideráveis o que exatamente acontece agora, como acontece e o que você deseja alcançar.
Tudo o que posso dizer agora, com alguma confiança, é quevocê não pode usar iptables
para cortar um único pacote do meio de um fluxo TCP e esperar que o restante desse fluxo seja processado corretamente pelo aplicativo receptor.