O Guia do Iniciante em iptables, o Firewall Linux
Iptables é um utilitário de firewall extremamente flexível desenvolvido para sistemas operacionais Linux. Quer você seja um novato em Linux ou um administrador de sistema, provavelmente existe uma maneira em que o iptables pode ser uma grande utilidade para você. Continue lendo enquanto mostramos como configurar o firewall Linux mais versátil.
foto por Ezioman.
Sobre iptables
iptables é um utilitário de firewall de linha de comando que usa cadeias de políticas para permitir ou bloquear o tráfego. Quando uma conexão tenta se estabelecer em seu sistema, o iptables procura por uma regra em sua lista para combiná-la. Se não encontrar um, ele recorre à ação padrão.
O iptables quase sempre vem pré-instalado em qualquer distribuição Linux. Para atualizá-lo / instalá-lo, basta recuperar o pacote iptables:
sudo apt-get install iptables
Existem alternativas de GUI para iptables como Firestarter, mas iptables não é tão difícil assim que você tem alguns comandos disponíveis. Você deve ser extremamente cuidadoso ao configurar as regras de iptables, especialmente se estiver usando SSH em um servidor, porque um comando errado pode bloqueá-lo permanentemente até que seja corrigido manualmente na máquina física.
Tipos de cadeias
O iptables usa três cadeias diferentes: entrada, encaminhamento e saída.
Entrada - Esta cadeia é usada para controlar o comportamento das conexões de entrada. Por exemplo, se um usuário tentar fazer SSH em seu PC / servidor, o iptables tentará combinar o endereço IP e a porta com uma regra na cadeia de entrada.
Avançar - Esta cadeia é usada para conexões de entrada que não estão realmente sendo entregues localmente. Pense em um roteador - os dados estão sempre sendo enviados a ele, mas raramente são realmente destinados ao próprio roteador; os dados são apenas encaminhados para seu destino. A menos que você esteja fazendo algum tipo de roteamento, NAT, ou algo mais em seu sistema que exija encaminhamento, você nem mesmo usará esta cadeia.
Há uma maneira infalível de verificar se o seu sistema usa / precisa ou não da corrente direta.
iptables -L -v
A captura de tela acima é de um servidor que está funcionando há algumas semanas e não tem restrições para conexões de entrada ou saída. Como você pode ver, a cadeia de entrada processou 11 GB de pacotes e a cadeia de saída processou 17 GB. A cadeia de encaminhamento, por outro lado, não precisa processar um único pacote. Isso ocorre porque o servidor não está fazendo nenhum tipo de encaminhamento ou sendo usado como um dispositivo de passagem.
Resultado - Esta cadeia é usada para conexões de saída. Por exemplo, se você tentar executar ping em howtogeek.com, o iptables verificará sua cadeia de saída para ver quais são as regras relacionadas ao ping e howtogeek.com antes de tomar a decisão de permitir ou negar a tentativa de conexão.
A ressalva
Mesmo que o ping de um host externo pareça algo que só precisa atravessar a cadeia de saída, lembre-se de que, para retornar os dados, a cadeia de entrada também será usada. Ao usar iptables para bloquear seu sistema, lembre-se de que muitos protocolos exigirão comunicação bidirecional, portanto, as cadeias de entrada e saída precisarão ser configuradas corretamente. SSH é um protocolo comum que as pessoas esquecem de permitir em ambas as cadeias.
Comportamento padrão da cadeia de políticas
Antes de entrar e configurar regras específicas, você vai querer decidir qual deve ser o comportamento padrão das três cadeias. Em outras palavras, o que você deseja que o iptables faça se a conexão não corresponder a nenhuma regra existente?
Para ver o que suas cadeias de políticas estão configuradas para fazer com tráfego incomparável, execute o iptables -L
comando.
Como você pode ver, também usamos o comando grep para nos fornecer uma saída mais limpa. Nessa captura de tela, nossas cadeias estão atualmente configuradas para aceitar tráfego.
Na maioria das vezes, você desejará que seu sistema aceite conexões por padrão. A menos que você tenha alterado as regras da cadeia de políticas anteriormente, esta configuração já deve estar definida. De qualquer forma, aqui está o comando para aceitar conexões por padrão:
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
Por padrão para a regra de aceitação, você pode usar iptables para negar endereços IP ou números de porta específicos, enquanto continua a aceitar todas as outras conexões. Chegaremos a esses comandos em um minuto.
Se você preferir negar todas as conexões e especificar manualmente quais deseja permitir a conexão, você deve alterar a política padrão de suas cadeias para cair. Isso provavelmente só seria útil para servidores que contêm informações confidenciais e apenas têm os mesmos endereços IP conectados a eles.
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
Respostas específicas de conexão
Com suas políticas de cadeia padrão configuradas, você pode começar a adicionar regras ao iptables para que ele saiba o que fazer quando encontrar uma conexão de ou para um determinado endereço IP ou porta. Neste guia, examinaremos as três "respostas" mais básicas e comumente usadas.
Aceitar - Permita a conexão.
Solta - Desligue a conexão, aja como se nada tivesse acontecido. Isso é melhor se você não quiser que a fonte perceba que seu sistema existe.
Rejeitar - Não permitir a conexão, mas enviar de volta um erro. Isso é melhor se você não quiser que uma fonte específica se conecte ao seu sistema, mas deseja que eles saibam que seu firewall os bloqueou.
A melhor maneira de mostrar a diferença entre essas três regras é mostrar como é quando um PC tenta fazer ping em uma máquina Linux com iptables configurado para cada uma dessas configurações.
Permitindo a conexão:
Abandonando a conexão:
Rejeitando a conexão:
Permitir ou bloquear conexões específicas
Com suas cadeias de políticas configuradas, você agora pode configurar iptables para permitir ou bloquear endereços, intervalos de endereços e portas específicos. Nestes exemplos, definiremos as conexões para SOLTA
, mas você pode mudá-los para ACEITAR
ou REJEITAR
, dependendo de suas necessidades e de como você configurou suas cadeias de políticas.
Nota: Nestes exemplos, vamos usar iptables -A
para anexar regras à cadeia existente. iptables começa no topo de sua lista e passa por cada regra até encontrar uma que corresponda. Se você precisar inserir uma regra acima da outra, você pode usar iptables -I [cadeia] [número]
para especificar o número que deve estar na lista.
Conexões de um único endereço IP
Este exemplo mostra como bloquear todas as conexões do endereço IP 10.10.10.10.
iptables -A INPUT -s 10.10.10.10 -j DROP
Conexões de uma variedade de endereços IP
Este exemplo mostra como bloquear todos os endereços IP no intervalo de rede 10.10.10.0/24. Você pode usar uma máscara de rede ou notação de barra padrão para especificar o intervalo de endereços IP.
iptables -A INPUT -s 10.10.10.0/24 -j DROP
ou
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Conexões para uma porta específica
Este exemplo mostra como bloquear conexões SSH de 10.10.10.10.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Você pode substituir “ssh” por qualquer protocolo ou número de porta. O -p tcp
parte do código informa ao iptables que tipo de conexão o protocolo usa. Se você estava bloqueando um protocolo que usa UDP em vez de TCP, então -p udp
seria necessário em vez disso.
Este exemplo mostra como bloquear conexões SSH de qualquer endereço IP.
iptables -A INPUT -p tcp --dport ssh -j DROP
Estados de conexão
Como mencionamos anteriormente, muitos protocolos exigirão comunicação bidirecional. Por exemplo, se você deseja permitir conexões SSH ao seu sistema, as cadeias de entrada e saída precisarão de uma regra adicionada a elas. Mas, e se você quiser que apenas SSH entrando em seu sistema seja permitido? Adicionar uma regra à cadeia de saída também não permitirá tentativas SSH de saída?
É aí que entram os estados de conexão, que oferecem a capacidade necessária para permitir a comunicação bidirecional, mas apenas permitir o estabelecimento de conexões unilaterais. Dê uma olhada neste exemplo, onde conexões SSH DE 10.10.10.10 são permitidas, mas conexões SSH PARA 10.10.10.10 não são. No entanto, o sistema pode enviar informações de volta por SSH desde que a sessão já tenha sido estabelecida, o que torna possível a comunicação SSH entre esses dois hosts.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NOVO, ESTABELECIDO -j ACEITAR
iptables -A SAÍDA -p tcp --sport 22 -d 10.10.10.10 -m estado --estado ESTABELECIDO -j ACEITAR
Salvando alterações
As mudanças que você fizer nas regras do iptables serão descartadas na próxima vez que o serviço iptables for reiniciado, a menos que você execute um comando para salvar as mudanças. Este comando pode ser diferente dependendo da sua distribuição:
Ubuntu:
sudo / sbin / iptables-save
Red Hat / CentOS:
/ sbin / service iptables save
Ou
/etc/init.d/iptables save
Outros Comandos
Liste as regras de iptables atualmente configuradas:
iptables -L
Adicionando o -v
opção fornecerá informações de pacote e byte e adicionando -n
irá listar tudo numericamente. Em outras palavras - nomes de host, protocolos e redes são listados como números.
Para limpar todas as regras configuradas atualmente, você pode emitir o comando flush.
iptables -F