Firewall - Repasses da rede interna
Autor: Marcos Ferreira da Silva | Publicado: 2010-09-12T07:59:00-03:00

Até o asssunto anterior estavamos preocupados com os pacotes que entravam se saiam do firewall, agora vamos analisar os pacotes que irão passar pelo firewall.

Um primeiro método seria liberar o acesso a consultas dns e acesso web para toda a rede interna.

#!/bin/bash
# A criação de variáveis de ambiente irá facilitar a troca de alguns parâmetros no firewall.
INT_NET=192.168.0.0/24
INT_IF=eth1
EXT_IF=eth0

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -P INPUT   DROP
iptables -P FORWARD DROP

iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp --dport 137:139 -j DROP
iptables -A INPUT -p tcp --dport  22 -m state --state NEW -j ACCEPT

# Aceita todos os pacotes que estiverem sendo repassados, independente das interfaces, desde 
# que sejam pacotes na qual as conexões já estejam estabelecidas ou relacionadas.
iptables -A FORWARD -m state --state ESTABLISH,RELATED -j ACCEPT

# Aceita repassar os pacotes que tenham como origem a rede interna, estejam entrando na
# interface interna e saindo na interface externa, protocolo sendo UDP com destino a porta 
# 53(DNS) e o estado da conexão seja uma nova conexão.
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p udp --dport 53 -m state --state NEW -j ACCEPT

# Aceita repassar os pacotes que tenham como origem a rede interna, estejam entrando na 
# interface interna e saindo na interface externa, protocolo sendo tcp com destino as portas 
# 80(http) e 443(https) e o estado da conexão seja uma nova conexão.
# Note que foi usado o módulo multiport, pois colocamos como destino mais de uma porta.
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT

iptables -A INPUT   -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE

Para acesso ftp o controle da conexão deve ser alterado devido ao modo como o o ftp trabalha.

O FTP é um protocolo que dificulta muito a vida de quem implementa regras de filtragem no IPTABLES. O motivo é a forma que o FTP estabelece suas conexões, pois muitas vezes é impossível mapear quais portas serão feitas as conexões. 

O Connection Tracking é um módulo do Linux utilizado para acompanhar estas conexões "ajudando" o IPTABLES a saber que um determinado pacote é relacionado a uma conexão já existente. 

#!/bin/bash
INT_NET=192.168.0.0/24
INT_IF=eth1
EXT_IF=eth0

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -P INPUT   DROP
iptables -P FORWARD DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp --dport 137:139 -j DROP
iptables -A INPUT -p tcp --dport  22 -m state --state NEW -j ACCEPT
# Liberação de acesso ao cache de DNS para a rede interna.
iptables -A INPUT -p udp --dport  53 -s $INT_NET -i $INT_IF -m state --state NEW -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#-------------------------------------------------
# Liberação de acessos via FTP para a rede interna
#
# Primeiramente carregue o módulo de Connection Tracking do FTP
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# Libere o acesso a porta 21
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p tcp -m multiport --dports 21,80,443 -m state --state NEW -j ACCEPT

iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p udp --dport 53 -m state --state NEW -j ACCEPT

iptables -A INPUT   -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE