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

6

Prezada comunidade do Serverfault,

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

Minha primeira ideia foi usar a seguinte regra do iptables para alcançar o que eu estava procurando:

/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 para o cliente, que, portanto, será desconectado imediatamente. Infelizmente, o lado local não será notificado após a desconexão forçada e o processo do servidor (conexão) será interrompido para sempre.

Eu achei que a exigência de desconectar imediatamente uma conexão já estabelecida em ambos os lados em uma determinada condição (uma correspondência de seqüência de caracteres em um pacote IP, neste caso) não é muito incomum. Então eu fiz uma pesquisa no Google, mas para minha surpresa não encontrei nada utilizável em um período de tempo razoável.

Existe uma maneira de obter uma desconexão de tcp nos dois lados da rede usando o iptables? Se não, que outras ferramentas eu poderia usar (tenha em mente que não tenho controle sobre os aplicativos cliente / servidor)?

Muito obrigado antecipadamente pelas suas valiosas respostas!

Atenciosamente,

Jens

    
por Jens Moser 13.09.2013 / 15:37

3 respostas

1

Você pode usar xt_RESET , por exemplo, -j RESET

    
por 10.05.2016 / 23:24
1

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

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

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

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

Firewalls com estado 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 você não tiver tráfego por um tempo (30min ou 1h).

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

    
por 07.12.2015 / 17:06
0

Unfortunately the local side will not be notified upon the forced disconnect

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

    
por 13.09.2013 / 15:50