Como alguém fecha todas as conexões TCP _existentes_ em algumas portas usando o IPTables?

3

Digamos que eu tenha um teste rápido de partição de rede que gostaria de executar, como desconexão duas metades de um cluster Redis do outro , e eu quero usar o iptables para desligar temporariamente um grupo de servidores de outro grupo.

Isso é muito semelhante à pergunta feita na lista de discussão do fedora:

link

Se eu não vejo um EXISTING,RELATED na saída de iptables --list , eu tenho que me preocupar com isso?

A seguinte resposta na lista de discussão do fedora parece dizer que sim, as conexões existentes serão fechadas se eu não vir um EXISTING,RELATED na saída de iptables --list .

link

Uma nota para os sinalizadores reflexivos, lá fora: Esta questão e, mais importante, suas respostas, discutiriam se o IPTables descarta conexões existentes em atualizações de suas regras.

Até onde eu sei, outras perguntas neste site, sobre esse assunto, não abordam as diferenças entre as conexões existentes e as tentativas de conexão:

Como para fechar certas portas TCP / UDP (entrada) para todas as redes, exceto listadas através de IPTABLES

Encontrei a maioria dos meus resultados de pesquisa na pesquisa do Google na página, no seguinte link de URL:

link

    
por Nathan Basanese 23.06.2016 / 02:05

1 resposta

5

Nenhuma regra iptables jamais encerrará uma conexão TCP existente, pois isso envolve transmitir ativamente uma mensagem com o bit FIN . Isso é feito pelo aplicativo e não por um filtro de pacotes.

Por outro lado, o iptables pode, a qualquer momento, impedir que seu aplicativo receba ou transmita novos pacotes através de qualquer conexão existente e também pode impedir que novas conexões sejam estabelecidas.

Isto é, independentemente de você ter um firewall com estado ou não.

Tudo depende de onde exatamente você insere suas novas regras de firewall. Como, lembre-se, suas regras de firewall são verificadas na ordem em que estão listadas e o processamento será interrompido na primeira correspondência de dispositivos.

Ou seja. um firewall simples com estado:

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
                     #1  < INSERT NEW RULE HERE
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
                     #2  < INSERT NEW RULE HERE
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
                     #3  < INSERT NEW RULE HERE
-A INPUT -j REJECT --reject-with icmp-host-prohibited
                     #4  < iptables -A WILL APPEND NEW RULE HERE
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Agora, se você quiser uma nova regra:

INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

e insira na posição # 1 todos os pacotes recebidos daquele host serão bloqueados.

Insira essa regra na posição # 2 e os pacotes nas conexões existentes ainda serão permitidos, mas nenhuma conexão nova poderá ser estabelecida.

Inserir essa nova regra em particular na posição # 3 é inútil, já que o efeito é o mesmo que não ter política específica para 10.0.0.89, mas esse seria o lugar certo para colocar uma regra para conceder acesso a 10.0. 0,89 para portas adicionais.

E usar a regra iptables -A INPUT para anexar uma nova à cadeia INPUT é inútil, pois colocará a regra na posição # 4, onde todo o tráfego já foi rejeitado pela regra INPUT -j REJECT --reject-with icmp-host-prohibited .

Resumindo: use a opção de número de regra em iptables -I (em vez de ipatbles -A ) para colocar a nova regra (temporária) onde terá o efeito desejado:

sudo iptables -I <rule number> INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

Se, com a mesma configuração de firewall com monitoração de estado, você quiser parar de permitir o HTTP simples, poderá Excluir a regra que permite o tráfego para a porta 80

sudo iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

mas isso não irá esvaziar a tabela de estado da sessão usada pelo iptables e as conexões existentes com a porta 80 ainda serão permitidas pela regra -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Você pode resolver isso simplesmente parando / reiniciando o servidor da Web, que fechará adequadamente as sessões abertas enviando mensagens FIN e limpando-as da tabela de estado da sessão.

Como alternativa, você pode adicionar pacotes de bloqueio de regras à porta 80 na posição # 1.

    
por 23.06.2016 / 07:49