Introdução
O Iptables é um firewall de software para distribuições Linux. Este guia no estilo de uma folha de dicas fornece uma referência rápida para os comandos do iptables que criarão regras de firewall ú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á definido 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 forem 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údo 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 é importante. Todos esses comandos iptables
usam a opção -A
para anexar a nova regra ao final de uma cadeia. Se você quiser colocá-la em outro lugar na cadeia, 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, tenha cuidado para não bloquear o acesso ao seu próprio servidor bloqueando o tráfego SSH (porta 22, por padrão). Se você perder o acesso devido às configurações do seu firewall, talvez seja necessário se conectar a ele por meio de um console baseado na web para corrigir o acesso. Se estiver usando o DigitalOcean, você pode ler nossa documentação do produto Console de Recuperação para obter mais informações. Depois de conectado via 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 atual de regras do iptables 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 elas precisam ser salvas manualmente para persistirem após uma reinicialização.
No Ubuntu, uma maneira de salvar as regras do iptables é usar o pacote iptables-persistent
. Instale-o com o apt desta forma:
Durante a instalação, você será perguntado se deseja salvar as regras do seu firewall atual.
Se você atualizar suas regras do firewall e quiser salvar as alterações, execute este comando:
Outras distribuições Linux podem ter maneiras 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 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 loopback, também referida 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 a 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:
Permitindo Conexões de Entrada Estabelecidas e Relacionadas
Como o tráfego de rede geralmente precisa ser bidirecional – de 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 tráfego de retorno para conexões de saída iniciadas pelo próprio servidor. Este comando permitirá isso:
Permitindo Conexões de Saída Estabelecidas
Pode ser que queira permitir o tráfego de saída de todas as conexões estabelecidas, que são geralmente a resposta a conexões legítimas de entrada. Este comando permitirá isso:
Permitir que a Rede Interna acesse a Externa
Supondo que eth0
seja sua rede externa, e eth1
seja sua rede interna, isso permitirá que sua rede interna acesse a externa:
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 é seguro descartá-los. Faça isso com este comando:
Bloqueando um Endereço IP
Para bloquear conexões de rede que se originam de um endereço IP específico, por exemplo, 203.0.113.51
, execute este comando:
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ê deseja 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:
Bloquear 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:
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 possa se conectar e gerenciar seu servidor. Esta seção aborda 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 esses comandos:
O segundo comando, que permite o tráfego de saída das conexões SSH estabelecidas, só é necessário 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 desejar permitir a sub-rede inteira 203.0.113.0/24
, execute esses comandos:
O segundo comando, que permite o tráfego de saída das conexões SSH estabelecidas, só é necessário 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 estes comandos:
Permitindo Rsync de Entrada de um Endereço IP ou Sub-rede Específicos
O Rsync, que roda na porta 873, pode ser usado para transferir arquivos de um computador para outro.
Para permitir conexões de rsync de entrada de um endereço IP ou sub-rede específicos, 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 usar o rsync para transferir para o seu servidor, execute estes comandos:
O segundo comando, que permite o tráfego de saída de conexões rsync estabelecidas, é apenas necessário se a política de SAÍDA
não estiver definida como ACEITAR
.
Serviço: Servidor Web
Os servidores web, como o Apache e o Nginx, geralmente escutam pedidos nas portas 80 e 443 para conexões HTTP e HTTPS, respectivamente. Se a política padrão para tráfego de entrada estiver definida como drop ou deny, você vai querer criar regras que permitam que seu servidor responda a esses pedidos.
Permitindo todas as conexões HTTP de entrada
Para permitir todas as conexões HTTP de entrada (porta 80), execute esses comandos:
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
.
Permitindo todas as conexões HTTPS de entrada
Para permitir todas as conexões HTTPS de entrada (porta 443), execute esses comandos:
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
.
Permitindo todas as conexões HTTP e HTTPS de entrada
Se você deseja permitir tanto o tráfego HTTP quanto o HTTPS, você 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 esses comandos:
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 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ífica
Para permitir conexões MySQL de entrada de um endereço IP ou sub-rede específica, especifique a origem. Por exemplo, se você quiser permitir toda a sub-rede 203.0.113.0/24, execute esses comandos:
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 uma 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:
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 por conexões de cliente na porta 5432. Se o seu servidor de banco de dados PostgreSQL está sendo usado por um cliente em um servidor remoto, você precisa garantir que esse tráfego seja permitido.
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 estes comandos:
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 para uma Interface de Rede Específica
Para permitir conexões do PostgreSQL para uma interface de rede específica – digamos que você tenha uma interface de rede privada eth1
, por exemplo – utilize estes comandos:
O segundo comando, que permite o tráfego de saída das conexões do PostgreSQL estabelecidas, é necessário apenas se a política OUTPUT
não estiver definida como ACCEPT
.
Serviço: Correio
Servidores de correio, como Sendmail e Postfix, escutam em uma variedade de portas, dependendo dos protocolos usados para a entrega de correio. Se você estiver executando um servidor de correio, 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 correio SMTP.
Bloqueando o Envio de Correio SMTP
Se o seu servidor não deve enviar correio de saída, você pode querer bloquear esse tipo de tráfego. Para bloquear o envio de correio SMTP, que usa a porta 25, execute este comando:
Isso configura o iptables para rejeitar todo o tráfego de saída na porta 25. Se precisar rejeitar um serviço diferente pelo seu número de 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 estes comandos:
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 Todas as Conexões IMAP de Entrada
Para permitir que seu servidor responda a conexões IMAP, porta 143, execute estes comandos:
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 Todas as Conexões IMAPS de Entrada
Para permitir que seu servidor responda a conexões IMAPS, porta 993, execute esses comandos:
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 Todas as Conexões POP3 de Entrada
Para permitir que seu servidor responda a conexões POP3, porta 110, execute esses comandos:
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 Todas as Conexões POP3S de Entrada
Para permitir que seu servidor responda a conexões POP3S, porta 995, execute esses comandos:
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 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 eles não forem abordados 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.