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 funciona com o framework de filtragem de pacotes netfilter do kernel. 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 nos aprofundar na arquitetura do iptables com o objetivo de torná-lo mais compreensível para os 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 abrangente de filtragem.

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, 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 ganchos de filtragem de pacotes na pilha de rede do kernel Linux. Esses ganchos de kernel são conhecidos como o framework netfilter.

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

Ganchos Netfilter

Há cinco ganchos netfilter aos quais os programas podem se registrar. Conforme os pacotes avançam pela pilha, eles acionarão os módulos do kernel registrados nesses ganchos. Os ganchos 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 ganchos 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 para ser 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 logo antes de ser enviado pelo fio.

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 múltiplos módulos (ou múltiplas instâncias do mesmo módulo) serem conectados a cada um dos ganchos com uma ordenação determinística. Cada módulo será chamado por vez e retornará uma decisão para o framework netfilter após processar, indicando o que deve ser feito com o pacote.

Tabelas e Cadeias do IPTables

O firewall iptables usa tabelas para organizar suas regras. Essas tabelas classificam as regras de acordo com o tipo de decisão que elas 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 for usada para decidir se permite que o pacote continue para seu destino, provavelmente será adicionada à tabela filter.

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

Os nomes das “chains” incorporadas refletem os nomes dos gatilhos netfilter aos quais estão associadas:

  • 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 “chains” permitem ao administrador controlar onde, no caminho de entrega de um pacote, uma regra será avaliada. Como cada tabela possui várias “chains”, a influência de uma tabela pode ser exercida em vários pontos no processamento. Porque certos tipos de decisões só fazem sentido em determinados pontos na pilha de rede, nem toda tabela terá uma “chain” registrada com cada gancho do kernel.

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

Quais Tabelas Estão Disponíveis?

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

A Tabela de Filtro

A tabela de filtro é uma das tabelas mais amplamente utilizadas no iptables. A tabela de filter é usada para tomar decisões sobre se permitir que um pacote continue para seu destino pretendido ou para negar sua solicitação. Na terminologia do 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 para 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 (Time to Live) 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 no kernel.

A Tabela Raw

O firewall iptables é stateful, o que significa que os pacotes são avaliados em relação aos seus pacotes anteriores. As funcionalidades de rastreamento de conexão construídas 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 um fluxo 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 a fim de excluir o rastreamento de conexão.

A Tabela de Segurança

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

Relacionamentos Entre Cadeias e Tabelas

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

A seguinte tabela indica as cadeias disponíveis dentro de cada tabela iptables quando lidas da esquerda para a direita. Por exemplo, podemos observar que a tabela raw possui tanto as cadeias PREROUTING quanto OUTPUT. Quando lida de cima para baixo, ela também exibe a ordem na qual cada cadeia é chamada quando o gancho netfilter associado é 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 netfilter, as cadeias associadas serão processadas conforme listadas na tabela acima, de cima para baixo. Os ganchos (colunas) que um pacote irá acionar dependem se é um pacote de entrada ou saída, as decisões de roteamento que são tomadas 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 pelas 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 NAT’ed automaticamente terão as regras NAT reversas aplicadas para roteamento correto.

Ordem de Traversal da Cadeia

Supondo que o servidor saiba rotear um pacote e que as regras do firewall permitam sua transmissão, os seguintes fluxos 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 contra as cadeias de PREROUTING das tabelas raw, mangle e nat. Em seguida, ele percorrerá as cadeias INPUT das tabelas mangle, filter, security e nat antes de ser finalmente entregue ao socket 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 cumprir 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 de 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 de término: Os alvos de término executam uma ação que termina 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 terminantes: Os alvos não terminantes executam uma ação e continuam a avaliação dentro da cadeia. Embora cada cadeia eventualmente deva retornar uma decisão final de término, qualquer número de alvos não terminantes pode ser executado antes disso.

A disponibilidade de cada alvo dentro das regras dependerá do contexto. Por exemplo, a tabela e o tipo de cadeia podem 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.

Pulando para Cadeias Definidas pelo Usuário

Também existe 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 se movendo para uma cadeia diferente para processamento adicional. Nós cobrimos as cadeias embutidas que estão ligadas aos ganchos netfilter que as chamam. No entanto, o iptables também permite que os administradores criem 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 embutidas. 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 estã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 voltará para a cadeia de chamada 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 maior organização e fornece o framework necessário para ramificações mais robustas.

IPTables e Rastreamento de Conexão

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

O rastreamento de conexão é aplicado muito cedo 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 que são executadas 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 sua memória se necessário e adicionará novas conexões ao sistema quando necessário. Pacotes marcados com o alvo NOTRACK em uma das cadeias raw ignorarão as rotinas de rastreamento de conexão.

Estados Disponíveis

As conexões rastreadas pelo sistema de rastreamento de conexão 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 NOVA 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á no sistema são rotulados como RELACIONADO. Isso pode significar uma conexão auxiliar, como é o caso das conexões de transmissão de dados FTP, ou pode 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 evitar 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ão 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ão para que ele saiba alterar o endereço de destino de volta ao rotear pacotes de resposta.

Os estados rastreados no sistema de rastreamento de conexão permitem que os administradores criem regras que visam pontos específicos no ciclo de vida de uma conexão. Isso fornece a funcionalidade necessária para regras mais detalhadas 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 próximos o suficiente da pilha de rede para fornecer controle poderoso sobre os pacotes conforme são processados pelo sistema. O firewall iptables aproveita essas capacidades para oferecer um método flexível e extensível de comunicar os requisitos de política para o kernel. Ao aprender 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 eficazes do iptables, confira este guia.

Esses 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