Bloquear P2P (peer to peer) com o ipp2p (e iptables)

Estou a reconfigurar o servidor de hotspot do meu local de trabalho, e preciso de bloquear certos tipos de ligações à net, para permitir apenas 80 e 443 (http e https – navegar pela web).

Para isso, preciso de bloquear todos os protocolos P2P. Existe um programinha interessantissimo que se chama ipp2p e que funciona juntamente com o iptables.

O ipp2p funciona reconhecendo padrões no payload (carga util) do pacote, permitindo assim ao administrador de sistemas, restringir, prioritizar ou mesmo bloquear (como fiz) o tráfego.

O ipp2p tem 2 componentes: um modulo de kernel ipt_ipp2p.ko (para 2.6) e um modulo para o iptables libipt_ipp2p. Ambos têm que ser compilados a partir do código fonte.

Esta configuração foi efectuada para o Fedora Core 9, x86, kernel 2.6.27.21-78.2.41, iptables-1.4.1.1

Não existe pacote de RPM para o FC9, daí temos que o compilar manualmente.

Instalar:

  • kernel-devel
  • redhat-rpm-config
  • kernel-headers
  • rpm-build (devido ao seguinte erro: error: cannot create %sourcedir /usr/src/redhat/SOURCES)
  • iptables source
  • kernel source

Começar por instalar o rpm-devel

yum install rpm-build

Instalar o kernel-devel e o kernel-headers

yum install kernel-devel kernel-headers

Para instalar o kernel source e o iptables source temos que usar o yumdownloader, que se encontra no pacote yum-utils

yum install yum-utils

yumdownloader --source kernel

yumdownloader --source iptables

Nota: O yumdownloader vai deixar os pacotes na directoria onde estivermos

Após o donwload, já os podemos instalar

rpm -ivh kernel-src iptables-src (substituir pelos nomes dos pacotes)

Agora, vamos a /usr/src/redhat/SPECS e executamos os seguintes comandos:

  • rpmbuild -bp iptables.spec
  • rpmbuild -bp kernel-2.6.spec

Este comando vai preparar o codigo fonte do iptables para corresponder aos ficheiros binários instalados. O mesmo para o kernel. Após executar os comandos, os novos ficheiros rpm irão encontrar-se em /usr/src/redhat/BUILD.

De seguida, procurar em /usr/src/kernels/<kernel-version>/ um ficheiro chamado Module.symvers. Copiar este ficheiro para /usr/src/redhat/BUILD/kernel-2.6.27/linux-2.6.27.i386. Vamos para essa directoria. Agora, temos que verificar se temos uma configuracao do kernel (.config). Se nao existir, temos duas opcoes:

  • zcat /proc/config.gz > /usr/src/redhat/BUID/kernel-2.6.27/linux-2.6.27.i386/.config (se existir o config.gz em proc)
  • cd /usr/src/redhat/BUILD/kernel-2.6.27/linux-2.6.27.i386/ && make oldconfig

Executar make scripts/kconfig

Agora, vamos efectuar o download do ipp2p e compilar

após efectuar o download, descomprimimos.

tar -zxvf ipp2p-0.8.2.tar.gz

Para isto compilar, temos que aplicar 3 patches. Aplicar os patches pela ordem que se encontram aqui:

cd ipp2p-0.8.2

aplicar os patches com o seguinte comando:

patch -p1 <../<patch_pela_ordem_em_cima>

Agora, vamos editar o Makefile e acrescentar/alterar as seguintes linhas:

(linha 6) KERNEL_SRC - Ou deixamos como está e temos o link /usr/src/linux a apontar para o nosso kernel, ou colocamos a linha onde estão as nossas sources do kernel

(linha 32) IPTABLES_SR = /usr/src/redhat/BUILD/iptables-1.4.1.1

Existe também um hack que dizem que é necessário efectuar para que o ipp2p compile, que é alterar a seguinte linha:

(linha 67) ld -shared -o libipt_ipp2p.so libipt_ipp2p.o

para

$(CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o

Das vezes que alterei, nunca consegui compilar o ipp2p. Deixando a linha como estava, tudo funcionou na perfeição. Guardar o documento e sair.

Executar make e tudo deverá compilar.

Irão ser criados 2 ficheiros:

  • ipt_ipp2p.ko – módulo do kernel: insmod ipt_ipp2p.ko && depmod -a
  • libipt_ipp2p.so – ficheiro para o iptables. cp libipt_ipp2p.so /lib/xtables

Desta forma, já temos o iptables com suporte para o ipp2p.

Para saber se está tudo a funcionar e o iptables reconhece o módulo, experimentem na consola:

iptables -m ipp2p --help

e deverão obter a ajuda para o ipp2p.

Uma linha tipica que podem lá colocar (no vosso script iptables):

$IPTABLES -A FORWARD -m ipp2p --ipp2p -j DROP

o -m ipp2p é uma opção do modulo que indica para cortar todos os protocolos suportados (na ajuda têm lá isso tudo).

Espero que consigam, pois digo-vos que andei 2 dias para conseguir compilar o modulo para o iptables.

Leave a Reply

Your email address will not be published. Required fields are marked *