foto por ezioman.
Sobre o iptables
O 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á-lo. Se não encontrar, recorre à ação predefinida.
O iptables quase sempre vem pré-instalado em qualquer distribuição Linux. Para atualizar / instalar, basta recuperar o pacote iptables:
sudo apt-get install iptables
Existem alternativas de GUI para o iptables como o Firestarter, mas o iptables não é tão difícil assim que você tem alguns comandos para baixo. Você quer ser extremamente cuidadoso ao configurar as regras do iptables, especialmente se você estiver usando o SSH em um servidor, porque um comando errado pode bloqueá-lo permanentemente até que seja corrigido manualmente na máquina física.
Tipos de Correntes
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 acessar o SSH no seu PC / servidor, o iptables tentará igualar o endereço IP e a porta a uma regra na cadeia de entrada.
frente - Essa cadeia é usada para conexões de entrada que não estão sendo entregues localmente. Pense em um roteador - os dados estão sempre sendo enviados para ele, mas raramente destinados ao próprio roteador; os dados são apenas encaminhados para o seu destino. A menos que você esteja fazendo algum tipo de roteamento, NAT ou qualquer outra coisa em seu sistema que exija encaminhamento, você nem usa essa cadeia.
Há uma maneira infalível de verificar se o sistema usa ou precisa da cadeia de encaminhamento.
iptables -L -v
Saída - Esta cadeia é usada para conexões de saída. Por exemplo, se você tentar fazer o ping em howtogeek.com, o iptables verificará sua cadeia de saída para ver quais são as regras relacionadas ao ping e ao howtogeek.com antes de tomar a decisão de permitir ou negar a tentativa de conexão.
A advertência
Embora o ping de um host externo pareça algo que só precisaria atravessar a cadeia de saída, lembre-se de que, para retornar os dados, a cadeia de entrada também será usada. Ao usar o 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. O 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, decida qual 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 atualmente para fazer com o tráfego sem correspondência, execute o
iptables -L
comando.
Mais vezes, você quer que seu sistema aceite conexões por padrão. A menos que você tenha alterado as regras da cadeia de políticas anteriormente, essa configuração já deve estar configurada. 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, na regra de aceitação, você pode usar o iptables para negar endereços IP ou números de porta específicos, enquanto continua a aceitar todas as outras conexões. Nós vamos chegar a esses comandos em um minuto.
Se você preferir negar todas as conexões e especificar manualmente quais delas deseja permitir a conexão, altere a política padrão de suas cadeias para soltar. Fazer isso provavelmente seria útil apenas para servidores que contenham informações confidenciais e que sempre tenham os mesmos endereços IP conectados a eles.
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
Respostas específicas da 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, abordaremos as três respostas mais básicas e comumente usadas.
Aceitar - Permitir a conexão.
Solta - Largue a conexão, aja como se nunca tivesse acontecido. Isso é melhor se você não quiser que a fonte perceba que seu sistema existe.
Rejeitar - Não permita a conexão, mas devolva um erro. Isso é melhor se você não quiser que uma determinada fonte 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 o que parece quando um PC tenta fazer ping em uma máquina Linux com o iptables configurado para cada uma dessas configurações.
Permitindo a conexão:
Permitindo ou bloqueando conexões específicas
Com suas cadeias de políticas configuradas, você pode agora configurar o iptables para permitir ou bloquear endereços específicos, intervalos de endereços e portas. Nestes exemplos, vamos definir as conexões para
DROP
mas você pode mudá-los para
ACCEPT
ou
REJECT
dependendo de suas necessidades e de como você configurou suas cadeias de políticas.
Nota: Nestes exemplos, vamos usar
iptables -A
para adicionar regras à cadeia existente. O iptables começa no topo da sua lista e passa por cada regra até encontrar uma que corresponda. Se você precisar inserir uma regra acima da outra, poderá usar
iptables -I [chain] [number]
para especificar o número que deveria 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 um intervalo 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 notação de máscara de rede ou 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 a partir 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,
-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 exigem comunicação bidirecional. Por exemplo, se você quiser 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 o SSH que entra no seu sistema seja permitido? A adição de uma regra à cadeia de saída também permite tentativas de SSH de saída?
É aí que entram os estados de conexão, o que lhe dá a capacidade que você precisa para permitir a comunicação bidirecional, mas apenas permitir que conexões unidirecionais sejam estabelecidas. Dê uma olhada neste exemplo, onde as conexões SSH FROM 10.10.10.10 são permitidas, mas as conexões SSH TO 10.10.10.10 não são permitidas. No entanto, o sistema tem permissão para enviar informações 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 NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Salvando alterações
As alterações que você fizer nas regras do iptables serão descartadas na próxima vez em que o serviço iptables for reiniciado, a menos que você execute um comando para salvar as alterações. Este comando pode diferir 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
Listar as regras do iptables atualmente configuradas:
iptables -L
Adicionando o
-v
opção lhe dará informações de pacote e byte, e adicionando
-n
listará tudo numericamente. Em outras palavras, nomes de host, protocolos e redes são listados como números.
Para limpar todas as regras atualmente configuradas, você pode emitir o comando flush.
iptables -F