Como redefinir uma conexão TCP imediatamente em ambas as extremidades em uma determinada condição usando linux netfilter/iptables?

Como redefinir uma conexão TCP imediatamente em ambas as extremidades em uma determinada condição usando linux netfilter/iptables?

Prezada comunidade Serverfault,

Tenho o seguinte problema: preciso redefinir (desconectar) conexões TCP em ambos os lados da rede imediatamente se uma determinada string for encontrada nos dados do pacote. Não tenho controle sobre os aplicativos em ambos os lados e só posso usar linux iptables (ou ferramentas similares) para abortar a conexão.

Minha primeira ideia foi usar a seguinte regra do iptables para conseguir o que procurava:

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset

Isso funciona perfeitamente no lado remoto, enviando um pacote TCP RST ao cliente que será desconectado imediatamente. Infelizmente, o lado local não será notificado sobre a desconexão forçada e o processo do servidor (conexão) travará para sempre.

Achei que o requisito de desconectar imediatamente uma conexão já estabelecida em ambos os lados em uma determinada condição (neste caso, uma correspondência de string em um pacote IP) não é muito incomum. Então fiz uma pesquisa no Google, mas para minha surpresa não consegui encontrar nada que pudesse ser usado em um período de tempo razoável.

Existe uma maneira de conseguir uma desconexão TCP em ambos os lados da rede usando iptables? Caso contrário, que outras ferramentas eu poderia usar (lembre-se de que não tenho controle sobre os aplicativos cliente/servidor)?

Muito obrigado antecipadamente por suas valiosas respostas!

Atenciosamente,

Jens

Responder1

Você pode usarxt_RESET, por exemplo,-j RESET

Responder2

Você pode configurar seu aplicativo para ter um tempo limite.

Outra solução é configurar o TCP KeepAlive e fazer verificações mais frequentes, a cada 10 min.

Alguns aplicativos implementam um KeepAlive no nível do aplicativo. Por exemplo, SSH, apache.

Quando o keep alive for enviado e a conexão for fechada no terminal remoto, você receberá um RST, do terminal remoto.

Os firewalls statefull esquecerão a conexão após um período de inatividade. Isso significa que você pode obter pacotes descartados e conexões semiabertas quando não tiver tráfego por um tempo (30min ou 1h).

Acho que é melhor perguntar sobre o problema específico que você está tentando resolver do que sobre a solução específica que você está tentando implementar.

Responder3

Infelizmente, o lado local não será notificado sobre a desconexão forçada

Deveria ser, um tcp-reset significa que o cliente deve ser informado de que a conexão está sendo fechada. Se o seu cliente estiver travado quando a redefinição for enviada, isso significa que ele não está lidando adequadamente com a redefinição enviada de volta do seu host executando o IPTables. A menos que você tenha um meio de resolver esse problema, não consigo pensar em nenhuma maneira de conseguir isso.

informação relacionada