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.

Comprimindo os Logs do JBOSS sem logrotate

Administro alguns servidores JBOSS que realizam o rotacionamento de logs sozinhos, porém eles não fazem a compressão dos arquivos de log. Como o próprio JBOSS cuida do rotacionamento, não encontrei um método de fazer o tratamento através do logrotate, como é feito normalmente. Ao invés disso, optei simplesmente por comprimir os arquivos.

Crie um arquivo com um nome sugestivo (ex: comprime_logs_jboss) dentro do diretório "/etc/cron.daily" com o seguinte conteúdo:


#!/bin/bash
#Fabiano Pires
#Caminho com os arquivos de log do JBOSS
CAMINHO="/opt/jboss-GA/server/default/log"

# Comprime arquivos server.log.*, exceto os que possuem a extensao ".gz"
find ${CAMINHO} \( -name 'server.log.*' -a -not -name '*.gz' \) | xargs gzip -9

Esse comando find enconrtra todos os arquivos server.log rotacionados (os meus ficam no padrão server.log.ANO-MES-DIA (ex: server.log.2011-11-29), exceto os que possuem a extensão ".gz" (que já foram comprimidos) e os envia para compressão com o comando gzip.

Ajuste a variável CAMINHO para apontar para o local onde ficam os arquivos de log do seu JBOSS. E não se esqueça de tornar o arquivo executável, com o comando chmod a+x comprime_logs_jboss.

Sistemas de arquivo em Linux embarcado

O Sérgio Prado publicou em seu site (http://sergioprado.org) dois artigos sobre sistemas de arquivos. Embora o artigo (assim como o próprio site) seja voltado para Sistemas Linux Embarcados, os artigos fazem uma boa cobertura sobre diversos sistemas de arquivos, além de tratar sobre assuntos como journaling, memórias flash e mais. Vale a leitura tanto para o iniciante em Linux como para o administrador experiente.

Links:

Parte 1: http://sergioprado.org/2012/02/22/sistemas-de-arquivo-em-linux-embarcado-parte-1/
Parte 2: http://sergioprado.org/2012/03/04/sistemas-de-arquivo-em-linux-embarcado-parte-2/

P.S.: Não sabe o que é Linux Embarcado? Basicamente são computadores com processadores ARM (semelhantes aos dos celulares), porém pequenos em tamanho e consumo de energia. Normalmente são voltados para aplicações específicas. Para maiores informações, vale dar uma olhadinha nesses sites:

Mini2440 (US$ 90,00)
http://www.evertonfreitas.com/?p=60

BeagleBoard (US$ 130,00)
http://beagleboard.org/hardware

BifferBoard, uma placa com processador x86 (US$ 50,00)
http://bifferos.co.uk/

Raspberry Pi, do tamanho de um cartão de crédito (US$ 25,00 - Aceito um de presente ;-)  )
http://www.raspberrypi.org/

Firewall Linux - iptables - Parte 2


Conceitos: Tabelas, Chains, Targets e Política Padrão.

Tabelas:
No iptables, o tratamento dos pacotes é realizado em tabelas. Cada tabela realiza basicamente um tipo operação nos pacotes, conforme vemos a seguir:

1) Tabela filter: Filtragem de pacotes (quem pode acessar o quê, e sob quais condições)
2) Tabela nat: Modificações nos endereços e/ou portas de origem e de destino dos pacotes.
3) Tabela mangle: Alterações avançadas no pacote: inserção de marcas (tags), alteração da prioridade do pacote na "fila" de envio da placa de rede, etc (não vai ser coberta aqui.)

Chains (cadeias, no sentido de correntes ou fluxos):
São contêineres para as regras. O iptables vem com um grupo padrão de chains em cada tabela, e os usuários podem criar chains adicionais, para facilitar a gerência das regras. As chains padrão são (nem todas as tabelas possuem todas as chains):

INPUT: trata os pacotes que estão entrando na máquina e não vão sair, ou seja, o destino final do pacote é a própria máquina firewall.

OUTPUT: trata dos pacotes que foram criados na própria máquina e vão sair dela.

FORWARD: trata os pacotes que atravessam a máquina (entram por uma placa de rede e saem por outra. Ex: pacotes com origem na rede local com destino à Internet ou vice-versa).

PREROUTING: trata os pacotes antes (PRE) da decisão de roteamento (ROUTING). É utilizada para alterar o DESTINO dos pacotes (DNAT) na tabela nat.

POSTROUTING: trata os pacotes após (POST) a decisão de roteamento (ROUTING). É utilizada para alterar a ORIGEM dos pacotes (SNAT) na tabela nat.

Observação: o nome das chains padrão sempre é em letras maiusculas.

Targets (ou alvos):
Define o que é feito com o pacote que combine com a regra. Alguns targets (os que fazem alterações nos pacotes) só podem ser utilizados na tabela NAT.

Observação: é possível a criação de regras sem target. Um pacote que combine com essas regras apenas incrementa a contagem de bytes e pacotes da regra (útil para contabilidade de pacotes.) Para visualizar a contagem de pacotes das

ACCEPT: Aceita os pacotes que batam com a descrição da regra

REJECT: Rejeita os pacotes que batam com a regra. É enviada uma mensagem de rejeição ao emissor do pacote.

DROP: Ignora os pacotes que batam com a regra. É semelhante ao REJECT, porém não é enviada nenhuma mensagem ao emissor.

RETURN: Cancela o processamento do pacote na chain atual e o envia de volta à chain onde estava anteriormente.

SNAT: Altera o campo de origem (source) do pacote IP, podendo alterar também a porta de origem.

DNAT: Altera o campo de destino (destination) do pacote IP, podendo alterar também a porta de destino.

REDIRECT: Faz um DNAT onde apenas a porta de destino pode ser escolhida. O endereço IP de destino sempre é o da própria máquina firewall. Utilizado para proxy tranparente.

MASQUERADE: Mascaramento de IP. Tipo especial de SNAT, utilizado principalmente para compartilhar conexões com IPs dinâmicos, como conexões dial-up (internet discada) e ADSL (Velox, por exemplo).

MARK: "Marca" o pacote com uma etiqueta, para processamento posterior (inclusive por outros programas que não o iptables). A "marca" existe apenas no próprio firewall (programas em outras máquinas não conseguem visualizar a marcação).

TCPMSS: Permite alterar o tamanho máximo do pacote, para solucionar (ou prevenir) problemas de transmissão de dados. Só pode ser utilizada com o protocolo TCP (opção -p tcp)

TOS: Permite alterar o campo TOS (Type Of Service) do cabeçalho IP.

QUEUE/NFQUEUE: Permite enviar o pacote para programas compilados com suporte a biblioteca libipq. Os programas podem manipular o pacote e devolvê-lo ao iptables.

LOG: Cria uma entrada de LOG do pacote que combina com a regra. A entrada é registrada através do SYSLOG. Após ser registrado no sistema de log, o pacote continua seguindo pela chain, para ser processado por outras regras.

ULOG: Uma mistura de QUEUE com LOG, onde o pacote é enviado para um programa para fins de LOG. Isso permite, por exemplo, logar pacotes em bancos de dados (como o MySQL) para facilitar a geração de relatórios.

Caso especial: nome de uma chain personalizada. Faz com que o pacote que bata com aquela regra seja redirecionado para uma chain personalizada (criada pelo usuário) para ser tratado pelas regras desta chain.

Policy (política padrão):
Por mais completas que sejam, suas regras de firewall nunca irão cobrir todas as possibilidades. Por isso, alteramos a POLICY (política padrão) da chain. Um pacote que atravesse toda uma CHAIN sem combinar com nenhuma REGRA é tratado pela POLICY padrão da chain. As POLICY são ACCEPT, REJECT e DROP, e têm o mesmo comportamento dos TARGETS definidos anteriormente. A POLICY padrão das CHAINS é ACCEPT (se um pacote não bater com nenhuma regra ele é aceito)  Normalmente, coloca-se a política padrão de chains como INPUT e FORWARD como DROP. Com isso, tudo o que não for explícitamente liberado será bloqueado.