Manual

do

Maker

.

com

Fazendo um firewall com Raspberry

Fazendo um firewall com Raspberry

Recentemente fiz um firewall para um amigo. A rede doméstica dele necessitava de um certo grau de segurança, o roteador não é do tipo que roda WRT e sua rede também é composta por wireless. Para dar a segurança necessária a um determinado host (e quaisquer outros que estejam do lado protegido) fiz um firewall Linux usando Raspberry Pi. O processo foi o seguinte:

Meio físico

  • Um case nao é fundamental, mas fica melhor do que jogado.
  • Um dungle ethernet será necessário para fazer a segunda interface de rede.
  • Um fonte de tablet (é o ideal por ser 5v 2A. Mais detalhes aqui)
  • Um teclado USB ou wireless, apenas para uso durante a configuração.

Raspbian

Instale um sistema de verdade do Raspberry. O título é sugestivo, você pode baixá-lo em Raspberry.org. Procedimento para instalação da imagem pode ser encontrada aqui.

Conceito do firewall

Rapidamente, vou explicar como funciona o firewall do Linux pra ver que não é pouca merda.

Netfilter

O firewall do Linux se chama Netfilter. Ele reside no kernel space, de forma que não pode ser manipulado. O kernel (para quem não sabe) é o núcleo do sistema operacional; o cérebro que gerencia todo o hardware. O kernel tem seu espaço específico onde nenhum programa pode tocar, de forma a ser 100% protegido.

A interface de rede tem seu próprio processamento, onde recompõe bits em bytes, bytes em quadros, quadros em pacotes e então repassa para a próxima camada do modelo OSI. Trocando em miúdos (detesto miúdos), isso significa que antes de entrar no sistema operacional, existe um pré-processamento no hardware. Quando esses dados são recompostos, o kernel interage com o hardware através dos protocolos estabelecidos no driver da ethernet em questão. Somente após isso esse fluxo de dados é repassado ao sistema no user space. E isso é o que faz do Linux um firewall excepcional! Uma vez que o netfilter está no kernel space e o que sai da interface ethernet tem que passar primeiramente pelo kernel, não há a menor possiblidade de fazer um bypass como em determinados sistemas operacionais que o firewall é um "porgrama". Isso possibilita uma blindagem na segurança do sistema operacional quanto à filtragem de pacotes. Mas como determinar as regras que o netfilter deve seguir para a filtragem de pacotes?

IPtables

O IPtables é a ferramenta do user space que interage com o netfilter. Aí você pergunta: “O kernel space não é isolado?” - SIm, é. O IPtables cria um conjunto de predefinições que coloca em uma tabela, então dispara um evento para o kernel. O kernel se encarrega de ir até a região de memória da tabela e ler as regras, então aplicá-las, desde que dentro do protocolo.

Em relação à composição de regras, dá pra fazer uma infinidade de coisas, mas sua aplicação realmente depende da necessidade, portanto, se você conseguir chegar aos ‘ovos de páscoa’ contidos nesse firewall, você é um cara de sorte. Eu me orgulho em dizer que já contemplei alguns.

Para um firewall doméstico, esse conjunto de regras dispostas a seguir são o suficiente:

#!/bin/sh
#
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
echo "1" >/proc/sys/net/ipv4/ip_forward
/sbin/iptables -P FORWARD DROP
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
/sbin/iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -d 192.168.0.0/24 -mstate --state ESTABLISHED,RELATED -j ACCEPT

Basicamente, esse conjunto de regras determina que o repasse de pacotes originados em uma interface sejam permitidos a trafegar através de outra (talvez um tutorial específico seja uma boa idéia, se tiverem interesse, manifestem-se). Depois entram as regras, iniciando em bloqueio absoluto. Então entra o mascaramento, isto é, todas as estações da rede local sairão pelo interface externa do firewall com o IP do firewall. Para um firewall doméstico é a melhor opção para evitar roteamentos, acredite.

Seguidamente, uma regra permite que toda a rede local possa trafegar através do firewall e por fim, somente pacotes reconhecido como tráfego legítimo (chamado de stateful).

Esse conjunto de regras descritos devem ser guardados em um arquivo, por exemplo, firewall.sh. Eu normalmente guardo esse arquivo em /etc. Para fazê subir junto com o sistema tem um monte de modos para fazê-lo, então se você é adepto de outro meio, faça do seu jeito.

Com o arquivo devidamente criado, mude suas permissões e propriedade:

sudo su
chown root.root /etc/firewall.sh
chmod 700 /etc/firewall.sh

E insira sua chamada em um arquivo rc do sistema:

Reinicie o sistema e veja (como root) se as regras foram estabelecidas:

iptables -L n
iptables -L -n -t nat

Minha última citação a respeito é relacionado ao throughput. Quanto processamento um firewall Linux necessita? Bem, eu digo que se você não estiver abrindo pacotes para ler strings (que é uma aberração que incluiram no iptables), o processamento necessário é tanto quanto a sua interface ethernet processa - ou seja, praticamente nenhum. Por isso você vai utilizar um firewall em Raspberry com a mesma eximia que um desktop ou seja lá qual hardware for.

Aí está seu firewall!

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.