Quando o módulo conntrack do iptable rastreia os estados dos pacotes?

Quando o módulo conntrack do iptable rastreia os estados dos pacotes?

Primeiro ele precisa armazenar estados. Com algum firewall BSD antigo que usei, acho que se chamava IPFW, eu costumava colocar uma regra que dizia "manter o controle do estado do pacote que sai", e isso era colocado na direção de saída das interfaces. Em seguida, outra regra na direção de entrada que os comparou com os estados que foram criados pela regra na direção de saída. Portanto, costumava haver 2 regras: (1) para preencher a tabela de estados, isso estava na direção de saída e (2) para pesquisar a tabela de estados, isso estava na direção de entrada.

Mas com o connntrack, vejo isso aplicado na cadeia INPUT, como esta regra:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Isso me faz pensar: o que essa afirmação realmente faz?

  • Está dizendo que começará a rastrear pacotes que correspondam a essa regra, colocando suas informações na tabela de estados?
  • Ou está dizendo que já possui as informações do estado e que vai agir contra as mensagens recebidas com base nelas? (por exemplo, aceitar se pertencessem a uma conexão previamente aceita?). Mas, neste caso, onde a tabela de estados foi preenchida? Qual regra faz isso? Ou é sem regras e implícito?

Responder1

Apresentação introdutória do Netfilter e conntrack

Primeiro o esquema obrigatório sobre fluxo de pacotes no Netfilter e General Networking:

Fluxo de pacotes no Netfilter e na rede geral

Netfilter é a estrutura de filtragem de pacotes que se insere no restante da pilha de rede (representada pela "decisão de roteamento" e outras partes brancas da caixa com bordas arredondadas). O Netfilter fornece ganchos e APIs para outros subsistemas e “clientes”. Entre essas peças estãoconexão(o rastreador de conexão) etabelas de ip(ounftáveis). A separação entre Netfilter econexãoé bastante confuso. Você pode apenas considerarconexãocomo parte integrada do Netfilter.

No esquema que descreve as várias etapas que um pacote percorre, você pode ver que em algum ponto (entre raw/PREROUTING e mangle/PREROUTING, ou entre raw/OUTPUT e mangle/OUTPUT) o pacote atravessaconexão.

Neste ponto,conexãoirá pesquisar em suas próprias tabelas de pesquisa (um mini banco de dados de pesquisa mantido na memória do kernel):

  • se as características deste pacote não forem encontradas (e se não for declarado UNTRACKED na tabela bruta), um novo conntrack bidirecionaltuplaentrada (protocolo, depois informações específicas da família e do protocolo: origem e porta iniciais, destino e porta iniciais, origem e porta de resposta, destino de resposta e porta (esses dois últimos são geralmente o inverso, a menos que NAT ou alguns protocolos estranhos estejam envolvidos, como echo resposta correspondente à solicitação de eco para ICMP)) que descreve o fluxo é criada com o estado NOVO.
  • se corresponder (em qualquer direção) a uma entrada anterior e for compatível com o estado deste fluxo, o estado do fluxo poderá ser alterado (ex.: mudar de NOVO para ESTABELECIDO se não fosse o caso antes).
  • se por algum motivo específico o pacote não puder corresponder a um fluxo existente apesar de ter suas características (por exemplo: um pacote TCP atrasado recebido após uma retransmissão já iniciada com sucesso, estando fora da janela em relação à sequência e aos valores SACK) o o pacote será marcado como INVÁLIDO.
  • existem alguns outros casos como RELATED: trata-se de pacotes que não fazem parte do fluxo em si, mas estão relacionados a um novo fluxo que pode ser associado a outro fluxo existente (ou seja: no banco de dados). Dois exemplos são um erro ICMP criado ao receber um pacote (por exemplo: porta UDP inacessível) ou quando um auxiliar de protocolo especial como o módulo do kernel nf_conntrack_ftp, que é um plugin para oconexãosubsistema, detecta que um pacote faz parte do fluxo de dados separado associado aos comandos FTP PASV/EPSV ou PORT/EPRT executados no fluxo de comando (na porta 21).

Respondendo à questão

Dito isso, aqui estão as respostas para seus dois marcadores:

  • no namespace da rede principalconexãocomeça a rastrear conexões assim que seus módulos (incluindo possíveis submódulos específicos de protocolo relevantes) são carregados. Para namespaces de rede não iniciais (contêineres...), isso também requer que algum outro subsistema faça referência a ele (como OP'stabelas de ipmódulo conntrack ou usando uma vez o comando conntrackdescrito posteriormente). Este é o padrão e um pacote deve ser especificamente marcado como UNTRACKEDantesoconexãoO subsistema vê que este pacote não é rastreado. No Linux, há apenas alguns casos em que o não rastreamento seria necessário, mas é claro que o firewall com estado e o NAT com estado/dinâmico não estarão mais disponíveis (o NAT estável, que pode até exigir o uso de UNTRACKED em primeiro lugar, ainda pode ser feito, mas não comtabelas de ip.tcounftáveispode). Evitarconexãolidando com alguns pacotes, esse tipo detabelas de ipregra pode ser usada (por exemplo: porta 80/tcp):

    iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
    iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
    
  • Quando o pacote atravessa o filtro/ENTRADA e atinge esta regra:

     iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    Otabelas de ipO módulo específico do kernel xt_conntrackconsulta oconexãosubsistema (tratado pelos vários módulos relevantes do kernel nf_conntrack*) e pergunta sobre o estado deste pacote em seu banco de dados de pesquisa. Se a resposta for RELATEDou ESTABLISHEDo pacote corresponder e prossiga para o veredicto ACCEPT. Na verdade o resultado já estáarmazenado em cacheo pacotea primeira vez que a pesquisa foi feita (geralmente porconexão) então esta é uma "pesquisa" barata. Esta é, portanto, uma regra genérica para lidar com fluxos já aceitos anteriormente. Esses fluxos podem ser inicialmente aceitos em regras que os mencionam explicitamente -m conntrack --ctstate NEWou simplesmente em regras que não os mencionam, mas colocadasdepoisesta regra genérica (mas tenha em mente o estado INVALID, que normalmente deve ser descartado antes de fazê-lo).

  • adicionando um marcador: o tratamento de pacotes de entrada e de saída é bastante simétrico entre PREROUTING e OUTPUT (mesmo que estes não pareçam simétricos):conexãointerfaces em PREROUTING, bem como em OUTPUT (e em alguns outros lugares, considerandoNATestá trabalhando comconexão, exceto pelo seu primeiro pacote no estado NEW atravessandotabelas de ipda tabela nat). Isso pode ser um pouco diferente da descrição que você escreveu sobre o IPFW. Se um servidor que executa aplicativos também estiver restringindo fluxos de saída, provavelmente precisará deste mesmo genéricotabelas de ipregra tanto em filtro/SAÍDA quanto em filtro/ENTRADA, para permitir a passagem de pacotes de resposta de saída de tráfego de entrada já aceito.


Informações adicionais

Existem ferramentas dedicadas para interagir com oconexãotabelas de pesquisa do subsistema deferramentas conntrack.

  • conntrack: para consultar, excluir ou atualizar o conteúdo das tabelas de pesquisa tratadas porconexão.

    Alguns exemplos.

    Você pode listar todas as entradas rastreadas (que podem ser grandes sem filtro adicional) com:

    conntrack -L
    

    Se o seu sistema estiver executando NAT (por exemplo, um roteador na frente de uma LAN privada ou executando VMs e contêineres), você poderá usar ou --any-natexibir apenas resp. todo NAT, todo NAT de origem (mascarado) ou todo NAT de destino (normalmente para portas encaminhadas):--src-nat--dst-nat

    Monitoramento em tempo real deconexãoeventos:

    conntrack -E
    
  • conntrackd: um daemon cujos dois propósitos principais são (conntrack) contabilidade e estatísticas de fluxo, oucluster de firewall com estado de alta disponibilidadesincronização de estado.

Responder2

O rastreamento de conexão é uma função separada do Netfilter e não é configurado com IPTables.

insira a descrição da imagem aqui

Na imagem, existem duas conntracketapas no caminho INPUT e uma no caminho OUTPUT. Estas etapas associam pacotes individuais a conexões existentes rastreadas na tabela de rastreamento de conexões ou criam novas entradas de rastreamento de conexões na tabela.

A funcionalidade Conntrack é um módulo do kernel Linux e geralmente é incluída no kernel na configuração padrão.

A operação do Conntrack pode ser ajustada ajustando net.netfilter.nf_conntrackos valores do sysctl.

Sua segunda alternativa é o que acontece. As informações de estado são registradas pela função Conntrack, e a regra IPTables simplesmente consulta a tabela Conntrack para obter informações.

informação relacionada