Como fazer com que as regras do iptables expirem?

18

Alguém me disse que isso é possível, mas não consigo encontrar nada no google ou nas páginas de manual.

Preciso banir IPs por um certo período de tempo e depois desbanquear automaticamente.

HappyDeveloper
fonte

Respostas:

18

Se você quer que o iptables remova completamente a regra por si só, não será capaz de fazê-lo, até onde eu sei. Qual é o objetivo disso? Se você precisar de algum tipo de banimento temporário automático, a solução padrão é fail2ban .

Como alternativa, você pode usar um trabalho cron para remover a regra que está adicionando ou, melhor ainda, se você quiser fazê-lo interativamente, um attrabalho:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Veja também o recentmódulo do iptables. Isso com sua --secondsopção pode ser útil, dependendo de suas necessidades reais. man iptablesPara maiores informações.

Eduardo Ivanec
fonte
oh uau, o trabalho 'at' parece ótimo. Posso combiná-lo com nohup e &? Quão?
HappyDeveloper 24/05
Não há necessidade de usar nohup - o trabalho at é executado independentemente do terminal que você usou para criá-lo. Isso significa que ele é executado em um shell que não herda suas variáveis ​​de ambiente, a propósito, e é /bin/shpor padrão. Mas isso provavelmente não será um problema neste caso.
Eduardo Ivanec 24/05
9

Coloque um comentário com um carimbo de data / hora (provavelmente segundos desde a época) nas regras. Varra periodicamente as regras expiradas.

Observe que o kernel Linux mais recente tem suporte para carregamento dinâmico de endereços IP em um cache consultado pelas regras do iptable, em vez de regras diretas do iptables.

Exemplo:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Você pode, é claro, em iptables -D INPUT $1vez de imprimir o comando.

Seth Robertson
fonte
boa ideia. Não tenho certeza de como fazer a parte de varrer, porém, estarei pensando ..
HappyDeveloper 24/11
+1 Muito boa ideia, talvez não seja a mais simples, mas definitivamente pura.
Kyle Smith #
11
@HappyDeveloper: Exemplo fornecido para adicionar / varrer
Seth Robertson
11
Haha Eu apenas tive que fazer isso bem, eu usei o awk para o meu limpeza: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'onde as regras são feitas como:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
Meus 2 centavos em perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo
5

O iptables possui um método para adicionar automaticamente endereços IP a uma lista se as condições definidas pelo usuário forem atendidas. Eu uso o seguinte para ajudar a evitar tentativas automatizadas de hack na minha porta ssh:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Isso ajuda a limitar as tentativas automatizadas de obter acesso ao servidor, limitando as tentativas de conexão do mesmo endereço IP a um a cada 60 segundos.

Se você deseja permitir um número definido de tentativas em um período de tempo, como 4 em 5 minutos, e em caso de falha, coloque-as na lista negra por um período mais longo, como 24 horas, faça algo como:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

No acima, criamos 2 cadeias; "ssh" e "black" e 2 listas; "timer" e "lista negra".

Resumidamente; a última corrente mostrada acima é a "entrada" para a corrente ssh.

  • A regra 1 na cadeia ssh verifica se o IP de origem está na lista "lista negra". Nesse caso, a conexão é interrompida e o timer da lista negra de 24 horas é reiniciado. Se a regra 1 for falsa, então vamos para a regra 2.
  • A regra 2 na cadeia ssh verifica se o IP de origem fez mais de 4 tentativas de conexão em 5 minutos. Nesse caso, envia o pacote para a cadeia "black", onde é adicionado à lista "blacklist". A cadeia "preta" então diminui a conexão, e terminamos.
  • A regra 3 na cadeia "ssh" será alcançada apenas se as regras 1 e 2 forem falsas. Nesse caso, o pacote é ACEITO e o IP de origem é adicionado à lista "timer" para que possamos monitorar a frequência de tentativas de conexão.

A opção "--reap" informa ao kernel para pesquisar na lista e limpar quaisquer itens anteriores ao limite de tempo definido; 5 minutos para a lista "cronômetro" e 24 horas para a lista "lista negra".

nota: os espaços extras são para facilitar a leitura e são opcionais no seu script de shell.

Glen
fonte
3

O IPTables possui um recurso feito expressamente para isso: Conjunto de IPs. Você faz a regra uma vez e ela persiste como de costume, mas verifica se há um conjunto de ips (ou portas). O legal é que esse conjunto pode ser atualizado de forma dinâmica e eficiente sem perturbar o restante do firewall.

O site principal , exemplos .

Portanto, para usá-lo, você ainda precisará usar atou cronagendar a remoção.

Allen
fonte
2

Você pode usar o fail2ban para banir endereços IP e configurar por quanto tempo um endereço será banido.

user9517 suporta GoFundMonica
fonte
2

Como alguém já disse: Você deve usar o ipset para esse recurso.

O ipset pode adicionar um endereço IP com o valor do tempo limite. Quando o tempo limite termina, o registro é removido automaticamente do ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Essa é a maneira preferível de controlar esse comportamento.

Navern
fonte
0

Preciso banir IPs por um certo período de tempo e depois desbanquear automaticamente.

Você pode tentar o seguinte

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
fonte
0

Dependendo do que exatamente você deseja realizar, os módulos netfilter recente ou de hora podem ser usados ​​para fazer isso.

Ambos estão documentados na página de manual do iptables .

TimS
fonte