Como fazer um tempo limite de soquete TCP

20

Para simulações de catástrofes de rede em nosso ambiente de servidor, estamos procurando uma maneira de atingir intencionalmente o tempo limite de um soquete TCP. Existem maneiras simples de soquetes existentes? Além disso, um pequeno programa de caso de teste C seria uma vantagem.

Já tentamos derrubar interfaces de rede durante a leitura do buffer TCP e a leitura de recursos montados desconectados (samba).

O servidor de teste é o Ubuntu 12.04.4.

er453r
fonte

Respostas:

19

Para causar o tempo limite de uma conexão existente, você pode usar iptables. Apenas ative uma DROPregra na porta que você deseja desativar. Portanto, para simular um tempo limite para o servidor Samaba, enquanto uma conexão ativa estiver ativa, execute o seguinte no servidor:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

O DROPdestino não responderá com um RSTpacote ou ICMPerro ao remetente do pacote. O cliente irá parar de receber pacotes do servidor e, eventualmente, atingir o tempo limite.

Dependendo de se / como você iptablesconfigurou, convém inserir a regra mais alto no INPUTconjunto de regras.

Angra
fonte
Tentei isso usando o netcat (para ouvir / enviar dados) e esperei uma eternidade ... sem tempo limite: / E posso confirmar que os dados foram descartados. Eu até mudei /proc/sys/net/ipv4/tcp_keepalive_timepara um número muito pequeno
er453r
@ er453r tente ativar a saída detalhada ncat -vpara ver o que exatamente ncatestá fazendo. Demorou 2m7.291s em uma instalação baunilha do Ubuntu 12.04 até o tempo limite
Creek
certo - eu não estava enviando nada pelo soquete durante o primeiro teste. Eu finalmente dominado os tempos de espera e os descreveu em detalhes a seguir :)
er453r
16

A primeira resposta está correta, mas eu descobri como esses tempos limite funcionam, para que você possa observá-los e testá-los (não se esqueça de bloquear a porta!).

Existem 4 parâmetros de kernel mais interessantes que lidam com tempos limite de TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Agora existem 2 cenários:

  1. O soquete está aberto e tentando transmitir - então (se não houver resposta do outro lado), o sistema tenta novamente os tcp_retries2tempos. Com o valor padrão de desativações, leva mais de 2 minutos e o soquete expira.

  2. O soquete está aberto e ocioso - os limites de manutenção vital são interessantes. Com um sistema de tomada inativa irá esperartcp_keepalive_time segundos e, depois disso, tente tcp_keepalive_probesenviar um TCP KEEPALIVE em intervalos de tcp_keepalive_intvlsegundos. E somente depois disso tudo falha, o soquete expira.

er453r
fonte
1
Além disso, você pode monitorar este tempo limite utilizandonetstat -o
er453r