Parece que encontrei o problema: eu precisava calcular a soma de verificação do cabeçalho IPv4 para os pacotes de entrada antes de gravá-los na interface TUN, já que os modifico.
Estou tunelando uma conexão TCP de saída através de uma interface TUN configurada por um programa que eu escrevi. A interface TUN basicamente retransmite os pacotes de / para um servidor proxy, com modificações mínimas (IP / porta de origem / destino, soma de verificação TCP).
Executando o wget em um IP roteado através desta interface TUN, os pacotes parecem ser enviados e recebidos corretamente (veja o rastreio), mas de alguma forma o SYN / ACK que retorna do servidor não se registra na pilha TCP, e o soquete permanece em um estado SYN_SENT em "netstat -t". Retransmissões espúrias são geradas infinitamente (até o tempo limite) em ambas as direções.
Aqui estão os comandos que uso para configurá-lo:
ip link set dev tun0 up
ip addr add 10.0.0.1/24 dev tun0
ip route add 216.58.197.100/32 dev tun0
seguido por
wget http://216.58.197.100
Aqui está o traço wireshark pcap aqui :
Parece que encontrei o problema: eu precisava calcular a soma de verificação do cabeçalho IPv4 para os pacotes de entrada antes de gravá-los na interface TUN, já que os modifico.
Tags networking vpn tcp tunneling