![Quando o módulo conntrack do iptable rastreia os estados dos pacotes?](https://rvso.com/image/756248/Quando%20o%20m%C3%B3dulo%20conntrack%20do%20iptable%20rastreia%20os%20estados%20dos%20pacotes%3F.png)
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:
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
conntrack
descrito 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_conntrack
consulta oconexãosubsistema (tratado pelos vários módulos relevantes do kernelnf_conntrack*
) e pergunta sobre o estado deste pacote em seu banco de dados de pesquisa. Se a resposta forRELATED
ouESTABLISHED
o 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 NEW
ou 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-nat
exibir 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.
Na imagem, existem duas conntrack
etapas 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_conntrack
os 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.