Mateus Müller

O carinha do Linux

18 out. 2018

O guia COMPLETO do iniciante em Iptables

Esse nome assusta né? Todo mundo “treme na base” quando o assunto é Iptables. Todavia, para matar este mito eu preparei para você o guia COMPLETO do iniciante em Iptables, onde você vai tirar todas as suas dúvidas e poder dar seus primeiros passos protegendo seu sistema.

Mas, antes de trabalharmos com o Iptables, temos que saber o que é um firewall. O firewall é um “filtrador de pacotes”, ou também conhecido, packet filtering, atuando na camada 3 do modelo OSI. Seu objetivo é controlar o que pode entrar, e o que pode sair da sua rede.

Nada representa melhor do que essa figura:

Então, imagine uma situação onde instalamos um servidor Web, e ele roda na porta 80. Para que alguém consiga se conectar na nossa porta 80, precisamos falar: “firewall, pode abrir a porta 80, por favor”. Ele é quem decide quem conecta e quem não conecta.

O que é o Iptables?

O famoso Iptables é o firewall nativo do Linux, estando disponível em praticamente todas (se não todas) as distribuições Linux. O Linux em si possui um módulo que controla esse fluxo de pacotes chamado de Netfilter. O Iptables não é nada mais, nada menos, do que um_ front-end_ para o Netfilter.

Desta forma, sabendo administrar o Iptables, você conseguirá trabalhar em qualquer distribuição Linux. Faremos alguns exemplos no Debian Stretch.

Conceitos do Iptables

Vejo que, a parte mais confusa para quem está começando, é entender os conceitos básicos para a criação das regras. Vamos abordar os conceitos em Inglês para não sair do padrão do Iptables.

Table

Note que, toda e qualquer regra do Iptables será aplicada em uma table, que é simplesmente o contexto geral da nossa regra. Por exemplo, as regras normais de entrada e saída de dados serão aplicadas na table padrão filter. Outra table bem comum é a nat, usada para fazer Network Address Translation (basicamente, converter IP privado em IP público).

Chain

Depois, temos a chain, que é o que vem depois da table. No nosso caso, a table filter possui as chains INPUT, FORWARD e OUTPUT. Já a table nat, possui as chains PREROUTING, INPUT, OUTPUT e POSTROUTING.

Então vamos lá:

  • INPUT: Regras para pacotes que estão entrando no nosso servidor.
  • OUTPUT: Regras para que estão saindo do nosso servidor.
  • FORWARD: Regras para pacotes que estão entrando no nosso servidor, e está sendo redirecionada para outro ponto.
  • Agora, vamos fazer um exemplo prático. Pense novamente no mesmo caso, onde temos um servidor Web que está rodando na porta 80.

    Se um outro host se conectar no nosso servidor Web usando a URL http://ipdoservidor, essa request vai cair na chain de INPUT.

    Se, do nosso servidor Web, tentarmos acessar um outro host via SSH, essa request vai cair na chain de OUTPUT (porque está saíndo do nosso equipamento).

    Agora, se recebermos uma request e ela for redirecionada para outro host, essa request vai cair na chain de FORWARD.

    Sendo assim, devemos criar as regras e ações que serão tomadas em cada chain.

    Special Value

    Já o famoso special value é a ação que vamos tomar quando uma determinada regra for atingida. Neste caso, temos o ACCEPT, DROP e REJECT.

    Então vamos lá:

  • ACCEPT: O pacote será aceito no nosso servidor.
  • DROP: O pacote será dropado, isso é, descartado.
  • REJECT: O pacote será rejeitado, isso é, será enviado um sinal para o cliente de que o pacote foi rejeitado.
  • Iptables na prática

    Listar e Limpar regras no Iptables

    Vamos botar a mão na massa!

    Para listar as regras que temos no nosso equipamento:

  • $ iptables -L # Mostra regras da table default (filter)
  • $ iptables -t nat -L # Mostra regras da table nat
  • Para limpar todas as regras:

  • $ iptables -F
  • Exemplo com regra ICMP no Iptables

    Uma coisa interessante para você saber é que as regras são lidas de cima para baixo. Então, a primeira condição que bater, será aplicada.

    O que a maioria dos administradores de sistemas fazem é primeiro dropar todos os pacotes de todas as chains. E então, criar as exceções somente para os serviços que forem ser utilizados.

    Neste caso:

  • $ iptables -A INPUT -j DROP
  • $ iptables -A OUTPUT -j DROP
  • $ iptables -A FORWARD -j DROP
  • O parâmetro -A significa append. Isto é, adicionar no final da chain. O -j é o parâmetro que define a ação que será tomada (special value).

    Se você tentar rodar o comando ping para o servidor, ele irá dropar. Se tentar rodar o ping do servidor para outro, também será dropado (visto tráfego de OUTPUT).

    Agora, imagine que queremos criar uma exceção para aceitar o comando ping. Para isso, não podemos utilizar o parâmetro -A, pois a regra será colocada no final da chain. Lembre-se que a condição será verificada de cima para baixo, e a primeira regra que bater, será executada a ação. Entretanto, podemos utilizar o parâmetro -I para inserir uma nova regra no topo da chain.

  • $ iptables -I INPUT -p icmp -j ACCEPT # Aceita pacotes ICMP
  • $ iptables -I OUTPUT -p icmp -j ACCEPT # Envia pacotes ICMP
  • Alterando a ação padrão no Iptables

    Se você listar as regras do Iptables, verá que a policy padrão é de ACCEPT. Podemos mudar para sempre ir para drop. Isto é, sempre que você der um flush nas regras, ele volta para o padrão que é dropar.

    • $ iptables -P INPUT DROP

    • $ iptables -P OUTPUT DROP

    • $ iptables -P FORWARD DROP

    Outro uso bem comum é apontar um endereço para habilitar o tráfego:

  • $ iptables -I INPUT -s 192.168.25.2 ACCEPT # Aceita qualquer tráfego do IP 192.168.25.2.
  • $ iptables -I INPUT -s 192.168.25.0/24 ACCEPT # Aceita qualquer tráfego da rede 192.168.25.0/24.
  • Entretanto, se você não sabe o que significa esse /24, veja o vídeo abaixo.

    Enfim, se você quiser uma parte dois deste artigo de Iptables, comenta aí no post!

    Espero que tenha gostado desta dica!

    Não esqueça de nos seguir no Instagram para receber os últimos conteúdos!

    Participe dos nossos grupos no Telegram e Facebook! 🙂

    Veja também:

    Se tiver alguma dúvida ou sugestão de conteúdo, por favor, comente!

    Comentários Disqus