Firewall Linux - iptables - Parte 3


Comandos, opções e módulos

Comandos:
Toda regra iptables tem obrigatoriamente um comando e opcionalmente um ou mais parâmetros.

Comandos (são sempre em letras maiúsculas). A maioria dos comandos exige o nome de uma chain, em outros isso é opcional, e finalmente para alguns utiliza-se apenas o comando em si.

Observação: dados entre chaves ( [xxx] ) especificam um valor opcional. Dados entre sinais de maior e menor ( <xxx> ) especificam um valor obrigatório. Acostume-se com esse padrão, pois ele é utilizado nas páginas de manual.


-A <chain>: Acrescenta uma regra ao final de uma chain.

-I <chain> [posição]: Insere uma regra em uma posição específica da chain. Caso a posição não seja informada, a regra será criada na posição 1.

-D <chain> [posição]: Deleta uma regra em uma chain. Existem duas formas de deleção: Repetindo o comando de inserção e trocando o -A/-I por -D ou deletando pelo número da regra na chain. Ex: "iptables -D INPUT 1" apaga a primeira regra da chain INPUT da tabela filter.

-L [chain]: Lista as regras. Se for informada uma chain específica, é listada apenas as regras daquela chain. Caso contrário, todas as chains são listadas. Para listar o número (ou posição) da regra dentro da chain, acrescente a opção "--line-numbers". Esse número é utilizado como referencia para as opções -I, -D e -R

-R <chain> <posição>: permite trocar uma regra com uma já existente na posição informada. Informa-se a regra atual através do nome da chain em que ela se encontra e sua posição dentro da chain (obtida com -L CHAIN --line-numbers) e a nova definição da regra.

-F <chain>: Esvazia a chain informada (apaga todas as suas regras). Caso não seja informada uma chain, todas as chains da tabela são esvaziadas.

-N <nova_chain>: Cria uma nova chain. Deve ser informado um nome que ainda não esteja em uso.

-X <nome_chain>: Apaga uma chain criada pelo usuário (com o comando -N). A chain precisa estar vazia e não ser referenciada por nenhuma regra.

-Z [chain]: Zera os contadores de pacotes e bytes de todas as chains, apenas da chain informada ou apenas de uma regra específica (informada pelo número) dentro de uma chain. Caso seja utilizado junto com -L o contador é zerado e exibido em seguida.

-P <chain> <política>: altera a política (POLICY) padrão de uma chain.

-E <nome_atual> <nome_novo>: renomeia uma chain criada com o comando -N

Opções/parametros:
Observações:
  • De um modo geral, a ordem das opções não importa. No entanto, é comum escrever os comandos no formato dos exemplos desse artigo, pois facilita a leitura e compreensão da regra.
  • Regras que não contém a opção "-j" não fazem nada com um pacote que combine com suas opções, mas contabilizam a sua passagem e podem servir para contabilidade de dados (geração de gráficos e relatórios, por exemplo).
  • As opções -i, -o, -s, -d, --dport, e --sport (e possivelmente outras, confira a página de manual!) podem ser precedidas de um sinal de exclamação (!), que inverte seu significado.
Sempre que um pacote combina com uma regra que define uma ação (opção "-j"), seu processamento é interrompido na chain atual. A excessão é a ação LOG, que faz com que o pacote seja logado nos logs do firewall (via syslog) e continua para ser processado.

-t <tabela> : Especifica em qual tabela (filter, nat ou mangle) o comando (que pode ser de criação/edição/exclusão/listagem de regras ou chains) será executado. Caso essa opção não seja informada, o comando é executado na tabela filter

Ex:

iptables -t nat -A PREROUTING ... # Cria uma regra na chain PREROUTING da tabela nat

iptables -t filter -A FORWARD ... # Cria uma regra na chain FORWARD da tabela FILTER

iptables -A FORWARD ...           # Faz a mesma coisa que a regra anterior, observe para a tabela filter o "-t filter" é opcional.

iptables -t nat -L  ...           # Visualiza as regras em todas as chains da tabela nat



-n : não resolve endereços IP para nomes, acelerando a exibição dos dados na tela. Normalmente utilizado com o comando -L.

-v : modo verboso, aumenta a exibição de detalhes. Normalmente utilizado com o comando -L.

-x : não utiliza letras (abreviações) na contagem de bytes e pacotes. Normalmente utilizado com o comando -L.

Ex:
observe a saída do seguinte comando, primeiro sem a opção -x:

root:~ # iptables -nvL FORWARD | head -1

Chain FORWARD (policy DROP 6752K packets, 407M bytes)

root:~ # iptables -nvxL FORWARD | head -1

Chain FORWARD (policy DROP 6745998 packets, 407067635 bytes)

A contagem de bytes é a mesma, mas a saída sem -x é mais fácil de visualizar. Por outro lado, utilizando-se o -x facilita a criação de scripts para contabilidade de pacotes.

-p : permite especificar o protocolo desejado. O protocolo pode ser citado pelo nome ou pelo número. Veja a relação de nomes e números de protocolos no arquivo /etc/protocols. Para criar uma regra que bata com qualquer protocolo, coloque "all".

Ex:

iptables -A FORWARD -p udp ...            # Cria uma regra utilizando o protocolo UDP na chain FORWARD da tabela filter

iptables -t nat -A PREROUTING -p tcp ...  # Cria uma regra utilizando o protocolo TCP na chain PREROUTING da tabela nat

iptables -t nat -A POSTROUTING -p all ... # Cria uma regra combinando com qualquer protocolo na chain POSTROUTING da tabela nat

Observação:


  • Ao utilizar "-p all", não se informa número de portas de origem/destino, porque nem todo protocolo utiliza o conceito de porta.
  • Procure evitar ao máximo o uso indiscriminado de "-p all", pois acaba tornando seu firewall permissivo demais. Quando você não souber quais portas/endereços precisa liberar para que determinado serviço funcione, faça uma análise do tráfego com um analisador como o tcpdump (modo texto) ou o wireshark (modo gráfico).
  • -s : permite especificar o endereço IP de origem. Se o valor for o endereço de um equipamento, basta colocar o endereço IP. Caso seja o endereço de uma rede, é necessário informar também a máscara de rede.  Para especificar uma regra que bata com qualquer valor no endereço de origem, coloque 0/0. Para especificar uma regra que não bata com determinado endereço de origem, utilize a exclamação (!).

Ex:
iptables -A FORWARD -p udp -s 192.168.1.0/255.255.255.0 # Tabela filter, chain FORWARD, protocolo UDP, toda a rede 192.168.1.0 ...

iptables -A FORWARD -p udp -s 192.168.1.0/24            # Outra maneira de escrever a regra anterior

iptables -t nat -A  PREROUTING -p tcp -s 192.168.1.213

iptables -A FORWARD -p tcp -s !192.168.5.220 ... # essa regra bate com qualquer endereço de origem, exceto o 192.168.5.220.

-d : Semelhante ao -s, porém especifica o endereço IP de destino.

Ex:

iptables -A FORWARD -p udp -d 192.168.1.0/255.255.255.0 # Tabela filter, chain FORWARD, protocolo UDP, toda a rede 192.168.1.0 ...

--sport : permite especificar a porta (tcp/udp) de origem.

Ex:

iptables -A FORWARD -p udp -d 192.168.1.0/24 --sport 25 ...

iptables -A FORWARD -p tcp -s 192.168.1.23 --sport 25 ...


--dport : permite especificar a porta (tcp/udp) de destino.

iptables -A FORWARD -p udp -d 192.168.1.0/24 --dport 25 ...

iptables -A FORWARD -p tcp -s 192.168.1.23 --dport 25 ...


-i : define a interface de rede por onde o pacote vai entrar.

Obs: só pode ser utiliza em chains relativas a entrada de pacotes na máquina, como INPUT, PREROUTING e FORWARD.

-o : define a interface de rede por onde o pacote vai sair.

Obs: só pode ser utiliza em chains relativas a saída de pacotes da máquina, como OUTPUT, POSTROUTING e FORWARD.

-j : Especifica para o TARGET (alvo) da regra, ou seja o que vai ser feito com o pacote que combine com a regra definida.

-m : permite o uso dos "match modules", que são modulos que extendem as funcionalidades do iptables. O iptables costuma já vir com um conjunto de módulos pré-instalados, e é possível instalar mais módulos, recompilando o iptables E o kernel. Abaixo uma lista com os principais módulos. Para ver quais sua distribuição possui, bem como a forma de utilização, veja a página de manual do iptables (man iptables):


  • multiport: permite criar regras que combinam com mais de uma porta de origem ou destino. Nesse caso utiliza-se --sports ou --dports, respectivamente. As portas podem ser informadas no formato lista (por exemplo "--dports 22,23,25,110", que englobaria apenas para as portas citadas) ou no formato range (faixa de portas, "--sport 1:1023", que englobaria todas as portas entre 1 e 1023)
  • mac: analisa o endereço de hardware (MAC address) de origem do pacote. Apenas pode ser utilizado em CHAINS de entrada (INPUT, FORWARDING, PREROUTING, etc).
  • state: permite classificar a conexão quanto ao estado (NEW, INVALID, RELATED, ESTABLISHED, entre outros).
  • limit: permite criar regras que trabalham baseadas em quantidade X tempo (1 por segundo, 5 por minuto, etc).
  • iprange: permite informar um range de endereços IP de origem ou destino.
  • string: procura por uma string (texto) dentro do pacote.
  • time: cria regras com base na data/hora de chegada do pacote (a regra só é valida dentro do período de tempo especificado).
  • tos: analisa o campo TOS (Type Of Service) do cabeçalho IP (normalmente utilizado para QOS).
  • addrtype: analisa pacotes segundo o tipo (UNICAST, BROADCAST, LOCAL, etc).
  • ah: combina com pacotes AH (authentication header) do IPsec.
  • esp: combina com pacotes ESP do IPsec.
  • comment: permite inserir comentários de até 256 caracteres em uma regra.
  • connlimit: permite restringir a quantidade de conexões paralelas/simultâneas a um servidor por endereço IP ou range de endereços.

Nenhum comentário: