Um firewall é um dispositivo de segurança (hardware/software) que protege a rede filtrando o tráfego e bloqueando o acesso indesejado/não autorizado a dados privados. Ter um firewall adequado é importante para proteger seus servidores e infraestrutura. Ele pode não apenas bloquear o tráfego indesejado, mas também impedir que softwares maliciosos infectem o sistema.
No ecossistema Linux, iptables é um firewall popular que faz interface com o netfilter framework no kernel Linux. A maioria dos sistemas Linux modernos vem com essas ferramentas pré-instaladas. Para aproveitar ao máximo esses sistemas, é fundamental entender suas arquiteturas. Caso contrário, desenvolver políticas de firewall confiáveis pode ser uma tarefa assustadora. Isso pode levar à criação de sintaxes complicadas, partes inter-relacionadas no framework, etc.
Este guia irá mergulhar profundamente na arquitetura do iptables para ajudar os usuários que precisam criar suas próprias políticas de firewall. Também exploraremos como o iptables faz interface com o netfilter e como os vários componentes se encaixam.
Iptables e Netfilter
No Linux, o iptables firewall é o mais comum. Ele funciona fazendo a interface com os hooks de filtragem de pacotes na pilha de rede do kernel do Linux. São esses hooks do kernel que são coletivamente referidos como o netfilter framework.
Cada pacote de entrada/saída no sistema acionará esses hooks à medida que avança pela pilha. Assim, os programas registrados nesses hooks são capazes de interagir com o tráfego em pontos-chave. Finalmente, os módulos do kernel associados ao iptables se conectam a esses hooks para aplicar as regras de firewall especificadas.
Hooks do Netfilter
Para que os programas se conectem, existem cinco diferentes netfilter hooks. À medida que os pacotes avançam pela pilha, os hooks acionam os módulos do kernel registrados neles. A condição de acionamento depende de condições como: a direção do pacote (entrada/saída), o destino do pacote, se o pacote foi descartado/rejeitado em um ponto anterior, etc.
Estes são os hooks que representam vários pontos bem definidos na pilha de rede:
-
NF_IP_PRE_ROUTING: Este hook é acionado por qualquer tráfego de entrada. O acionamento ocorre antes que qualquer decisão de roteamento seja tomada em relação ao destino do pacote.
-
NF_IP_LOCAL_IN: Este hook é acionado após o roteamento de um pacote de entrada. O pacote também precisa ser destinado ao sistema local.
-
NF_IP_FORWARD: Este hook também é acionado após o roteamento de um pacote de entrada. No entanto, ele é acionado se o pacote for roteado para outro host.
-
NF_IP_LOCAL_OUT: Qualquer tráfego de saída local, assim que atinge a pilha de rede, aciona este hook.
-
NF_IP_POST_ROUTING: Este hook é acionado por qualquer tráfego de saída/encaminhado após o roteamento ter ocorrido, antes que o pacote chegue ao cabo.
Os módulos do kernel que desejam se registrar nesses hooks devem fornecer um número de prioridade. Esse valor ajuda a determinar a ordem em que serão chamados assim que o hook for acionado. Esse mecanismo permite que múltiplos módulos (módulos diferentes ou múltiplas cópias do mesmo módulo) se conectem a cada um dos hooks em uma ordem determinística. Cada módulo retornará uma decisão para o netfilter framework após processar os pacotes.
Tabelas e Cadeias no Iptables
Para organizar suas regras, o firewall iptables utiliza tabelas. As tabelas categorizam as regras com base no tipo de decisões que tomam. Por exemplo, se uma regra lida com NAT (tradução de endereços de rede), então a regra é colocada sob a tabela nat . Da mesma forma, se uma regra está decidindo se permite/nega um pacote ao seu destino, ela é adicionada à tabela filter .
Dentro de cada tabela do iptables, as regras são organizadas em “cadeias” (chains) separadas. Enquanto a tabela representa o tipo de regras que elas contêm, as cadeias descrevem os netfilter hooks que acionam as regras. Em resumo, as cadeias determinam quando a regra será avaliada.
Aqui estão as cadeias integradas do iptables. Curiosamente, os nomes das chains também refletem o nome do associado netfilter hooks:
| Chain (iptables) | Utilização |
| PREROUTING | NF_IP_PRE_ROUTING |
| INPUT | NF_IP_LOCAL_IN |
| FORWARD | NF_IP_FORWARD |
| OUTPUT | NF_IP_LOCAL_OUT |
| POSTROUTING | NF_IP_POST_ROUTING |
Usando as chains, os administradores podem determinar em qual estágio da entrega do pacote a regra será avaliada. Como cada tabela contém várias chains, ela também pode estender sua influência em vários pontos do processamento. Certas decisões só fazem sentido em certos pontos da pilha de rede. Assim, nem toda tabela terá uma chain registrada em cada hook do kernel.
O netfilter framework oferece apenas 5 hooks de kernel. Como tal, chains de várias tabelas são registradas em cada ponto dos hooks. Por exemplo, se três chains têm as PREROUTING chains, então elas são registradas com o NF_IP_PRE_ROUTING hook. Cada uma delas deve fornecer uma prioridade que decide em qual ordem a chain PREROUTING de cada tabela é chamada. A chain PREROUTING de maior prioridade é avaliada primeiro, a próxima de maior prioridade é avaliada em segundo lugar, e assim por diante.
As Tabelas do iptables
Vamos dar um passo atrás e dar uma olhada nas tabelas que o iptables oferece. Como mencionado anteriormente, cada tabela representa diferentes conjuntos de regras, organizados por área de interesse, para avaliação de pacotes.
-
Tabela filter
No iptables , a tabela filter é uma das mais populares. Ela é usada para determinar se um pacote terá permissão para continuar até o seu destino ou não. Na terminologia de firewall, esse processo é conhecido como “filtragem” de pacotes.
São as funções da tabela filter às quais as pessoas se referem ao discutir firewalls (na maior parte das vezes).
-
Tabela nat
Esta tabela implementa regras que regulam o NAT. Quando os pacotes entram na pilha de rede, as regras descritas nesta tabela decidem como modificar o endereço de origem/destino do pacote, impactando o roteamento do pacote e qualquer tráfego de resposta.
Frequentemente, a tabela nat é usada para rotear pacotes para redes onde não há acesso direto.
-
Tabela mangle
Esta tabela contém as regras que modificam os cabeçalhos IP dos pacotes de várias maneiras. Por exemplo, ela pode modificar o valor TTL (Time to Live) de um pacote, aumentando/diminuindo o número de saltos de rede válidos que o pacote pode suportar. Além disso, a tabela mangle pode modificar outros cabeçalhos IP de maneira semelhante.
Esta tabela também tem permissão para colocar uma “marca” interna do kernel no pacote que outras tabelas e ferramentas de rede podem capturar para processamento posterior. Essa marca não toca no pacote real, mas sim adiciona a marca à representação do pacote no kernel.
-
Tabela raw
O firewall iptables é stateful, o que significa que os pacotes são avaliados no contexto de sua relação com pacotes anteriores. O recurso de rastreamento de conexões desenvolvido sobre o framework netfilter permite que o iptables visualize os pacotes como parte de uma conexão ou sessão contínua, em vez de um fluxo de pacotes discretos e não relacionados. Geralmente, a lógica de rastreamento de conexão é aplicada logo após o pacote atingir a interface de rede.
A tabela raw vem com uma função muito estritamente definida. O único propósito desta tabela é fornecer um mecanismo para marcar pacotes a fim de optar por não participar do rastreamento de conexões.
-
Tabela security
A tabela security coloca marcas de contexto de segurança SELinux internas nos pacotes. Isso, por sua vez, afeta como o SELinux (ou qualquer outro aplicativo que interprete contextos de segurança SELinux) lidará com os pacotes.
As marcas do SELinux podem ser aplicadas por pacote ou por conexão.
Chains Implementadas em Cada Tabela
Até agora, falamos sobre tabelas e chains separadamente. É hora de examinar quais chains estão disponíveis em cada tabela. Este tópico estende a discussão sobre a ordem de avaliação das chains registradas no mesmo hook. Por exemplo, o que acontece se três tabelas tiverem chains PREROUTING ? Qual é a sua ordem de avaliação?
A seguir, dê uma olhada na tabela seguinte. Ela indica as cadeias que estão disponíveis dentro de cada iptables tabela.
| PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | |
|
(decisão de roteamento) |
✓ | ||||
|
raw |
✓ | ✓ | |||
|
(rastreamento de conexões ativado) |
✓ | ✓ | |||
|
mangle |
✓ | ✓ | ✓ | ✓ | ✓ |
|
nat (DNAT) |
✓ | ✓ | |||
|
(decisão de roteamento) |
✓ | ✓ | |||
|
filter |
✓ | ✓ | ✓ | ||
|
security |
✓ | ✓ | ✓ | ||
|
nat (SNAT) |
✓ | ✓ |
Quando lida da esquerda para a direita, ela descreve quais tabelas contêm quais cadeias. Por exemplo, a raw tabela possui tanto as cadeias PREROUTING quanto OUTPUT . Quando lida de cima para baixo, ela descreve em que ordem cada cadeia é chamada quando seu netfilter hook associado é acionado.
Observe que a tabela nat foi dividida entre as operações DNAT (alteração do destino de um pacote) e as operações SNAT (alteração da origem de um pacote) para especificar sua ordenação de forma mais clara. A tabela também inclui pontos de representação onde as decisões de roteamento são tomadas e onde o rastreamento de conexões é ativado.
Os hooks (colunas) que um pacote acionará são baseados na natureza do pacote (de entrada/saída), nas decisões de roteamento que são tomadas e se o pacote atende aos critérios de filtragem.
Certos eventos podem pular a cadeia de uma tabela durante o processamento. Por exemplo, apenas o primeiro pacote de uma conexão será avaliado em relação às regras de NAT, conforme descrito pela tabela nat. Qualquer pacote subsequente na mesma conexão terá as mesmas decisões de nat aplicadas sem qualquer avaliação adicional. As respostas às conexões NAT terão automaticamente as regras de NAT reverso aplicadas para o roteamento adequado.
Ordem de Travessia das Cadeias
Assumindo que o servidor conhece as regras de roteamento de pacotes e que as regras do firewall permitem a transmissão, os seguintes fluxos representam como os diferentes caminhos serão percorridos:
-
Pacotes de entrada destinados ao sistema local: PREROUTING >> INPUT
-
Pacotes de entrada destinados a outro host: PREROUTING >> FORWARD >> POSTROUTING
-
Pacotes gerados localmente: OUTPUT >> POSTROUTING
Em conclusão, combinando todas as informações que discutimos até agora, podemos ver que qualquer pacote de entrada destinado ao sistema local será avaliado em relação às cadeias PREROUTING das tabelas raw, mangle, e nat. Em seguida, ele passará pelas cadeias INPUT das tabelas mangle, filter, security, e nat antes de finalmente chegar ao socket local.
Regras do Iptables
As regras de firewall do iptables são colocadas dentro de uma cadeia específica de uma tabela específica. Quando uma cadeia é chamada, o pacote em questão será avaliado em relação a cada regra na cadeia. Cada regra possui dois componentes: um componente de correspondência e um componente de ação.
-
Correspondência
A parte de correspondência de uma regra especifica as condições que um pacote deve atender antes que a ação especificada (ou “target”) seja executada.
O sistema de correspondência oferece uma flexibilidade incrível. Sua funcionalidade também pode ser estendida com a ajuda das extensões do iptables. As regras podem ser descritas para corresponder a pacotes por tipo de protocolo, endereço de origem/destino, porta de origem/destino, rede de origem/destino, interface de entrada/saída, cabeçalhos, estado da conexão e outros critérios. Uma regra também pode ter uma combinação dessas condições, resultando em conjuntos de regras complexos para diferenciar diferentes tráfegos.
-
Alvos
Um alvo é a ação tomada quando um pacote atende aos critérios de correspondência de uma regra. Geralmente, os alvos são divididos em dois grupos:
-
-
Alvos de terminação: Ele encerra o processo de avaliação dentro da cadeia e retorna o controle para o netfilter hook. Com base no valor de retorno, o hook permitirá que o pacote continue sua jornada ou o descartará.
-
Alvos de não terminação: O alvo realiza uma ação e a avaliação na cadeia continua. Embora cada cadeia deva passar por uma decisão de terminação final, qualquer número de alvos de não terminação pode ocorrer antes disso.
-
A disponibilidade de cada alvo dentro das regras depende do contexto. Por exemplo, o tipo de cadeia e de tabela pode impactar a disponibilidade dos alvos. Outros fatores possíveis incluem extensões ativadas na regra e as cláusulas de correspondência.
Cadeias Definidas pelo Usuário
Há também uma classe especial de alvos não terminativos: o alvo de salto. Alvos de salto são ações executadas quando a avaliação se move de uma cadeia para outra para processamento adicional. Até agora, falamos sobre cadeias integradas que estão intimamente conectadas aos netfilter hooks que as chamam. No entanto, iptables também permite que os administradores criem suas próprias cadeias personalizadas.
As regras em cadeias definidas pelo usuário também são semelhantes àquelas em cadeias integradas. A principal diferença é que as cadeias definidas pelo usuário só são alcançáveis ao “saltar” para elas a partir de uma regra. Isso ocorre porque as cadeias definidas pelo usuário não estão vinculadas a nenhum netfilter hooks.
Você pode pensar nas cadeias definidas pelo usuário como extensões da cadeia que originalmente as chamou. Por exemplo, em uma cadeia definida pelo usuário, a avaliação retornará para a cadeia chamadora se atingir o final da lista de regras ou se uma regra correspondente executar um RETURN alvo. Curiosamente, uma cadeia definida pelo usuário também pode “saltar” a avaliação para outra cadeia definida pelo usuário.
Este recurso estabelece as bases para uma melhor organização e a estrutura necessária para ramificações robustas.
Rastreamento de Conexões
Ao discutir a raw tabela e os critérios de correspondência de estado de conexão, discutimos o sistema de rastreamento de conexões implementado sobre o netfilter framework. Este recurso permite que o iptables visualizar pacotes no contexto de uma conexão em andamento. O sistema de rastreamento de conexões também fornece ao iptables a funcionalidade necessária para realizar operações “stateful”.
Logo após um pacote entrar na pilha de rede, o rastreamento de conexão é aplicado. As cadeias da tabela raw e algumas verificações básicas de integridade são toda a lógica necessária para associar pacotes a uma conexão.
O sistema verifica cada pacote em relação a um conjunto de conexões existentes. Se necessário, o sistema atualizará o estado das conexões existentes ou criará novas. Os pacotes que foram marcados com o alvo NOTRACK em qualquer cadeia da tabela raw ignorarão as rotinas adicionais de rastreamento de conexão.
-
Estados Disponíveis
As conexões que são rastreadas pelo sistema de rastreamento de conexões terão qualquer um dos seguintes estados atribuídos:
-
-
NEW : Após a chegada de um pacote que não está associado a uma conexão existente, mas não é inválido como um primeiro pacote, uma nova conexão é adicionada ao sistema com este rótulo. Isso ocorre tanto para protocolos orientados a conexão (TCP, por exemplo) quanto para protocolos sem conexão (UDP, por exemplo).
-
ESTABLISHED: O estado de uma conexão é atualizado de NEW para ESTABLISHED quando recebe uma resposta válida da direção oposta. Para conexões TCP, isso significa um SYN/ACK. Para o tráfego UDP e ICMP, significa uma resposta onde a origem e o destino do pacote original são invertidos.
-
RELATED: Pacotes que não fazem parte de uma conexão, mas estão relacionados a uma conexão estabelecida, são rotulados como RELATED . Isso pode significar uma conexão auxiliar (por exemplo, em uma conexão de transmissão de dados FTP) ou respostas ICMP a tentativas de conexão por outros protocolos.
-
INVALID: Pacotes que não fazem parte de uma conexão estabelecida, são considerados inadequados para abrir uma nova conexão, não podem ser identificados, não são roteáveis, etc., são rotulados como INVALID.
-
UNTRACKED: Um pacote pode ser rotulado como UNTRACKED se foi alvo em uma raw cadeia da tabela raw para ignorar o rastreamento.
-
SNAT: Significa um estado virtual definido quando o endereço de origem é modificado por uma operação NAT. Ele é tratado pelo sistema de rastreamento de conexões para que os endereços de origem sejam traduzidos nos pacotes de resposta.
-
DNAT: Semelhante ao SNAT, ele significa um estado virtual quando o endereço de destino é modificado por uma operação NAT. O sistema de rastreamento de conexões lida com isso para que saiba traduzir o endereço de destino de volta ao rotear pacotes de resposta.
-
Esses estados rastreados pelo sistema de rastreamento de conexões permitem que os administradores criem regras específicas visando pontos específicos no tempo de vida de uma conexão. Ele fornece a funcionalidade necessária para regras mais detalhadas e seguras.
Considerações Finais
No Linux, o netfilter framework e o iptables firewall servem como base para a maioria dos firewalls. Os hooks do netfilter estão próximos o suficiente da pilha de rede para permitir um controle poderoso sobre os pacotes processados pelo sistema. Aproveitando esses recursos, o iptables firewall oferece uma maneira flexível de comunicar os requisitos de política ao kernel.
Este guia detalha a estrutura interna do netfilter framework e do iptables firewall. Além disso, ele discute o sistema de rastreamento de conexões. Ao compreender como essas peças se encaixam, você poderá utilizá-las melhor para criar ambientes de servidor mais robustos e seguros.
Finalmente, embora este guia aborde o funcionamento interno, confira este guia sobre como configurar o iptables para aplicá-los em ação. Além disso, você pode ver como o firewall UFW simplifica ainda mais o iptables. Além disso, será útil aprender como listar e excluir regras de firewall do iptables.
Feliz computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.