IPTables – Entenda a diferença entre -I e -A
Posted by Diego Lima in Linux, Sysadmin, tags: firewall, iptables, LinuxOlhando 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:
- NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
- NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
- 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:
- NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
- NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
- NÃO será aplicada a terceira regra (aceitar conexões TCP, novas, com destino a porta 22)
- 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:
- NÃO será aplicada a primeira regra (aceitar todas conexões na interface de loopback)
- NÃO será aplicada a segunda regra (aceitar todas conexões já estabelecidas e relacionadas a estas)
- NÃO será aplicada a terceira regra (aceitar conexões TCP, novas, com destino a porta 22)
- 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:
- 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.
Entries (RSS)
Fala mlk!
Legal hein! IPTABLES MAN
Ve se escreve alguma coisa pra postar no eusouobozo.com.br tb!
Abraço!
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
Vou escrever um post depois explicando como montar um firewall básico e eficiente
Aí explico as políticas e como organizar as regras.
To esperando o post sobre como montar um firewall basico e eficiente!!!!!
Hehe!
Abraço!