Uma Profunda Investigação na Arquitetura do Iptables e Netfilter

Introdução

Firewalls são uma ferramenta importante que pode ser configurada para proteger seus servidores e infraestrutura. No ecossistema Linux, o iptables é uma ferramenta de firewall amplamente utilizada que trabalha com o framework de filtragem de pacotes do kernel, netfilter. Criar políticas de firewall confiáveis pode ser assustador, devido à sintaxe complexa e ao número de partes inter-relacionadas envolvidas.

Neste guia, vamos mergulhar na arquitetura do iptables com o objetivo de torná-la mais compreensível para usuários que precisam construir suas próprias políticas de firewall. Vamos discutir como o iptables interage com o netfilter e como os vários componentes se encaixam para fornecer um sistema de filtragem abrangente.

O que são IPTables e Netfilter?

Durante muitos anos, o software de firewall mais comumente usado no Linux era chamado de iptables. Em algumas distribuições, ele foi substituído por uma nova ferramenta chamada nftables, mas a sintaxe do iptables ainda é comumente usada como referência. O firewall iptables funciona interagindo com os pontos de filtragem de pacotes na pilha de rede do kernel Linux. Esses pontos de interação no kernel são conhecidos como o framework netfilter.

Cada pacote que passa pela camada de rede (entrada ou saída) acionará esses pontos de interação, permitindo que programas interajam com o tráfego em pontos-chave. Os módulos do kernel associados ao iptables registram-se nesses pontos para garantir que o tráfego esteja em conformidade com as condições estabelecidas pelas regras do firewall.

Netfilter Hooks

Há cinco pontos de interação (netfilter hooks) nos quais os programas podem se registrar. Conforme os pacotes avançam pela pilha, eles acionarão os módulos do kernel registrados nesses pontos. Os pontos de interação acionados por um pacote dependem se o pacote é de entrada ou saída, o destino do pacote e se o pacote foi descartado ou rejeitado em um ponto anterior.

Os seguintes pontos de interação representam esses pontos bem definidos na pilha de rede:

  • NF_IP_PRE_ROUTING: Este gancho será acionado por qualquer tráfego de entrada logo após entrar na pilha de rede. Este gancho é processado antes de quaisquer decisões de roteamento terem sido tomadas sobre para onde enviar o pacote.
  • NF_IP_LOCAL_IN: Este gancho é acionado após um pacote de entrada ter sido roteado se o pacote estiver destinado ao sistema local.
  • NF_IP_FORWARD: Este gancho é acionado após um pacote de entrada ter sido roteado se o pacote for encaminhado para outro host.
  • NF_IP_LOCAL_OUT: Este gancho é acionado por qualquer tráfego de saída local criado assim que atinge a pilha de rede.
  • NF_IP_POST_ROUTING: Este gancho é acionado por qualquer tráfego de saída ou encaminhado após o roteamento ter ocorrido e pouco antes de ser enviado pela rede.

Os módulos do kernel que precisam se registrar nesses ganchos também devem fornecer um número de prioridade para ajudar a determinar a ordem na qual serão chamados quando o gancho for acionado. Isso fornece os meios para que vários módulos (ou várias instâncias do mesmo módulo) sejam conectados a cada um dos ganchos com uma ordem determinística. Cada módulo será chamado por sua vez e retornará uma decisão para o framework netfilter após processamento, indicando o que deve ser feito com o pacote.

Tabelas e Correntes do IPTables

O firewall iptables usa tabelas para organizar suas regras. Essas tabelas classificam as regras de acordo com o tipo de decisões que são usadas para tomar. Por exemplo, se uma regra lida com tradução de endereços de rede, ela será colocada na tabela nat. Se a regra é usada para decidir se permite que o pacote continue até o seu destino, provavelmente será adicionada à tabela filter.

Dentro de cada tabela iptables, as regras são organizadas ainda mais em “cadeias” separadas. Enquanto as tabelas são definidas pelo objetivo geral das regras que elas contêm, as cadeias integradas representam os ganchos netfilter que as acionam. As cadeias determinam quando as regras serão avaliadas.

Os nomes das cadeias integradas refletem os nomes dos ganchos netfilter com os quais estão associados:

  • PREROUTING: Acionado pelo gancho NF_IP_PRE_ROUTING.
  • INPUT: Acionado pelo gancho NF_IP_LOCAL_IN.
  • FORWARD: Acionado pelo gancho NF_IP_FORWARD.
  • OUTPUT: Acionado pelo gancho NF_IP_LOCAL_OUT.
  • POSTROUTING: Acionado pelo gancho NF_IP_POST_ROUTING.

As cadeias permitem ao administrador controlar onde no caminho de entrega de um pacote uma regra será avaliada. Como cada tabela possui múltiplas cadeias, a influência de uma tabela pode ser exercida em vários pontos no processamento. Como certos tipos de decisões só fazem sentido em determinados pontos na pilha de rede, nem toda tabela terá uma cadeia registrada com cada gancho do kernel.

Há apenas cinco ganchos do kernel netfilter, então correntes de várias tabelas são registradas em cada um dos ganchos. Por exemplo, três tabelas têm correntes PREROUTING. Quando essas correntes se registram no gancho associado NF_IP_PRE_ROUTING, elas especificam uma prioridade que dita a ordem em que cada corrente PREROUTING da tabela é chamada. Cada uma das regras dentro da corrente PREROUTING de maior prioridade é avaliada sequencialmente antes de passar para a próxima corrente PREROUTING. Vamos dar uma olhada na ordem específica de cada corrente em um momento.

Quais Tabelas Estão Disponíveis?

Vamos dar um passo para trás por um momento e dar uma olhada nas diferentes tabelas que o iptables fornece. Estas representam conjuntos distintos de regras, organizados por área de preocupação, para avaliar pacotes.

A Tabela de Filtro

A tabela de filtro é uma das tabelas mais amplamente utilizadas no iptables. A tabela filter é usada para tomar decisões sobre permitir que um pacote continue para seu destino pretendido ou negar sua solicitação. Em termos de firewall, isso é conhecido como “filtragem” de pacotes. Esta tabela fornece a maior parte da funcionalidade que as pessoas pensam ao discutir firewalls.

A Tabela NAT

A tabela nat é usada para implementar regras de tradução de endereços de rede. Conforme os pacotes entram na pilha de rede, as regras nesta tabela determinarão se e como modificar os endereços de origem ou destino do pacote, a fim de impactar a forma como o pacote e qualquer tráfego de resposta são roteados. Isso é frequentemente usado para rotear pacotes para redes quando o acesso direto não é possível.

A Tabela Mangle

A tabela mangle é usada para alterar os cabeçalhos IP do pacote de várias maneiras. Por exemplo, você pode ajustar o valor TTL (Tempo de Vida) de um pacote, aumentando ou diminuindo o número de saltos de rede válidos que o pacote pode suportar. Outros cabeçalhos IP podem ser alterados de maneiras semelhantes.

Esta tabela também pode colocar uma “marca” interna no pacote para processamento adicional em outras tabelas e por outras ferramentas de rede. Esta marca não afeta o pacote real, mas adiciona a marca à representação do pacote pelo kernel.

A Tabela Raw

A firewall iptables é stateful, o que significa que os pacotes são avaliados em relação aos pacotes anteriores. Os recursos de rastreamento de conexão construídos sobre o framework netfilter permitem que o iptables veja os pacotes como parte de uma conexão ou sessão em andamento, em vez de como uma sequência de pacotes discretos e não relacionados. A lógica de rastreamento de conexão geralmente é aplicada logo após o pacote atingir a interface de rede.

A tabela raw tem uma função muito bem definida. Seu único propósito é fornecer um mecanismo para marcar pacotes para optar por não rastrear a conexão.

A Tabela de Segurança

A tabela security é usada para definir marcas de contexto de segurança interna SELinux em pacotes, que afetarão como o SELinux ou outros sistemas que podem interpretar contextos de segurança SELinux manipulam os pacotes. Essas marcas podem ser aplicadas em uma base por pacote ou por conexão.

Relações entre Cadeias e Tabelas

Se três tabelas têm cadeias PREROUTING, em que ordem elas são avaliadas?

A tabela seguinte indica as cadeias disponíveis dentro de cada tabela iptables quando lidas da esquerda para a direita. Por exemplo, podemos ver que a tabela raw possui tanto as cadeias PREROUTING quanto OUTPUT. Quando lidas de cima para baixo, também mostra a ordem em que cada cadeia é chamada quando o gancho associado do netfilter é acionado.

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

Ao um pacote acionar um gancho do netfilter, as cadeias associadas serão processadas conforme listadas na tabela acima, de cima para baixo. Os ganchos (colunas) que um pacote acionará dependem se é um pacote de entrada ou saída, as decisões de roteamento que são feitas e se o pacote passa pelos critérios de filtragem.

Certos eventos farão com que a cadeia de uma tabela seja ignorada durante o processamento. Por exemplo, apenas o primeiro pacote em uma conexão será avaliado em relação às regras NAT. Quaisquer decisões nat feitas para o primeiro pacote serão aplicadas a todos os pacotes subsequentes na conexão sem avaliação adicional. As respostas às conexões com NAT terão automaticamente as regras NAT reversas aplicadas para rotear corretamente.

Ordem de Traversão da Cadeia

Assumindo que o servidor saiba como rotear um pacote e que as regras do firewall permitam sua transmissão, os fluxos seguintes representam os caminhos que serão percorridos em diferentes situações:

  • Pacotes de entrada destinados ao sistema local: PREROUTING -> INPUT
  • Pacotes de entrada destinados a outro host: PREROUTING -> FORWARD -> POSTROUTING
  • Pacotes gerados localmente: OUTPUT -> POSTROUTING

Se combinarmos as informações acima com a ordem estabelecida na tabela anterior, podemos ver que um pacote de entrada destinado ao sistema local será primeiro avaliado nas cadeias PREROUTING das tabelas raw, mangle e nat. Em seguida, ele percorrerá as cadeias INPUT das tabelas mangle, filter, security e nat, antes de ser entregue ao soquete local.

Regras do IPTables

As regras são colocadas dentro de uma cadeia específica de uma tabela específica. Conforme cada cadeia é chamada, o pacote em questão será verificado contra cada regra dentro da cadeia, em ordem. Cada regra possui um componente de correspondência e um componente de ação.

Correspondência

A porção correspondente de uma regra especifica os critérios que um pacote deve atender para que a ação associada (ou “alvo”) seja executada.

O sistema de correspondência é muito flexível e pode ser significativamente expandido com extensões adicionais do iptables. As regras podem ser construídas para corresponder por tipo de protocolo, endereço de destino ou origem, porta de destino ou origem, rede de destino ou origem, interface de entrada ou saída, cabeçalhos ou estado da conexão, entre outros critérios. Esses podem ser combinados para criar conjuntos de regras complexas para distinguir entre diferentes tráfegos.

Alvos

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

  • Alvos terminadores: Os alvos terminadores executam uma ação que encerra a avaliação dentro da cadeia e retorna o controle para o gancho do netfilter. Dependendo do valor de retorno fornecido, o gancho pode descartar o pacote ou permitir que o pacote continue para a próxima etapa do processamento.
  • Alvos não terminadores: Os alvos não terminadores executam uma ação e continuam a avaliação dentro da cadeia. Embora cada cadeia deva eventualmente retornar uma decisão final terminadora, qualquer número de alvos não terminadores pode ser executado antes disso.

A disponibilidade de cada alvo nas regras dependerá do contexto. Por exemplo, o tipo de tabela e cadeia pode ditar os alvos disponíveis. As extensões ativadas na regra e as cláusulas de correspondência também podem afetar a disponibilidade dos alvos.

Saltando para Cadeias Definidas pelo Usuário

Há também uma classe especial de alvo não terminante: o alvo de salto. Os alvos de salto são ações que resultam na avaliação movendo-se para uma cadeia diferente para processamento adicional. Nós já cobrimos as cadeias integradas que estão vinculadas aos ganchos do netfilter que as chamam. No entanto, o iptables também permite aos administradores criar suas próprias cadeias para fins organizacionais.

Regras podem ser colocadas em cadeias definidas pelo usuário da mesma forma que podem ser colocadas em cadeias integradas. A diferença é que as cadeias definidas pelo usuário só podem ser alcançadas “saltando” para elas a partir de uma regra (elas não são registradas com um gancho netfilter por si mesmas).

As cadeias definidas pelo usuário atuam como extensões da cadeia que as chamou. Por exemplo, em uma cadeia definida pelo usuário, a avaliação passará de volta para a cadeia chamadora se o final da lista de regras for alcançado ou se um alvo RETURN for ativado por uma regra correspondente. A avaliação também pode saltar para cadeias definidas pelo usuário adicionais.

Esta construção permite uma organização maior e fornece a estrutura necessária para ramificações mais robustas.

IPTables e Rastreamento de Conexão

Introduzimos o sistema de rastreamento de conexões implementado sobre o framework netfilter quando discutimos a tabela raw e os critérios de correspondência do estado da conexão. O rastreamento de conexões permite ao iptables tomar decisões sobre pacotes visualizados no contexto de uma conexão em andamento. O sistema de rastreamento de conexões fornece ao iptables a funcionalidade necessária para realizar operações “stateful”.

O rastreamento de conexões é aplicado muito rapidamente após os pacotes entrarem na pilha de rede. As cadeias da tabela raw e algumas verificações de integridade são as únicas lógicas realizadas nos pacotes antes de associá-los a uma conexão.

O sistema verifica cada pacote em relação a um conjunto de conexões existentes. Ele atualizará o estado da conexão em seu armazenamento, se necessário, e adicionará novas conexões ao sistema quando necessário. Pacotes marcados com o destino NOTRACK em uma das cadeias raw evitarão as rotinas de rastreamento de conexão.

Estados Disponíveis

As conexões rastreadas pelo sistema de rastreamento de conexões estarão em um dos seguintes estados:

  • NEW: Quando um pacote chega que não está associado a uma conexão existente, mas não é inválido como um primeiro pacote, uma nova conexão será adicionada ao sistema com este rótulo. Isso ocorre tanto para protocolos conscientes de conexão, como TCP, quanto para protocolos sem conexão, como UDP.
  • ESTABELECIDO: Uma conexão é alterada de NOVO para ESTABELECIDO quando recebe uma resposta válida na direção oposta. Para conexões TCP, isso significa um SYN/ACK e para tráfego UDP e ICMP, isso significa uma resposta onde a origem e o destino do pacote original são trocados.
  • RELACIONADO: Pacotes que não fazem parte de uma conexão existente, mas estão associados a uma conexão já existente no sistema são rotulados como RELACIONADO. Isso poderia significar uma conexão auxiliar, como é o caso das conexões de transmissão de dados FTP, ou poderia ser respostas ICMP a tentativas de conexão por outros protocolos.
  • INVÁLIDO: Pacotes podem ser marcados como INVÁLIDO se não estiverem associados a uma conexão existente e não forem apropriados para abrir uma nova conexão, se não puderem ser identificados, ou se não forem roteáveis, entre outras razões.
  • NÃO RASTREÁVEL: Pacotes podem ser marcados como NÃO RASTREÁVEL se tiverem sido direcionados em uma cadeia de tabela raw para contornar o rastreamento.
  • SNAT: Este é um estado virtual definido quando o endereço de origem foi alterado por operações NAT. Isso é usado pelo sistema de rastreamento de conexões para que ele saiba alterar os endereços de origem de volta em pacotes de resposta.
  • DNAT: Este é um estado virtual definido quando o endereço de destino foi alterado por operações NAT. Isso é usado pelo sistema de rastreamento de conexões para que ele saiba alterar o endereço de destino de volta ao rotear pacotes de resposta.

Os estados rastreados no sistema de controle de conexão permitem que administradores criem regras que visam pontos específicos na vida útil de uma conexão. Isso fornece a funcionalidade necessária para regras mais completas e seguras.

Conclusão

O framework de filtragem de pacotes netfilter e o firewall iptables são a base para a maioria das soluções de firewall em servidores Linux. Os ganchos do kernel netfilter estão suficientemente próximos da pilha de rede para fornecer um controle poderoso sobre os pacotes à medida que são processados pelo sistema. O firewall iptables aproveita essas capacidades para fornecer um método flexível e extensível de comunicar os requisitos de política ao kernel. Ao aprender sobre como essas peças se encaixam, você pode utilizá-las melhor para controlar e proteger seus ambientes de servidor.

Se você gostaria de saber mais sobre como escolher políticas iptables eficazes, confira este guia.

Estes guias podem ajudá-lo a começar a implementar suas regras de firewall iptables:

Source:
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture