Inversas implícitas para regras NAT iptables

2

O iptables adiciona implícita e automaticamente as regras de inversão / inversão para cada regra NAT adicionada explicitamente?

Normalmente, assumindo uma política DROP, para cada regra INPUT na tabela de filtros existe uma regra OUTPUT correspondente que aceita tráfego relacionado ou estabelecido (e vice-versa). Por exemplo, para permitir que o SSH de entrada passe por um firewall iptables, haveria uma regra INPUT para permitir que conexões de entrada fossem estabelecidas:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

Mas também haveria uma regra OUTPUT correspondente permitindo o tráfego de retorno:

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Embora esse tipo de regra de tráfego reverso explícito seja necessário na tabela de filtros, parece que esse não é o caso da tabela NAT.

Considere os seguintes trechos de várias referências não oficiais:

  1. Oceano Digital: um mergulho profundo na arquitetura Iptables e Netfilter

Certain events will cause a table's chain to be skipped during processing. For instance, only the first packet in a connection will be evaluated against the NAT rules. Any nat decisions made for the first packet will be applied to all subsequent packets in the connection without additional evaluation. Responses to NAT'ed connections will automatically have the reverse NAT rules applied to route correctly.

  1. Superusuário: funcionamento interno de regras em cadeia de encaminhamento para NAT

But netfilter (i.e., the packet filtering/mangling framework that's the 'engine' of iptables) is smart enough. Whenever an incoming [NAT] packet is received, it's matched with netfilter's conntrack table. If the packet is a reply to an existing outgoing connection (ACK flag set, matching IP:port, matching TCP sequence number, etc), netfilter automatically performs DNAT. No need for additional rules.

  1. Karl Rupp: NAT Tutorial

Fortunately the netfilter framework automatically adds to each rule its inverse rule, therefore we only have to set one explicit rule. Usually the decision for one of these two rules is made by taking the one with the lower level of undetermination. For example, the rule 'Replace the sender's address for all packets from the local subnet' is much easier than 'if a client has sent something to a server, then replace the receipient in the server's response by something'. As a rule of thumb can be used that the rule that is executed first is the one that is set explicitly in the kernel.

Examinei a documentação oficial do netfilter , mas não consegui encontrar esse comportamento mencionado em nenhum lugar. Existe uma referência oficial que corrobore as reivindicações anteriores?

    
por igal 15.11.2017 / 23:05

1 resposta

0

Does iptables implicitly and automatically add the reverse/inverse rules for every NAT rule that is added explicitly?

Não exatamente

Suas duas primeiras citações estão corretas, a terceira é divagações confusas de alguém que não entende como o sistema funciona.

iptables nat (ao contrário da filtragem iptables) funciona em conexões. O primeiro pacote da conexão passa pelas tabelas nat e é traduzido de acordo com ele. Pacotes posteriores pertencentes à mesma conexão não passam pelas tabelas nat. Eles são simplesmente traduzidos de acordo com as regras estabelecidas quando o primeiro pacote foi traduzido.

A página do manual iptables link documenta que a tabela nat é consultada para "o primeiro pacote de uma conexão" e a seção man page para o alvo DNAT e SNAT diz "(e todos os futuros pacotes nesta conexão também serão desconfigurados)".

Infelizmente, não vi nenhuma documentação oficial que seja mais aprofundada do que isso. Minha referência para o iptables é o tutorial frozentux do iptables, mas eu não acho que seja oficial.

    
por 06.03.2018 / 22:32