Olhando as buscas que os visitantes do blog usaram para chegar aqui pude ver que mais de uma pessoa pesquisou por algo como “iptables diferença entre -I e -A”. Resolvi então escrever um pequeno tutorial explicando como é o fluxo dos pacotes e o processamento destes pelo iptables.

Ambos comandos adicionam regras no firewall, e a diferença é a ordem em que essas são incluídas:

  • -I : Insere regras no topo das já existentes (Insert)
  • -A : Adiciona regras abaixo das já existentes (Append)

Isto responderia a pergunta de forma resumida, mas para saber o que isso significa, continue lendo!

É importante conhecer a forma de processamento das regras do iptables quando vamos decidir se queremos uma nova regra no topo ou no final das já existentes. O IPTables realiza a comparação com as regras de cima para baixo e assim que um pacote atinge os critérios de uma regra a ação dela é aplicada e o pacote não passará pelas de baixo.

Portanto, se temos as seguintes regras na tabela INPUT:

# iptables -nvL
Chain INPUT (policy DROP 12078 packets, 1298K bytes)
pkts bytes target     prot opt in     out     source               destination         
57  6228 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
147K  144M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
69  4140 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW /* SSH Server */

Um pacote TCP, iniciando uma nova conexão, com destino a porta 22 passará pelas seguintes fases:

  1. NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
  2. NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
  3. SERÁ APLICADA a terceira regra ( aceitar conexões TCP, novas, com destino a porta 22)

O processamento do pacote irá parar neste ponto. É importante lembrar que, caso os pacotes não sejam processados por nenhuma das regras a política padrão da tabela será aplica (no caso do exemplo acima, DROP). Então, um pacote tcp com destino a porta 80, iniciando uma nova conexão, seria processado da seguinte maneira:

  1. NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
  2. NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
  3. NÃO será aplicada a terceira regra (aceitar conexões TCP, novas, com destino a porta 22)
  4. A política padrão será aplicada neste pacote (DROP)

Vamos agora adicionar mais uma regra:

# iptables -A INPUT -p tcp --dport 80 -j REJECT

Após aplicar esta regra nosso firewall ficaria da seguinte forma:

# iptables -nvL
Chain INPUT (policy DROP 12078 packets, 1298K bytes)
pkts bytes target     prot opt in     out     source               destination         
57  6228 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
147K  144M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
69  4140 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW /* SSH Server */
0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 reject-with icmp-port-unreachable

Agora o pacote tcp com destino à porta 80 não seria mais descartado devido a política padrão da tabela, e sim rejeitado. A diferença entre o DROP e o REJECT é que o REJECT envia uma mensagem de erro utilizando o protocolo ICMP para informar que a conexão foi recusada. Um reject produz um erro de “conexão recusada (connection refused)” enquanto um drop produz um erro de timeout (connection timeout).

O processamento do pacote, neste caso, seria o seguinte:

  1. NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
  2. NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
  3. NÃO será aplicada a terceira regra (aceitar conexões TCP, novas, com destino a porta 22)
  4. SERÁ APLICADA a quarta regra (REJECT)

Vamos supor agora que desejamos aceitar conexões TCP novas e já estabelecidas na porta 80 mas ainda queremos rejeitar ativamente pacotes em outros estados. Para isso seria necessário adicionar a regra ANTES do REJECT. Portanto:

# iptables -I INPUT -p tcp --dport 80 -m state --state new -j ACCEPT

Isso vai fazer com que nossa tabela INPUT fique da seguinte forma:

# iptables -nvL
Chain INPUT (policy DROP 12078 packets, 1298K bytes)
pkts bytes target     prot opt in     out     source               destination         
0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 state NEW
57  6228 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
147K  144M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
69  4140 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW /* SSH Server */
0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 reject-with icmp-port-unreachable

Neste caso um pacote novo com destino à porta 80 seria processado da seguinte forma:

  1. SERÁ APLICADA a primeira regra (aceitar todas conexões TCP novas com destino a porta 80 )

O restante das regras seriam ignoradas. Após o estabelecimento das conexões novas as conexões já existentes seriam aceitas pela terceira regra. Outros tipos de conexão com destino a porta 80 seriam rejeitadas pela última regra.

4 Responses to “IPTables – Entenda a diferença entre -I e -A”
  1. Diogo says:

    Fala mlk!

    Legal hein! IPTABLES MAN

    Ve se escreve alguma coisa pra postar no eusouobozo.com.br tb!

    Abraço!

  2. Eder says:

    Não tem uma regra básica, tipo, colocar os REJECTS sempre no início da lista?
    Fala mais de IPTables…
    Mto bom o post..
    []s

  3. Diego Lima says:

    Vou escrever um post depois explicando como montar um firewall básico e eficiente :) Aí explico as políticas e como organizar as regras.

  4. DIogo says:

    To esperando o post sobre como montar um firewall basico e eficiente!!!!!

    Hehe!

    Abraço!

  5.  
Leave a Reply