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.
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.
Respostas:
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 at
trabalho:
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 recent
módulo do iptables. Isso com sua --seconds
opção pode ser útil, dependendo de suas necessidades reais. man iptables
Para maiores informações.
/bin/sh
por padrão. Mas isso provavelmente não será um problema neste caso.
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 $1
vez de imprimir o comando.
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"
iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
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 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.
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.
Portanto, para usá-lo, você ainda precisará usar at
ou cron
agendar a remoção.
Você pode usar o fail2ban para banir endereços IP e configurar por quanto tempo um endereço será banido.
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.
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 .