Iptables
O Iptables é um firewall em nível de pacotes, ou seja, toma as decisões baseadas nos parâmetros do pacote, como porta/endereço de origem/destino, estado da conexão, e outros parâmetros do pacote. Funciona através da comparação de regras para saber se um pacote tem ou não permissão para passar. O iptables tem inúmeras possibilidades de controle oferecidas pelos recursos de filtragem, flexibilidade na manipulação dando lugar à imaginação do administrador.
Construindo o firewall
Estou utilizando o Slackware 10.2 e o iptables v1.3.3. Para o proposto, vou considerar que nosso roteador tem apenas duas interfaces de rede, a eth0 (interface de rede local) e eth1 (interface ligada ao seu link de acesso à internet, neste caso, velox).
Primeiro passo:
Acesse o diretório onde iremos salvar o firewall e crie o arquivo rc.firewall:
# touch /etc/rc.d/rc.firewall
Segundo passo:
Edite o arquivo criado anteriormente:
# mcedit rc.firewall
Terceiro passo, construção:
Primeiramente iremos criar uma variável para cada interface de rede:
### Interfaces de rede
INT=eth0
EXT=ppp0
Criar uma variável para interface é facultativo, é uma boa opção para tornar as regras mais legíveis, veremos isso mais adiante.
Mensagem que será exibida no shell quando iniciarmos o firewall:
echo "Ativando Regras do Firewall"
Agora iremos excluir as regras dos chains nat, mangle e filter:
### Exclui todas as regras
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
Excluindo as cadeias customizadas, chains criados pelos usuários:
### Exclui cadeias customizadas
iptables -X
Zerando o contador de bytes das cadeias. Zera o campo pkts e bytes de uma regra no iptables.
### Zera os contadores das cadeias
iptables -t nat -Z
iptables -t mangle -Z
iptables -t filter -Z
Definindo a política padrão do nosso Firewall. O policiamento padrão determina o que acontecerá com um pacote quando ele chegar ao final das regras contidas em um chain.
### Define a política padrão do firewall
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
Agora vamos inserir no nosso firewall as regras de redirecionamento, PREROUTING. O redirecionamento de portas permite a você fazer o repasse de conexões. Podemos redirecionar portas para um ip, repassar conexões com destino a uma porta para outra porta, e várias opções que podem ser exploradas pelo administrador. Bom, vamos criar alguns redirecionamentos.
### Regras PREROUTING
# Redireciona as conexões vindas da rede externa na porta 3389 para o ip 192.168.0.200
iptables -t nat -A PREROUTING -i $EXT -p tcp --dport 3389 -j DNAT --to 192.168.0.200
# Redireciona as conexões vindas da rede externa na porta 5900 para o ip 192.168.0.201
iptables -t nat -A PREROUTING -i $EXT -p tcp --dport 5900 -j DNAT --to 192.168.0.201
# Redireciona as conexões vindas da rede interna na porta 80 para a porta 3128
iptables -t nat -A PREROUTING -i $INT -p tcp --dport 80 -j REDIRECT --to-port 3128
OBS: Temos diversas outras opções de uso com regras PREROUTING, é só estudar um pouco e usar a imaginação.
Após os redirecionamentos, vamos adicionar as regras INPUT (consultado para dados que chegam à máquina).
### Regras INPUT
### informa os estados que devem ser checados (Conexão estabelecida
# ou Relacionada). Caso o estado da conexão seja uma dessas 2, então
# ele vai aceitar.
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
# Libera o INPUT para a interface loopback, ou seja, a própria máquina
iptables -A INPUT -i lo -j ACCEPT
# Permite icmp 0 (resposta de Echo)
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# Permite icmp 8 (Pedido de Echo)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# Permite o acesso ao servidor usando SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Permite o acesso ao servidor usando FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# Libera o OPENVPN
iptables -A INPUT -p tcp --dport 1194 -j ACCEPT
Vamos agora às regras forward, o chain FORWARD é consultado para dados que são redirecionados para outra interface de rede ou outra máquina. Há uma variedade de regras que o administrador pode implementar com esse chain. Colocarei aqui, alguns serviços essenciais, como ftp, ssh, pop e smtp. Personalize de acordo suas necessidades.
### Regras FORWARD
iptables -A FORWARD -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p icmp -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 25 (smtp)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 25 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 22 (ssh)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 22 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 21 (ftp)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 21 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 110 (pop)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 110 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 443 (ssl)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 443 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 3389 (Terminal Server da Microsoft)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 3389 -j ACCEPT
# Libera o tráfego de pacotes da rede interna para a rede externa na porta 80 (http)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 80 -j ACCEPT
# Libera o tráfego de pacotes da rede externa para a rede interna na porta 3389 (Terminal Server da Microsoft)
iptables -A FORWARD -i $EXT -o $INT -p tcp --dport 3389 -j ACCEPT
# Libera o tráfego de pacotes da rede externa para a rede interna na porta 5900 (VNC)
iptables -A FORWARD -i $EXT -o $INT -p tcp --dport 5900 -j ACCEPT
Regras output. O chain OUTPUT é consultado para dados que saem da máquina. Como na nossa política padrão, liberamos o tráfego no neste chain, não é necessário muita coisa aqui.
### Regras OUTPUT
iptables -A OUTPUT -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT
Por fim, vamos criar uma regra para fazer o mascaramento da nossa conexão com à internet.
### Regras POSTROUTING
iptables -t nat -A POSTROUTING -o $EXT -j MASQUERADE