Hoje com os VPS chegando a custar 9 dolares por mês, muitos estão alugando esses servidores virtuais e deixam o firewall aberto, confiando no provedor. Nesse artigo iremos ensinar como configurar um firewall iptables básico, garantindo a segurança do servidor remoto.
Vamos configurar um firewall no modo padrão DROP, ou seja, ele irá bloquear todos os pacotes, e liberar apenas o que definirmos nas regras de ACCEPT abaixo.
Para tipo de firewall é necessário cuidado na hora de configurá-lo, pois podemos sem querer bloquear nossa própria conexão, se não configurarmos na ordem correta. Porém também é o modo mais seguro, por isso iremos utilizá-lo.
Regras Básicas
As regras básicas que precisamos ter em um firewall são as abaixo.
Permitir pings:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Permitir acesso a porta 22 (SSH):
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Caso você possua um Apache rodando, também precisa permitir acesso a porta 80 (HTTP):
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Permitir conexões que já foram estabelecidas:
iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitir acesso loopback:
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
Mas só temos liberações… como iremos impedir acessos indesejados?
iptables -P FORWARD DROP iptables -P INPUT DROP
Mudando a política padrão das tabelas para DROP.
Atenção! Cuidado ao mudar a política com as regras acima. Se você não estiver criado as regras de liberação, o firewall irá bloquear qualquer conexão e você perderá acesso ao servidor.
Se isso acontecer…
- Reinicie o servidor; ou
- Peça para alguém ir na console, logar como root e digitar:
-
iptables -P INPUT ACCEPT
-
Qual a diferença entre a política DROP e REJECT?
- REJECT o trafego é rejeitado, ou seja, um pacote ICMP é enviado de volta avisando que aquela porta não está aberta.
- DROP o tráfego é descartado, sem que host de origem seja avisado.
Por que utilizar DROP então?
Eu prefiro utilizar DROP pois dessa maneira, quando um host tentar abrir uma conexão para meu servidor, os pacotes serão descartados até que ocorra um timeout no host de origem. Então um portscan por exemplo demorará muito mais para mapear todas as portas do meu servidor.
Juntando tudo
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -s 127.0.0.1 -j ACCEPT iptables -P FORWARD DROP iptables -P INPUT DROP
Você pode salvar os comandos acima em um arquivo firewall.sh e colocá-lo para executar no seu /etc/rc.local
Abrir outras portas?
Para abrir outras portas, basta colocar outras regras como essa, no final do script:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Porém alterando de 22 para a porta que você deseja abrir.
Qual o motivo de existir essa regra de estado (–state ESTABLISHED,RELATED) ?
Essa regra garante que os pacotes das conexões abertas a partir do servidor, conseguirão voltar para ele.
Por exemplo, quando o servidor faz uma consulta DNS, o pedido vai sair pelo OUTPUT do iptables (que deixamos liberado) e quando voltar, vai bater no INPUT. Se não tiver essa regra, o firewall iria descartar o pacote com as informações de DNS retornando.
Related posts:
Para testar eu uso estas regras no final do script,
sleep 120
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -X
Elas zeram todas as regras do iptables em 2 minutos, se algo der errado basta esperar 2 minutos e corrigir… ;0)