Iptables + Layer7
Este artigo tem o objetivo de apresentar a ferramenta Iptables, explicando um pouco sobre seu funcionamento e mostrando alguns exemplos da utilização deste firewall, bem como alguns de seus módulos. Em seguida detalharemos a importância, a instalação e mostraremos alguns exemplos de uso de um dos módulos existentes para o Iptables: o Layer7.
Parte 3: Módulos
Uma característica que confere muito poder ao Iptables é a expansibilidade, ou seja, podem ser criados módulos que lhe acrescentem funcionalidades, como filtragem por protocolo de camada de aplicação.
Não é o objetivo deste tutorial explicar como instalar/utilizar módulos além do Layer7. Contudo, iremos mostrar alguns exemplos de utilização de alguns módulos, para ilustrarmos ao mesmo tempo uma idéia do poder adicional disponível quando utilizamos o Iptables, e o grande poder do módulo Layer7, cuja instalação e utilização detalharemos nas próximas sessões.
Bem, assumindo que o módulo esteja instalado em sua máquina, a opção utilizada para especificar que utilizaremos este módulo é -m. Temos, por exemplo, o módulo state, que permite fazer filtragens baseadas no estado de um pacote. Se quisermos aceitar todos os pacotes que pertençam a conexões previamente estabelecidas, temos:
# iptables -A INPUT -m state --state ESTABILISHED -j ACCEPT
Podemos ainda aceitar todos os pacotes relacionados a conexões existentes. Isso é útil, por exemplo, em serviços que inicialmente utilizam uma porta, mas realizam parte da comunicação através de outras portas, como por exemplo, o FTP. Podemos usar então o comando:
# iptables -A INPUT -m state --state RELATED -j ACCEPT
Para bloquear pacotes TCP inválidos:
# iptables -A INPUT -p tcp -m state --state INVALID -j DROP
Outro modulo interessante é o limit. Com ele, podemos limitar o número de pacotes que passam por uma determinada chain durante um espaço de tempo. Por exemplo, podemos evitar o ping da morte (ataque de negação de serviço) limitando o número de pacotes icmp recebidos em até 10 por segundo. Para isso, basta utilizar o comando:
# iptables -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
Todos os módulos mostrados aqui são de grande utilidade. Mas, e se eu quiser bloquear o uso de MSN na minha rede? E para bloquear serviço Web? Bom, existem soluções que sugerem o bloqueio de MSN, por exemplo, bloqueando todos os pacotes com destino aos servidores MSN.
No entanto, para fazer isso, devemos acrescentar inúmeras regras ao firewall, o que consome processamento, acarretando lentidão na rede. Se forem utilizados os nomes dos servidores nestas regras, a cada pacote que passa pela chain, será feita uma consulta DNS. Ok, mas se o processamento de regras já é lento, imagina uma requisição DNS! Ah, mas podemos usar os IPs dos servidores... Sim, mas e se algum mudar? Quantos IPs estão distribuídos para estes servidores? Certamente muitos... E o pior: o Messenger pode ser esperto o suficiente para mudar o endereço de autenticação. Logo, a alternativa é inviável.
E quanto a bloquear serviços Web? Bloquear a porta 80? Basta oferecer o serviço em outra porta. E quanto a aplicações P2P cujos endereços IP não são fixos e nem as portas?
Assim, é inquestionável a utilidade de um mecanismo de filtragem que atue diretamente na camada de aplicação, bloqueando diretamente o protocolo http, por exemplo, ou o protocolo usado por messengers. É exatamente isso que faz o Layer 7, cuja instalação é detalhada a seguir.
Não é o objetivo deste tutorial explicar como instalar/utilizar módulos além do Layer7. Contudo, iremos mostrar alguns exemplos de utilização de alguns módulos, para ilustrarmos ao mesmo tempo uma idéia do poder adicional disponível quando utilizamos o Iptables, e o grande poder do módulo Layer7, cuja instalação e utilização detalharemos nas próximas sessões.
Bem, assumindo que o módulo esteja instalado em sua máquina, a opção utilizada para especificar que utilizaremos este módulo é -m. Temos, por exemplo, o módulo state, que permite fazer filtragens baseadas no estado de um pacote. Se quisermos aceitar todos os pacotes que pertençam a conexões previamente estabelecidas, temos:
# iptables -A INPUT -m state --state ESTABILISHED -j ACCEPT
Podemos ainda aceitar todos os pacotes relacionados a conexões existentes. Isso é útil, por exemplo, em serviços que inicialmente utilizam uma porta, mas realizam parte da comunicação através de outras portas, como por exemplo, o FTP. Podemos usar então o comando:
# iptables -A INPUT -m state --state RELATED -j ACCEPT
Para bloquear pacotes TCP inválidos:
# iptables -A INPUT -p tcp -m state --state INVALID -j DROP
Outro modulo interessante é o limit. Com ele, podemos limitar o número de pacotes que passam por uma determinada chain durante um espaço de tempo. Por exemplo, podemos evitar o ping da morte (ataque de negação de serviço) limitando o número de pacotes icmp recebidos em até 10 por segundo. Para isso, basta utilizar o comando:
# iptables -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
Todos os módulos mostrados aqui são de grande utilidade. Mas, e se eu quiser bloquear o uso de MSN na minha rede? E para bloquear serviço Web? Bom, existem soluções que sugerem o bloqueio de MSN, por exemplo, bloqueando todos os pacotes com destino aos servidores MSN.
No entanto, para fazer isso, devemos acrescentar inúmeras regras ao firewall, o que consome processamento, acarretando lentidão na rede. Se forem utilizados os nomes dos servidores nestas regras, a cada pacote que passa pela chain, será feita uma consulta DNS. Ok, mas se o processamento de regras já é lento, imagina uma requisição DNS! Ah, mas podemos usar os IPs dos servidores... Sim, mas e se algum mudar? Quantos IPs estão distribuídos para estes servidores? Certamente muitos... E o pior: o Messenger pode ser esperto o suficiente para mudar o endereço de autenticação. Logo, a alternativa é inviável.
E quanto a bloquear serviços Web? Bloquear a porta 80? Basta oferecer o serviço em outra porta. E quanto a aplicações P2P cujos endereços IP não são fixos e nem as portas?
Assim, é inquestionável a utilidade de um mecanismo de filtragem que atue diretamente na camada de aplicação, bloqueando diretamente o protocolo http, por exemplo, ou o protocolo usado por messengers. É exatamente isso que faz o Layer 7, cuja instalação é detalhada a seguir.