Como muitos devem saber o
iptables é um firewall muito poderoso, nos permitindo criar regras baseadas desde IP de origem/destino a regras complexas que analisem o estado da conexão etc.
Vou listar exemplos de uso de alguns módulos que possam vir a serem interessantes na hora de uma configuração de firewall iptables.
Sempre que desejamos usar um módulo devemos usar a opção " -m nome_modulo ".
MULTIPORT
Nos permite criar regras especificando várias portas.
- --dports = portas de destino
- --sports = portas de origem
- --ports = portas de origem ou destino
Ex.:
# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -m multiport -p tcp --dports 22,23 -j ACCEPT
Libera SSH e TELNET p/ 192.168.0.0/24 entrando pela eth0.
# iptables -A INPUT -i eth0 - 192.168.0.0/24 -m multiport -p udp --dports 53,67 -j ACCEPT
Libera DNS e DHCP p/ 192.168.0.0/24 entrando pela eth0.
IPRANGE
Nos permite utilizar intervalos de IPs.
- --src-range = range de origem
- --dst-range = range de destino
Ex.:
# iptables -A INPUT -i eth3 -m iprange --src-range 192.168.56.10-192.168.56.50 -j ACCEPT
Libera conexões vindo dos IPs 192.168.56.10 até o 192.168.56.50 entrando pela eth3.
CONNLIMIT
Limite de conexões simultâneas.
- --connlimit-upto = relaciona a regra caso o numero de conexões seja IGUAL ou MENOR ao valor definido
- --connlimit-above = relaciona a regra caso o numero de conexões seja MAIOR ou IGUAL ao valor definido
- --connlimit-mask = número de BITS DA MÁSCARA DE REDE quando usado para limitar toda uma rede
Ex.:
# iptables -A INPUT -i eth3 -s 192.168.56.0/24 -p tcp --dport 22 --syn -m connlimit --connlimit-upto 1 -j ACCEPT
Libera 1 única conexão por IP na porta 22 (SSH) através da eth3 com origem 192.168.56.0/24.
STRING
Analisa regras com base em palavras ou expressões contidas no payload do pacote.
- --string = expressão/palavra
- --icase = não diferencia letras maiúsculas de minúsculas
- --algo {bm|kmp} = tipo do algorítimo de análise de strings
Os parâmetros abaixo determinam em que parte do datagrama está a expressão que deseja buscar:
- --from = a partir de
- --to = até
Ex.:
# iptables -A INPUT -m string --string "youtube" --icase --from 0 --to 65535 --algo bm -j DROP
Analisa todo o pacote que contenha "youtube" entrando no firewall de qualquer origem em qualquer interface e o bloqueia.
Obs.: isso não é firewall de camada de 7 (aplicação), portanto não deve ser usado como tal...
TIME
Criar regras baseadas em dias, horas ou segundos.
- --timestart = hora inicial
- --timestop = hora final
- --weekdays = dias da semana. Valores possíveis: Mon, Tue, Wed, Thu, Fri, Sat, ou podem ser usados números dos respectivos dias da semana 1 a 7
- --monthdays = dias do mês. Valores possíveis de 1 a 31
Ex.:
# iptables -A INPUT -i eth3 -s 192.168.56.0/24 -p tcp --dport 22 -m time --timestart 14:00 --timestop 16:00 --weekdays 6,7 -j ACCEPT
Libera conexões vindo de eth3 com origem 192.168.56.0/24 nos dias de SÁBADO E DOMINGO entre as 14:00 e 16:00 horas com destino a porta 22(SSH).
STATE
Analisa o estado de conexão.
- --state {NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED}
Ex.:
# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Libera conexões estabelecidas e relacionadas.
# iptables -I INPUT -m state --state INVALID -j DROP
Bloqueia qualquer conexão com estado INVÁLIDO.
RECENT
Criar regras dinâmicas.
- -m recent
- --set = adiciona IP a lista
- --rsource = adiciona IP de origem a lista
- --rdest = adiciona IP de destino a lista
- --rcheck = checa se o IP esta na lista
- --update = semelhante ao "--rcheck" contudo ele atualiza o timestamp desse IP na lista
--seconds = o "--rcheck" ou "--update" analisa o conteúdo da lista e verifica se o IP incluso está dentro do tempo especificado, dessa forma o firewall decide qual a ação com "-j". Usado em conjunto com --rcheck ou --update
- --hitcount = o "--rcheck" ou "--update" analisa o conteúdo da lista e verifica a quantidade de pacotes recebidos para determinado IP e se é MAIOR ou IGUAL ao definido na regra. Usado em conjunto com --rcheck ou --update
Ex.:
Realizando PORT KNOCKING com módulo "recent":
Vamos supor que seu firewall está com política padrão na chain INPUT como DROP então...
# iptables -R INPUT 3 -p tcp --dport 22 -m recent --rcheck --name SSH_LIBERADO --seconds 10 -j ACCEPT
# iptables -R INPUT 4 -p tcp --dport 1234 -m recent --set --name SSH_LIBERADO
Libera conexão na porta 22 (SSH) caso o IP esteja na lista "SSH_LIBERADO" (primeira regra)... para isso precisamos enviar uma flag SYN na porta 1234 (segunda regra), então a partir daí o IP será incluído á lista SSH_LIBERADO e terá 10 segundos para conectar, caso contrário a porta será fechada novamente.
Obs.: com essa regra não precisamos liberar o SSH para todo mundo e o liberamos de forma dinâmica.
Bloqueio de PORT SCAN:
# iptables -I INPUT -m recent --update --hitcount 4 --name PORT_SCAN --seconds 600 -j DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -m recent --set --name PORT_SCAN
Toda conexão EXCETO as relacionadas às regras 2 e 3 entrarão na lista PORT_SCAN e caso determinado IP atinja a quantidade de pacotes recebidos defino na opção "--hitcount" e conste na lista PORT_SCAN, esse IP será bloqueado por 600 segundos.
Maiores informações "
man iptables" ou acessem: