Tutorial Linux - comando iptables

O iptables é um sistema de filtro de pacotes (firewall) podendo ser usado também para redirecionar pacotes, mascarar conexões e fazer NAT (Network Address Translation). O iptables já vem instalado na maioria das distribuições Linux.





Mostrar todas as regras atuais do iptables

Para listar todas as regras que estão ativas no firewall iptables use o parâmetro "-L". Esse comando vai mostrar as regras ativas para todas as chains (cadeias) do iptables. A chain INPUT armazena todas as regras onde o destino da conexão é o próprio computador ou servidor que o iptables esta instalado. A chain FORWARD serve para filtrar as conexões que passam pelo servidor, como no caso de um servidor proxy. A chain OUTPUT filtra as regras que tem como origem o próprio servidor.

iptables -L

Mostrar todas as regras atuais sem resolução de DNS

Quando você usa o iptables para bloquear endereços como facebook.com, no momento de listar as regras o comando iptables pode ficar lento devido a resolução de DNS ( que vai transformar o endereço ip como 69.171.230.68 em um nome como facebook.com. Usando o parâmetro "-n" o iptables vai mostrar apenas o ip, ao invés do nome.

iptables -L -n

Mostra o número de pacotes que passaram ou foram filtrados por cada regra.

O parâmetro "-v" é interessante para ser usado para ver se as regras realmente estão sendo usadas e funcionando, mostrando o número de pacotes filtrados/bloqueados por cada uma das regras.

iptables -L -n -v

Mostra as regras da chain INPUT

Como dito anteriormente, a chain INPUT armazena todas as regras onde o destino da conexão é o próprio computador ou servidor que o iptables está instalado. Para ver todas as regras apenas da chain INPUT, digite:

iptables -L INPUT -n

Deletar todas as regras (de todas as chains)

Para apagar todas as regras do iptables, de todas suas cadeias, use o parâmetro "-F", conforme abaixo:

iptables -F

Alterar a política padrão da chain INPUT para DROP

Além das regras individuais de cada uma das cadeias do iptables, é possivel definir uma regra padrão para uma cadeia. No caso abaixo, definimos como "DROP", isto é, descartar todos os pacotes que não estiverem liberados por outras regras. Nesse caso, devemos criar varias regras permitindo as conexões que achamos seguras como http, smtp, ftp e automaticamente, as regras que não estiverem liberadas, estarão automaticamente bloqueadas devido a política padrão ser "DROP". Para tal use o parâmetro "-P" .

iptables -P INPUT DROP

Alterar a política padrão da chain FORWARD para DROP

Neste outro exemplo, a cadeia FORWARD tem sua regra padrão alterada para ACCEPT, isto é, todos os pacotes que não forem bloqueados por alguma regra especificada na cadeia FORWARD, automaticamente será aceito.

iptables -P FORWARD ACCEPT

Alterar a política padrão da chain OUTPUT para ACCEPT

O mesmo pode ser feito para a chain OUTPUT para liberar todos os pacotes por padrão, com exceção dos que estiverem definidos em alguma regra da própria cadeia.

iptables -P OUTPUT ACCEPT

Bloquear um endereço ip de origem

Para bloquear um ip especificando sua origem e que o destino seja o próprio servidor ( por isso colocamos a regra na chain INPUT), usamos o parâmetro "-s" de "source" (origem em inglês).

iptables -A INPUT -s 192.168.0.123 -j DROP

Bloquear um endereço ip de destino

Para bloquear um ip especificando seu destino, usamos o parâmetro "-d" de "destination" (destino em inglês), conforme abaixo. Neste caso, colocamos a regra na chain FORWARD, pois como o destino é outra maquina, que não o próprio servidor do iptables, pois o pacote só passa pelo firewall, mas não é destinado a ele.

iptables -A FORWARD -d 192.168.0.10 -j DROP

Aceitar pacotes de ping (protocolo icmp)

Para aceitar os pacotes de ping destinado ao próprio servidor, usamos o parâmetro "-p" (protocol) especificando o protocolo icmp para bloqueio.

iptables -A INPUT -p icmp -j ACCEPT

Bloquear pacotes com destino a porta 80 (http)

Para bloquear pacotes com destino a porta 80 use o parâmetro "--dport" (destination port, que significa porta de destino em inglês).

iptables -A INPUT --dport 80 -j DROP

Bloquear um protocolo especifico (no caso upd)

Para bloquear todos os pacotes upd com destino ao servidor do iptables use o parâmetro "-p" seguido do protocolo para bloquear, no caso, "udp".

iptables -A INPUT -p udp -j DROP

Bloquear uma interface de rede do servidor

É possivel também fazer o bloqueio direto na interface de rede do servidor, usando o parâmetro "-i" (interface), especificando o seu nome, no caso abaixo, eth1.

iptables -A INPUT -i eth1 -j DROP

Bloquear um mac address específico no iptables

É possivel bloquear um endereço mac address (endereço físco da placa de rede) usando o iptables, conforme abaixo.

iptables -A INPUT -m mac --mac-source 00:1F:DA:11:40:18 -j DROP

Bloquear uma faixa de portas

Caso queira bloquear toda um intervalo de portas basta especificar a porta inicial e final separadas pelo sinal de ":" . No caso abaixo, todas as portas de 6000 ate 6050 serão bloqueadas.

iptables -A INPUT -p tcp --dport 6000:6050 -j DROP

Bloquear uma faixa de ips

É possivel bloquear uma faixa de ips através do iptables. No exemplo abaixo todos os ips com o final 100 até 150 serão blqoueados.

iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.100-192.168.1.150 -j DROP

Gerar um log de todos os acessos ao servidor

Para salvar um log de todas as conexões ssh ao servidor basta especificar o protocolo como tcp, a porta 22 de conexão, e usar o parâmetro "-j" seguido da opção LOG. A opção --log-prefix vai adicionar uma string de texto em cada conexão que for salva no log (que vai ficar em /var/log/messages). Isso facilita a localização dos registros, bastando executar o comando "cat /var/log/messages | grep AcessoSSH" para ver todos os registros salvos no log.

iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "AcessoSSH: "