Pesquisa de site

Fundamentos do Iptables: regras e comandos comuns de firewall


Introdução

Iptables é um firewall de software para distribuições Linux. Este guia de estilo de folha de dicas fornece uma referência rápida aos comandos iptables que criarão regras de firewall que são úteis em cenários comuns do dia a dia. Isso inclui exemplos de iptables para permitir e bloquear vários serviços por porta, interface de rede e endereço IP de origem.

Como usar este guia

  • A maioria das regras descritas aqui assume que seu iptables está configurado para DROP tráfego de entrada, por meio da política de entrada padrão, e você deseja permitir seletivamente o tráfego de entrada
  • Use as seções subsequentes aplicáveis ao que você está tentando alcançar. A maioria das seções não é baseada em nenhuma outra, então você pode usar os exemplos abaixo independentemente
  • Use o menu Conteúdo no lado direito desta página (em larguras de página largas) ou a função localizar do seu navegador para localizar as seções necessárias
  • Copie e cole os exemplos de linha de comando fornecidos, substituindo os valores destacados pelos seus próprios

Tenha em mente que a ordem de suas regras é importante. Todos esses comandos iptables usam a opção -A para anexar a nova regra ao final de uma cadeia. Se você quiser colocá-lo em outro lugar na cadeia, você pode usar a opção -I que permite especificar a posição da nova regra (ou colocá-la no início da cadeia não especificando um número de regra).

Nota: Ao trabalhar com firewalls, tome cuidado para não bloquear seu próprio servidor bloqueando o tráfego SSH (porta 22, por padrão). Se você perder o acesso devido às configurações do firewall, pode ser necessário conectar-se a ele por meio de um console baseado na Web para corrigir o acesso. Se estiver usando a DigitalOcean, você pode ler a documentação do produto Console de recuperação para obter mais informações. Uma vez conectado por meio do console, você pode alterar suas regras de firewall para permitir o acesso SSH (ou permitir todo o tráfego). Se suas regras de firewall salvas permitirem acesso SSH, outro método é reiniciar seu servidor.

Lembre-se de que você pode verificar seu conjunto de regras iptables atual com sudo iptables -S e sudo iptables -L.

Vamos dar uma olhada nos comandos do iptables!

Salvando Regras

As regras do Iptables são efêmeras, o que significa que precisam ser salvas manualmente para que persistam após uma reinicialização.

No Ubuntu, uma forma de salvar as regras do iptables é usar o pacote iptables-persistent. Instale-o com o apt assim:

  1. sudo apt install iptables-persistent

Durante a instalação, você será perguntado se deseja salvar suas regras de firewall atuais.

Se você atualizar suas regras de firewall e quiser salvar as alterações, execute este comando:

  1. sudo netfilter-persistent save

Outras distribuições do Linux podem ter maneiras alternativas de tornar as alterações do iptables permanentes. Consulte a documentação relevante para obter mais informações.

Listando e Excluindo Regras

Se você quiser aprender como listar e excluir regras do iptables, confira este tutorial: Como listar e excluir regras de firewall do Iptables.

Regras Geralmente Úteis

Esta seção inclui uma variedade de comandos iptables que criarão regras geralmente úteis na maioria dos servidores.

Permitindo conexões de loopback

A interface de loopback, também conhecida como lo, é o que um computador usa para encaminhar conexões de rede para si mesmo. Por exemplo, se você executar ping localhost ou ping 127.0.0.1, seu servidor executará ping em si mesmo usando o loopback. A interface de loopback também é usada se você configurar seu servidor de aplicativos para se conectar a um servidor de banco de dados com um endereço localhost. Como tal, você deve ter certeza de que seu firewall está permitindo essas conexões.

Para aceitar todo o tráfego em sua interface de loopback, execute estes comandos:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A OUTPUT -o lo -j ACCEPT

Permitindo conexões de entrada estabelecidas e relacionadas

Como o tráfego de rede geralmente precisa ser bidirecional – entrada e saída – para funcionar corretamente, é comum criar uma regra de firewall que permita o tráfego de entrada estabelecido e relacionado, para que o servidor permita o tráfego de retorno para conexões de saída iniciadas pelo servidor em si. Este comando permitirá que:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Permitindo conexões de saída estabelecidas

Você pode permitir o tráfego de saída de todas as conexões estabelecidas, que normalmente são a resposta a conexões de entrada legítimas. Este comando permitirá que:

  1. sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Permitindo que a Rede Interna acesse o Externo

Assumindo que eth0 é sua rede externa e eth1 é sua rede interna, isso permitirá que seu interno acesse o externo:

  1. sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Descartando pacotes inválidos

Alguns pacotes de tráfego de rede são marcados como inválidos. Às vezes, pode ser útil registrar esse tipo de pacote, mas geralmente é bom descartá-los. Faça isso com este comando:

  1. sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Bloqueando um endereço IP

Para bloquear conexões de rede que se originam de um endereço IP específico, 203.0.113.51 por exemplo, execute este comando:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j DROP

Neste exemplo, -s 203.0.113.51 especifica um endereço IP de origem de \203.0.113.51. O endereço IP de origem pode ser especificado em qualquer regra de firewall, incluindo uma regra de permissão.

Se você quiser rejeitar a conexão, o que responderá à solicitação de conexão com um erro \conexão recusada, substitua \DROP por \REJECT assim:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

Bloqueando conexões com uma interface de rede

Para bloquear conexões de um endereço IP específico, por exemplo 203.0.113.51, para uma interface de rede específica, por exemplo eth0, use este comando:

  1. iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

É igual ao exemplo anterior, com a adição de -i eth0. A interface de rede pode ser especificada em qualquer regra de firewall e é uma ótima maneira de limitar a regra a uma rede específica.

Serviço: SSH

Se você estiver usando um servidor sem um console local, provavelmente desejará permitir conexões SSH de entrada (porta 22) para poder se conectar e gerenciar seu servidor. Esta seção aborda como configurar seu firewall com várias regras relacionadas ao SSH.

Permitindo todos os SSH de entrada

Para permitir todas as conexões SSH de entrada, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões SSH estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitir SSH de entrada de endereço IP específico ou sub-rede

Para permitir conexões SSH de entrada de um endereço IP ou sub-rede específico, especifique a origem. Por exemplo, se você deseja permitir toda a sub-rede 203.0.113.0/24, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões SSH estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo SSH de saída

Se a política OUTPUT do seu firewall não estiver definida como ACCEPT e você quiser permitir conexões SSH de saída - seu servidor iniciando uma conexão SSH com outro servidor - você pode executar estes comandos:

  1. sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Permitir Rsync de entrada de endereço IP ou sub-rede específica

Rsync, que roda na porta 873, pode ser usado para transferir arquivos de um computador para outro.

Para permitir conexões rsync de entrada de um endereço IP ou sub-rede específico, especifique o endereço IP de origem e a porta de destino. Por exemplo, se você deseja permitir que toda a sub-rede 203.0.113.0/24 seja capaz de fazer rsync com seu servidor, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões rsync estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Serviço: Servidor Web

Servidores da Web, como Apache e Nginx, geralmente atendem a solicitações nas portas 80 e 443 para conexões HTTP e HTTPS, respectivamente. Se sua política padrão para tráfego de entrada for definida como descartar ou negar, você desejará criar regras que permitirão que seu servidor responda a essas solicitações.

Permitindo todos os HTTP de entrada

Para permitir todas as conexões HTTP (porta 80) recebidas, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões HTTP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os HTTPS recebidos

Para permitir todas as conexões HTTPS (porta 443) recebidas, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões HTTP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os HTTP e HTTPS de entrada

Se você deseja permitir o tráfego HTTP e HTTPS, pode usar o módulo multiportas para criar uma regra que permita ambas as portas. Para permitir todas as conexões HTTP e HTTPS (porta 443) de entrada, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões HTTP e HTTPS estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Serviço: MySQL

O MySQL escuta as conexões do cliente na porta 3306. Se seu servidor de banco de dados MySQL estiver sendo usado por um cliente em um servidor remoto, você precisa ter certeza de permitir esse tráfego.

Permitindo o MySQL de um endereço IP específico ou sub-rede

Para permitir conexões de entrada do MySQL de um endereço IP ou sub-rede específico, especifique a origem. Por exemplo, se você deseja permitir toda a sub-rede 203.0.113.0/24, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões MySQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo MySQL para Interface de Rede Específica

Para permitir conexões MySQL a uma interface de rede específica—digamos que você tenha uma interface de rede privada eth1, por exemplo—use estes comandos:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões MySQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Serviço: PostgreSQL

O PostgreSQL escuta as conexões do cliente na porta 5432. Se o seu servidor de banco de dados PostgreSQL estiver sendo usado por um cliente em um servidor remoto, você precisa ter certeza de permitir esse tráfego.

PostgreSQL de endereço IP específico ou sub-rede

Para permitir conexões de entrada do PostgreSQL de um endereço IP ou sub-rede específico, especifique a origem. Por exemplo, se você deseja permitir toda a sub-rede 203.0.113.0/24, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões PostgreSQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo PostgreSQL para Interface de Rede Específica

Para permitir conexões do PostgreSQL a uma interface de rede específica - digamos que você tenha uma interface de rede privada eth1, por exemplo - use estes comandos:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões PostgreSQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Serviço: Correio

Servidores de correio, como Sendmail e Postfix, atendem em várias portas, dependendo dos protocolos usados para entrega de correio. Se você estiver executando um servidor de correio, determine quais protocolos você está usando e permita os tipos apropriados de tráfego. Também mostraremos como criar uma regra para bloquear emails SMTP de saída.

Bloqueando Email SMTP de Saída

Se o seu servidor não deveria enviar e-mails de saída, convém bloquear esse tipo de tráfego. Para bloquear o correio SMTP de saída, que usa a porta 25, execute este comando:

  1. sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

Isso configura o iptables para rejeitar todo o tráfego de saída na porta 25. Se você precisar rejeitar um serviço diferente por seu número de porta, em vez da porta 25, substitua esse número de porta pelo 25 acima.

Permitindo todos os SMTP de entrada

Para permitir que seu servidor responda às conexões SMTP na porta 25, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões SMTP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os IMAP de entrada

Para permitir que seu servidor responda às conexões IMAP, porta 143, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões IMAP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os IMAPS de entrada

Para permitir que seu servidor responda às conexões IMAPS, porta 993, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões IMAPS estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os POP3 recebidos

Para permitir que seu servidor responda às conexões POP3, porta 110, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões POP3 estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo todos os POP3S recebidos

Para permitir que seu servidor responda às conexões POP3S, porta 995, execute estes comandos:

  1. sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

O segundo comando, que permite o tráfego de saída de conexões POP3S estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Conclusão

Isso deve abranger muitos dos comandos comumente usados ao configurar um firewall iptables. Obviamente, o iptables é uma ferramenta muito flexível, portanto, sinta-se à vontade para misturar e combinar os comandos com diferentes opções para atender às suas necessidades específicas, caso não sejam abordadas aqui.

Se você está procurando ajuda para determinar como seu firewall deve ser configurado, confira este tutorial: Como escolher uma política de firewall eficaz para proteger seus servidores.