Um firewall statefull no iptables! (antigo)

Post atualizado em 20/12/2011!

Um firewall stateful controla o nível das conexões ip, podendo permitir o fluxo de conexões já efetuadas e limitar a criação de novas conexões.

Você precisa de vários módulos do netfilter habilitados no kernel, principalmente:

[*] Network packet filtering framework (Netfilter)  --->
      <*> Netfilter Xtables support (required for ip_tables)
              <*>   "limit" match support
              <*>   "state" match support
              <*>   Multiple port match support

Depois de acrescentar as novas opções, recompilando o kernel ou carregando os módulos, basta utilizar as regras conforme exemplificadas nas linhas a seguir (os comandos podem ser inseridos na shell e ou salvos em um script de inicialização): 

# Permitir o tráfego local e da rede local em eth0
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT

# Definir o firewall como fechado por padrão
# (Tornando necessário definir o que será aceito)
iptables -t filter -P INPUT DROP

# Firewall Stateful
# Permitir conexões que já foram iniciadas, permitidas por outras regras a seguir.
iptables -t filter -N KEEP_STATE
iptables -t filter -A KEEP_STATE -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A KEEP_STATE -j RETURN
iptables -t nat -N KEEP_STATE
iptables -t nat -A KEEP_STATE -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A KEEP_STATE -j RETURN
iptables -t nat -A PREROUTING -j KEEP_STATE
iptables -t nat -A POSTROUTING -j KEEP_STATE
iptables -t nat -A OUTPUT -j KEEP_STATE
iptables -t filter -A INPUT -j KEEP_STATE
iptables -t filter -A FORWARD -j KEEP_STATE
iptables -t filter -A OUTPUT -j KEEP_STATE

# Limites de conexões (proteção contra DDoS)
# para remover o limite, basta suprimir: -m limit --limit n/s

# Limita a resposta de ping para 1 pacote por segundo
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m limit \
                                                --limit 1/s -j ACCEPT

# Aceitando conexões nas portas 21 22 e de 4000 até 4050,
# com limite de 1 conexao por segundo e
# só para ips brasileiros (189.x.x.x e 200.x.x.x e 201.x.x.x)
# obs, é preciso confirmar a rede de ip das operadoras 3G (Nextel wap usa 216.x.x.x)
iptables -A INPUT -p tcp -m multiport --dports 21,22,4000:4050 \
                         -m limit --limit 1/s -s 189/8 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 21,22,4000:4050 \
                         -m limit --limit 1/s -s 200/7 -j ACCEPT

# Aceitando conexões nas portas 25 e 80 com limite de 3 conexões por segundo
iptables -A INPUT -p tcp -m multiport --dport 25,80 -m limit --limit 3/s  -j ACCEPT

# Aceitando conexões na porta de DNS externo com limite de 2 conexões por segundo
# (útil se você hospeda algum domínio)
iptables -A INPUT -p udp --dport 53 -m limit --limit 2/s -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -m limit --limit 2/s -j ACCEPT

É só aperfeiçoar esse script simples afim de obter um bom firewall robusto com o seu linux!

Uma ideia sobre “Um firewall statefull no iptables! (antigo)

  1. Pingback: Um firewall robusto no iptables! | Blog do Eduardo Nunes

Escreva seu comentário: