Essenciais do Iptables: Regras e comandos de firewall comuns

Introdução

O Iptables é um firewall de software para distribuições Linux. Este guia em formato de folha de trapaça fornece uma referência rápida aos comandos do iptables que criarão regras de firewall úteis em cenários comuns do dia a dia. Isso inclui exemplos do iptables de 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 o tráfego de entrada, através da política de entrada padrão, e você deseja permitir seletivamente o tráfego de entrada
  • Use as seções subsequentes que são 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 de forma independente
  • Use o menu de Conteúdos no lado direito desta página (em larguras de página amplas) ou a função de busca do seu navegador para localizar as seções de que precisa
  • Copie e cole os exemplos de linha de comando fornecidos, substituindo os valores destacados pelos seus próprios

Tenha em mente que a ordem das suas regras importa. 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 o acesso ao seu próprio servidor ao bloquear o tráfego SSH (porta 22, por padrão). Se perder o acesso devido às configurações do firewall, pode ser necessário se conectar a ele via console baseado na web para corrigir seu acesso. Se estiver usando o DigitalOcean, você pode ler nossa documentação do produto Recovery Console para obter mais informações. Depois de conectado através do console, você pode alterar as regras do seu firewall para permitir o acesso SSH (ou permitir todo o tráfego). Se as regras do seu firewall salvas permitirem o acesso SSH, outro método é reiniciar o 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 iptables!

Salvando Regras

As regras do Iptables são efêmeras, o que significa que precisam ser salvas manualmente para persistirem após um reinício.

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

  1. sudo apt install iptables-persistent

Ao instalar, você será perguntado se deseja salvar suas regras de firewall atuais.

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

  1. sudo netfilter-persistent save

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

Listagem e Exclusão de Regras

Se você quiser aprender como listar e excluir regras do iptables, confira este tutorial: Como Listar e Excluir Regras do Firewall do Iptables.

Regras Geralmente Úteis

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

Permitindo Conexões de Loopback

A interface loopback, também conhecida como lo, é o que um computador utiliza para encaminhar conexões de rede para si mesmo. Por exemplo, se você executar ping localhost ou ping 127.0.0.1, seu servidor irá fazer ping em si mesmo usando o loopback. A interface loopback também é utilizada 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ê vai querer ter certeza de que seu firewall está permitindo essas conexões.

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

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

Como o tráfego de rede geralmente precisa ser de dois sentidos – entrada e saída – para funcionar corretamente, é típico criar uma regra de firewall que permita 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 próprio servidor. Este comando permitirá isso:

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

Permitindo Conexões de Saída Estabelecidas

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

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

Permitindo que a Rede Interna acesse a Externa

Assumindo que eth0 é sua rede externa, e eth1 é sua rede interna, isso permitirá que sua rede interna acesse a externa:

  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 este tipo de pacote, mas frequentemente é aceitável 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 têm origem em um endereço IP específico, como 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 permitir.

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

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

Bloqueando Conexões para 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

Isso é o mesmo que o 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 que você possa se conectar e gerenciar seu servidor. Esta seção cobre como configurar seu firewall com várias regras relacionadas ao SSH.

Permitir todas as conexões 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 das conexões SSH estabelecidas, é necessário apenas se a política OUTPUT não estiver definida como ACCEPT.

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

Para permitir conexões SSH de entrada de um endereço IP específico ou sub-rede, 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 das conexões SSH estabelecidas, é necessário apenas se a política OUTPUT não estiver definida como ACCEPT.

Permitir SSH de saída

Se a política de saída do seu firewall não estiver definida como ACEITAR e você deseja permitir conexões SSH de saída — seu servidor iniciando uma conexão SSH com outro servidor — você pode executar esses 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

Permitindo Rsync de Entrada de um Endereço IP Específico ou Sub-rede

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

Para permitir conexões Rsync de entrada de um endereço IP específico ou sub-rede, 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 possa sincronizar com seu servidor, execute esses 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, é necessário apenas se a política de saída não estiver definida como ACEITAR.

Serviço: Servidor Web

Servidores web, como Apache e Nginx, geralmente aguardam solicitações nas portas 80 e 443 para conexões HTTP e HTTPS, respectivamente. Se sua política padrão para o tráfego de entrada estiver configurada para descartar ou negar, você vai querer criar regras que permitam que seu servidor responda a essas solicitações.

Permitir todas as conexões HTTP de entrada

Para permitir todas as conexões HTTP de entrada (porta 80), 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 das conexões HTTP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitir todas as conexões HTTPS de entrada

Para permitir todas as conexões HTTPS de entrada (porta 443), 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 das conexões HTTP estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitir todas as conexões HTTP e HTTPS de entrada

Se você deseja permitir tanto o tráfego HTTP quanto o HTTPS, pode usar o módulo multiport para criar uma regra que permita ambas as portas. Para permitir todas as conexões HTTP e HTTPS de entrada (porta 443), 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 das 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 conexões de clientes na porta 3306. Se o seu servidor de banco de dados MySQL estiver sendo usado por um cliente em um servidor remoto, você precisa garantir que esse tráfego seja permitido.

Permitindo MySQL de um Endereço IP ou Sub-rede Específicos

Para permitir conexões MySQL de entrada de um endereço IP ou sub-rede específicos, especifique a origem. Por exemplo, se você deseja permitir a sub-rede inteira 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 das conexões MySQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo MySQL para uma Interface de Rede Específica

Para permitir conexões MySQL para uma interface de rede específica – digamos que você tenha uma interface de rede privada eth1, por exemplo – use esses 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 das conexões MySQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Serviço: PostgreSQL

O PostgreSQL escuta conexões de cliente na porta 5432. Se seu servidor de banco de dados PostgreSQL estiver sendo usado por um cliente em um servidor remoto, você precisa garantir que permita esse tráfego.

PostgreSQL de Endereço IP ou Sub-rede Específica

Para permitir conexões PostgreSQL de entrada de um endereço IP específico ou sub-rede, especifique a origem. Por exemplo, se você deseja permitir a sub-rede inteira 203.0.113.0/24, execute esses 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 das conexões PostgreSQL estabelecidas, só é necessário se a política OUTPUT não estiver definida como ACCEPT.

Permitindo o PostgreSQL em uma Interface de Rede Específica

Para permitir conexões do PostgreSQL em uma interface de rede específica — digamos que você tenha uma interface de rede privada eth1, por exemplo —, utilize 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 das conexões do PostgreSQL estabelecidas, só é necessário se a política de OUTPUT não estiver definida como ACCEPT.

Serviço: E-mail

Servidores de e-mail, como Sendmail e Postfix, escutam em uma variedade de portas dependendo dos protocolos usados para a entrega de e-mails. Se você estiver executando um servidor de e-mail, determine quais protocolos está usando e permita os tipos apropriados de tráfego. Também mostraremos como criar uma regra para bloquear o envio de e-mails SMTP.

Bloqueando o Envio de E-mails SMTP

Se o seu servidor não deve enviar e-mails de saída, você pode querer bloquear esse tipo de tráfego. Para bloquear e-mails SMTP de saída, que utilizam 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 pelo número da porta, em vez da porta 25, substitua esse número de porta pelo 25 acima.

Permitindo Todas as Conexões SMTP de Entrada

Para permitir que seu servidor responda a conexões SMTP na porta 25, execute esses 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 de OUTPUT não estiver definida como ACCEPT.

Permitindo Todas as Conexões IMAP de Entrada

Para permitir que seu servidor responda a conexões IMAP, porta 143, execute esses 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 de OUTPUT não estiver definida como ACCEPT.

Permitindo Todas as Conexões IMAPS de Entrada

Para permitir que o seu servidor responda a conexões IMAPS, porta 993, execute esses 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, é apenas necessário se a política de OUTPUT não estiver definida como ACCEPT.

Permitindo Todas as Conexões POP3 de Entrada

Para permitir que o seu servidor responda a conexões POP3, porta 110, execute esses 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, é apenas necessário se a política de OUTPUT não estiver definida como ACCEPT.

Permitindo Todas as Conexões POP3S de Entrada

Para permitir que o seu servidor responda a conexões POP3S, porta 995, execute esses 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, é apenas necessário se a política de OUTPUT não estiver definida como ACCEPT.

Conclusão

Isso deve cobrir muitos dos comandos comumente usados ao configurar um firewall iptables. Claro, o iptables é uma ferramenta muito flexível, então sinta-se à vontade para misturar e combinar os comandos com diferentes opções para atender às suas necessidades específicas se elas não estiverem cobertas 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.

Source:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands