Eu envio dados TCP entre hosts (a topologia é criada usando namespaces de rede e pares de veth). Para um host, salvo seus pacotes de entrada e saída no arquivo pcap usando NFLOG e tcpdump com os seguintes comandos executados no host:
# we turn off checksum offload:
sudo ethtool -K veth0 tx off sg off tso off ufo off
# we log packets with nflog:
sudo iptables -A OUTPUT -j NFLOG --nflog-group 17
sudo iptables -A INPUT -j NFLOG --nflog-group 17
# we write the packets:
sudo tcpdump -i nflog:17 -w mypcap.pcap
Portanto, para todos os pacotes TCP de saída com Len zero , a soma de verificação está sempre errada. Isso é verdadeiro para todos os hosts na topologia para tráfego de saída . Para o tráfego de entrada não existe esse problema. Isso ocorre porque, como verifiquei (capturando regularmente com tcpdump na interface do host em vez de no NFLOG), quando o tráfego de saída está saindo da interface do host, a soma de verificação já está corrigida.
Pcap no remetente (11.0.0.5), capturado com NLOG:
Pcap no remetente (11.0.0.5), capturado regularmente na interface do remetente:
Pcap no receptor (11.0.0.1), capturado com NLOG:
Pcap no receptor (11.0.0.1), capturado regularmente na interface do receptor:
Então, como você pode ver nas imagens acima, para pcaps capturados do iptables NFLOG, para todos os pcakets TCP de saída que possuem Len igual a zero, o checksum TCP está errado. Qual pode ser a razão?
Obrigado pela atenção!
Encontrei a solução para o problema. É possível usar o iptables NFQUEUE ao invés do NFLOG. Além de resolver o problema com checksums TCP, a vantagem deste método também é que os pacotes são capturados sem o cabeçalho Link-Layer “Linux Netfilter NFLOG”, ou seja, os pacotes no arquivo pcap resultante são apenas pacotes raw-ip.
Eu estava procurando a solução por muito tempo para resolver este problema: Tc qdisc delay not visto na gravação do tcpdump . Primeiro, a solução parecia muito boa para mim: sem cabeçalhos Link-Layer que tornavam os arquivos de despejo menores, problema de soma de verificação TCP curado. Mas descobriu-se que com grandes taxas de envio (3 Gbps quando nenhuma taxa/atraso netem está instalada em links de pares de veth da topologia) apenas metade de todo o tráfego é registrado. Ou seja, se eu gravar o tráfego de entrada e saída no remetente capturando pacotes na interface eu recebo, por exemplo, dump de 1,7 Gigabytes, enquanto se eu gravar o tráfego de captura de iptables do kernel o dump é de cerca de 900 Megabytes. Este problema com a taxa de envio sendo limitada acontece tanto para soluções NFLOG quanto NFQUEUE.