Product SiteDocumentation Site

14.2. Firewall ou Filtragem de pacotes

Um firewall é uma porta de filtragem da saida de rede e é efetiva apenas em pacotes que devem passar por isso. Portanto, só pode ser eficaz quando passar pelo firewall é a única rota para estes pacotes.
A falta de uma configuração padrão (e do lema "processo e não produto") explica a falta de uma solução chave. Há, no entanto, as ferramentas que tornam mais simples configurar os firewall netfilter, com uma representação gráfica das regras de filtragem. fwbuilder está, sem dúvida entre os melhores delas.
O kernel do Linux incorpora o firewall netfilter. Ele pode ser controlado a partir do espaço do usuário com os comandos iptables e ip6tables. A diferença entre estes dois comandos é que o primeiro atua sobre rede IPv4, enquanto que o último sobre o IPv6. Uma vez que ambas pilhas de protocolo de rede provavelmente estarão circulando por muitos anos, ambas as ferramentas serão utilizadas em paralelo.

14.2.1. Funcionamento do Netfilter

netfilter utiliza quatro tabelas distintas que armazenam regras que regulam três tipos de operações sobre pacotes:
  • filtro preocupa com as regras de filtragem (aceitando, recusando ou ignorando um pacote);
  • nat diz respeito a tradução de origem ou destino, endereços e portas de pacotes, observe que esta tabela existe apenas para IPv4;
  • mangle diz respeito a outras alterações nos pacotes IP (incluindo os TOS - Tipo de Serviço - campo e opções);
  • raw permite outras modificações manuais em pacotes antes de chegar ao sistema de rastreamento de conexões.
Cada tabela contém listas das chamadas regras cadeias. O firewall usa padrão para lidar com cadeias de pacotes com base em circunstâncias pré-definidas. O administrador pode criar outras cadeias, o que só será usado quando referido por uma das cadeias padrão.
A tabela filter (filtro) possui tres cadeias padrao:
  • INPUT (ENTRADA): preocupa se com os pacotes cujo destino é o proprio firewall;
  • OUTPUT (SAIDA): preocupa se com os pacotes emitidos pelo firewall;
  • FORWARD (PASSAR PARA FRENTE): preocupa se com os pacotes em trânsito através do firewall (que não é nem a sua origem nem o seu destino).
A tabela nat também tem três cadeias de padrão:
  • PREROUTING (PRE ROTEAMENTO): altera pacotes assim que eles chegam;
  • POSTROUTING (pos roteamento): altera pacotes quando eles estão prontos para partir ao seu caminho;
  • OUTPUT (SAÍDA): altera pacotes gerados pelo próprio firewall.
Como cadeias netfilter são chamadas

Figura 14.1. Como cadeias netfilter são chamadas

Cada cadeia é uma lista de regras, cada regra é um conjunto de condições e uma ação a ser executada quando as condições forem satisfeitas. Ao processar um pacote, o firewall examina a cadeia se for o caso, uma regra após a outra, quando as condições para uma regra estão reunidas, "pula" (daí a opção -j nos comandos) para a especificada ação para continuar o processamento. Os comportamentos mais comuns são padronizados, e existem ações específicas para eles. O processamento da cadeia toma uma destas ações de interrupções padrão, uma vez que o destino do pacote já está selado (salvo uma exceção mencionada a seguir):
  • ACCEPT: permite que o pacote siga seu caminho;
  • REJECT: rejeita o pacote com um erro ICMP (o --reject-with tipo opção para iptables permite seleccionar o tipo de erro);
  • DROP: apaga (ignora) o pacote;
  • LOG: log (via syslogd) uma mensagem com uma descrição do pacote, observe que esta ação não interrompe o processamento, e a execução da cadeia continua na próxima regra, razão pela qual recusou registro de pacotes, requer as regras tanto LOG quanto REJECT/DROP;
  • ULOG: registrar uma mensagem via ulogd, que pode ser melhor adaptada e mais eficiente do que syslogd para lidar com um grande número de mensagens, observe que esta ação, como LOG, também retorna o processamento para a próxima regra na cadeia chamada;
  • chain_name: Vá para a cadeia e avalie as suas regras;
  • RETURN: interrompe o processamento da cadeia atual, e volta para a cadeia de chamada; no caso a cadeia atual é padrão, não há nenhuma cadeia de chamada, de modo que a ação padrão (definida com a opção - P para o iptables) é executada em vez disto;
  • SNAT (apenas na tabela nat, portanto, somente em IPv4 no Whezzy - o suporte NAT para IPv6 apareceu no kernel Linux 3.7): aplicar Nat de origem (opções extra descrevem as alterações exatas para aplicar);
  • DNAT (apenas na tabela nat, portanto, somente em IPv4 no Whezzy: aplica NAT de Destino (opções extra descrevem as alterações exatas para aplicar);
  • MASQUERADE (apenas na tabela nat, portanto, somente em IPv4 no Whezzy): aplica masquerading (um caso especial de NAT de origem);
  • REDIRECT (apenas na tabela nat, portanto, somente em IPv4 no Whezzy): redireciona um pacote para uma determinada porta do firewall, isto pode ser usado para configurar um proxy web transparente que funciona sem nenhuma configuração no lado do cliente, uma vez que o cliente pensa que ele se conecta ao destinatário e as comunicações realmente passam pelo proxy.
Outras ações, particularmente as relativas à tabela mangle, estão fora do escopo deste texto. O iptables(8) e ip6tables(8) tem um lista completa.

14.2.2. Sintaxe do iptables e do ip6tables

Os comandos iptables e ip6tables permitem manipulação de tabelas, cadeias e regrass. Sua opção tabela -t indica em qual tabela operar (por padrão, filtro).

14.2.2.1. Comandos

A opção -N cadeia cria uma nova cadeia. A -X cadeia exclui uma cadeia vazia e sem uso. A -A cadeia regra adiciona uma regra no final da cadeia dada. A opção -I cadeia número_regra regra insere uma regra antes da regra número número_regra. A opção -D cadeia número_regra (ou -D cadeia regra) remove uma regra na cadeia, a primeira sintaxe identifica a regra a ser removida pelo seu número, enquanto o segundo o identifica pelo seu conteúdo. A opção -F cadeia esvazia uma cadeia (remove todas suas regras); se nenhuma cadeia é mencionada, todas as regras da tabela são removidas. A opção -L cadeia lista as regras na cadeia. Finalmente, a opção -P cadeia ação define a ação padrão, ou "política", para uma dada cadeia; observe que apenas as cadeias padrão podem ter essa política.

14.2.2.2. Regras

Cada regra é expressa como condições -j ação opcoes_acoes. Se várias condições são descritas na mesma regra, então o critério é a conjunção (lógica e) das condições, que é pelo menos tão restritiva quanto cada condição individual.
A condição -p protocolo corresponde ao campo protocolo do pacote IP. Os valores mais comuns são tcp, udp, icmp, e ICMPv6. Prefixando a condição com um ponto de exclamação nega a condição, que se transforma numa correspondência para "todos os pacotes com um protocolo diferente da especificada". Este mecanismo de negação não é específico para a opção -p e também pode ser aplicada a todas outras condições.
A condição -s endereço ou -s rede/máscara corresponde o endereço de origem do pacote. Do mesmo modo, -d endereço ou -d rede/máscara corresponde o endereço de destino.
A condicao -i interface seleciona os pacotes provenientes da interface de rede. -o interface seleciona pacotes saindo em uma interface específica.
Existem condições mais específicas, dependendo das condições genéricas acima descritas. Por exemplo, a condição -p TCP pode ser complementada com condições sobre as portas TCP, com cláusulas como -- porta-origem porta e --porta-destino porta.
A condição --estado estado corresponde ao estado de um pacote em uma conexão (isto requer o módulo ipt_conntrack do kernel, para rastreamento de conexões). O estado NEW descreve um pacote iniciando uma nova conexão; O pacote ESTABLISHED corresponde aos pacotes pertencentes a uma conexão já existente, e RELATED correspondem aos pacotes iniciando uma nova conexão relacionada a um já existente (o que é útil para as conexões ftp-data no modo "active" do protocolo FTP).
A seção anterior lista as ações disponíveis, mas não suas respectivas opções. A ação LOG, por exemplo, tem as seguintes opções:
  • --log-priority, com valor padrão aviso, indica a prioridade da mensagem syslog;
  • --log-prefix permite especificar um prefixo de texto para diferenciar mensagens registradas;
  • --log-tcp-sequence, --log-tcp-options e --log-ip-options indicam dados extras a serem integrados na mensagem: respectivamente, o número de seqüência TCP, opções TCP, e as opções IP.
A acao DNAT fornece a --to-destination endereço: opção porta para indicar o novo endereço IP de destino e/ou porta. Da mesma forma, SNAT fornece --to-source endereço:porta para indicar o novo endereço IP de origem e/ou porta.
A ação REDIRECT (disponível apenas se o NAT está disponível - no Wheezy, que significa IPv4 somente) fornece a opção --to-ports porta(s) para indicar a porta, ou intervalo de portas, onde os pacotes devem ser redirecionados.

14.2.3. Criando Regras

Cada criação de regra exige uma invocação de iptables/ip6tables. Digitando estes comandos manualmente pode ser tedioso, por isso as chamadas são normalmente armazenados em um script para que a mesma configuração seja criada automaticamente a cada vez que a máquina inicia. Este script pode ser escrito à mão, mas também pode ser interessante prepará lo com uma ferramenta de alto nível, tais como fwbuilder.
O princípio é simples. Na primeira etapa, é preciso descrever todos os elementos que estarão envolvidos nas atuais regras:
  • o firewall, com suas interfaces de rede;
  • as redes, com suas faixas de IP correspondentes;
  • os servidores;
  • as portas que pertencem aos serviços hospedados nos servidores.
As regras são então criadas com simples ações de arrastar-e-soltar nos objetos. Alguns menus contextuais podem alterar a condição (negando o, por exemplo). Em seguida, a ação deve ser escolhida e configurada.
Quanto IPv6 está ativo, pode se criar dois conjuntos de regras distintas para IPv4 e IPv6, ou criar uma só e deixar fwbuilder traduzir as regras de acordo com os endereços atribuídos aos objetos.
janela principal do Fwbuilder

Figura 14.2. janela principal do Fwbuilder

fwbuilder pode gerar um script de configuração do firewall de acordo com as regras que foram definidas. Sua arquitetura modular lhe confere a capacidade de gerar scripts que visam diferentes sistemas (iptables para Linux, ipf para o FreeBSD e pf para OpenBSD).
Versões do pacote fwbuilder desde Squeeze contém tanto a interface gráfica e os módulos de cada sistema de firewall (estes foram previamente divididos em vários pacotes, um para cada sistema de destino):
# aptitude install fwbuilder

14.2.4. Instalando as Regras em cada inicializacao

Se o firewall serve para proteger uma conexão de rede intermitente PPP, a maneira mais simples de implantar o script é instalá lo como /etc/ppp/ip-up.d/0iptables (observe que apenas os arquivos sem um ponto em seu nome são levados em conta). O firewall irá assim ser recarregado a cada vez que uma conexão PPP for estabelecida.
Em outros casos, a maneira recomendada é registrar o script de configuração em uma directiva up do /etc/network/interfaces. No exemplo a seguir, o script é armazenado em /usr/local/etc/arrakis.fw.

Exemplo 14.1. arquivo interfaces chamando script firewall

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw