Tenho a seguinte configuração: em/etc/iptables/rules.v4
# Generated by iptables-save v1.4.21 on Mon Jul 1 11:32:00 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3:620]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.35.107/32 -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -s 192.168.35.0/24 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.35.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j DROP
COMMIT
# Completed on Mon Jul 1 11:32:00 2019
de cima vemos que quero bloquear o ping de um IP específico. Depois de salvar as regras com iptables-restore < /etc/iptables/rules.v4
, e listar as regras com iptables -L
, posso concluir que o computador com ip 192.168.35.107 não consegue pingar o servidor.
No entanto, o computador com esse IP pode fazer ping indefinidamente até que eu interrompa a sessão. Mesmo depois de quebrar o ping, ainda preciso fazer uma pausa de ~ 60 segundos até que não consiga pingar novamente. Se eu fizer uma pausa de 5 a 10 segundos entre o comando ping, o firewall me deixará passar.
Curiosamente, quando habilito o ping pelo iptables, ele funciona imediatamente. Eu tentei com a porta Samba 445 também. Mesmo.
Existe uma maneira de tornar as portas descartadas do iptables imediatamente eficazes?
Você está enfrentando esse comportamento porque seu sistema tem o sistema de rastreamento de conexão do netfilter (a
nf_conntrack*
família de módulos) habilitado e sua--state RELATED,ESTABLISHED
regra (obviamente definida como ) é colocada antes da regraACCEPT
específica do ping .DROP
As
-m state
regras, assim como as regras mais refinadas-m conntrack
, contam com o sistema de rastreamento de conexão que também rastreia protocolos como UDP e ICMP, embora tecnicamente não sejam orientados a conexão. Ele rastreia esses protocolos criando uma entrada de "conexão" em sua lista com um tempo limite de expiração padrão. Esses valores padrão podem ser consultados e definidos por meio de arquivos específicos em/proc/sys/net/netfilter/
, normalmente aqueles denominadosnf_conntrack_*_timeout
.Sendo o ICMP um protocolo sem conexão, o sistema de rastreamento de conexão não tem como detectar quando qualquer "conexão" realmente terminou e, portanto, só pode contar com uma heurística orientada por tempo limite. Portanto, desde que haja uma entrada na lista de rastreamento de conexão que corresponda à "conversação" do icmp de ip de origem/ip de destino, qualquer
-m state --state ESTABLISHED
regra corresponderá a esse tráfego, no seu caso, aceitando-o de acordo com sua regra específica.O tempo limite de "~60 segundos" que você percebe deve ser de 30 segundos, pois geralmente é o valor padrão para
/proc/sys/net/netfilter/nf_conntrack_icmp_timeout
. No entanto, pode ter sido alterado apenasecho
inserindo um valor diferente nesse arquivo.Observe também que os valores nesses arquivos são para novas "conexões" a partir de então. Para ver as entradas atuais como conhecidas pelo sistema de rastreamento de conexão, juntamente com o tempo limite de expiração atual, você pode usar o
conntrack
comando, que pode ser necessário instalar. Usando esse comando, você também pode modificar ou excluir as entradas.A maneira mais simples é sempre colocar
DROP
as regras antes da-m state
regra ACCEPT.Uma alternativa pode ser: cada vez que você adicionar uma
DROP
regra, execute também umconntrack
comando respectivo para excluir as entradas ativas no momento.Isso acontece porque você ainda tem uma entrada na tabela de conexão para esse host, e o
iptables
utilitário não irá liberá-la ou mexer com ela de forma alguma ao adicionar ou remover suas regras.Para isso, você deve instalar o
conntrack(8)
utilitário, que pode ser usado para manipular a tabela de rastreamento de conexão ao vivo do kernel. Ele está usando uma interface de soquete netlink para isso, que oferece funcionalidades não disponíveis por/proc
ou outros meios.Por exemplo,
conntrack -F
limpará todas as conexões,conntrack -D --dst=8.8.8.8
excluirá todas as entradas com esse destino,conntrack -D --src=192.168.35.107
excluirá todas as entradas com essa origem etc.É facilmente instalável na maioria das distros com, por exemplo.
apt-get install conntrack
,yum install conntrack
, etc