Category Archives: iptables

MEJORANDO SQUID – CONVIVENCIA CON EL QOS

*Actualización 12/02/2014: Con Squid 3.x podemos configurar sin parches el marcado de paquetes y dar QoS. Por ejemplo, podemos marcar con un numero ToS = 8, a los archivos que obtienen HIT haciendo: “qos_flows local-hit=0x8”, en squid.conf.

Parcheando el squid para soportar el zph (viene por defecto en las versiones 3.1.x y 2.7).
El ZPH (Zero Penalty Hit), es un parche para squid, que permite marcar el campo tos de los paquetes que pasan por este proxy, sólo cuando hay hits en el. Esto es útil cuando queremos diferenciar el tráfico que viene desde internet, y el tráfico que viene desde el squid (con hits), esto preferiblemente es usado junto con el TC (control de tráfico), para hacer las reglas de manejo de ancho de banda. Esto lo podemos apreciara mejor en los ejemplos al final de este howto.
Ahora veamos como parchar el squid para usar el módulo ZPH.
Descargamos “Squid3-Stable8” de las fuentes de squid.

su
cd /usr/src
wget http://ftp.vim.org/internet/squid/squid-3.0.STABLE8.tar.gz
tar -xvzf squid-3.0.STABLE8.tar.gz

Ahora descargamos el parche para la versión 3.0 de squid.
cd squid-3.0.STABLE8
wget http://zph.bratcheda.org/squid-3.0.STABLE8-zph.patch

Aplicamos el parche a las fuentes del squid3.
patch -p1 < ../squid-3.0.STABLE8-zph.patch

Compilamos nuestras fuentes de squid con soporte para el zero penalty hit patch (zph) y delay pools.

./configure –enable-zph-qos –enable-delay-pools
make
make install

#El archivo de configuración se encontrará en “/usr/local/squid/etc/squid.conf”.
#Para reconfigurarlo :
“/usr/local/squid/sbin/squid -k reconfigure”
#Usuario y grupo por defecto :

user:nobody

grup:nogroup

#comprobacion del squid.

#Verificando la instalación

/usr/local/squid/sbin/squid -k parse

#creamos los directorios de cache

chown -R nobody.nogrup /usr/local/squid

/usr/local/squid/sbin/squid -z

#debug del squid

/usr/local/squid/sbin/squid -NCd1

nos debe de salir cerca de la linea final “Ready to serve requests.”

#iniciar el squid

/usr/local/squid/sbin/squid
#Ejemplo de uso:
En squid.conf, colocamos en el campo TOS el valor de 4 en hexadecimales:
zph_tos_local 0x4
Luego en nuestros scripts de TC, hacemos el manejo de los paquetes con el campo TOS de valor 4:

LANDEV=eth1
TC=/sbin/tc
....... Class creadas, y otros filtros .....
$TC filter add dev $LANDEV parent 1:0 protocol ip prio 1 u32 \
match ip protocol 0x6 0xff \
match ip tos 0x4 0xff \
flowid 1:60

Los paquetes de protocolo tcp(0x6) y con el campo tos de valor 0x4, se irán a la clase 1:60.

Nota: Esto puede funcionar bien, pero si no quiere parchear el squid, entonces puede solo reconocer los hits del squid, con ayuda del iptables, esto se puede lograr, reconociendo la cadena “X-Cache: HIT” de nuestros paquetes tcp:

iptables -A OUTPUT -t mangle -p tcp -m string --string "X-Cache: HIT" --algo kmp -j MARK --set-mark 666

Aunque este método es más simple, habría que probarlo mejor.
fuente:http://zph.bratcheda.org/
salu2.

Anuncios

AMARRAR IP Y MAC

-Opcion 1:
-Amarrando con iptables:

 iptables -A FORWARD -s 192.0.2.100 -m mac --mac-source ! 
00:21:B7:F4:77:73 -j DROP

-Opcion 2:
-Amarrando con arp estatico:
-Creamos el archivo “/etc/ethers” y agregamos los ip y mac de los clientes, y para las demas ip’s se anula la direccion mac:


192.0.2.100 00:21:B7:F4:77:73
192.0.2.200 00:1F:1F:A3:33:D3
192.0.2.185 00:21:22:AD:7B:82
192.0.2.2 00:00:00:00:00:00
192.0.2.3 00:00:00:00:00:00
192.0.2.4 00:00:00:00:00:00

-Aqui por ejemplo los clientes son solamente los 3 primeros en la lista.
-Luego en “/etc/network/interface” agregamos al final “post-up /usr/sbin/arp -f”, esto carga automaticamente el archivo “/etc/ethers” a las tabla arp.

-La opcion 1 es la más lenta.

BLOQUEO DE P2P CON IPTABLES

Con esto estamos diciendo que en nuestro proxy transparente sólo tendra salida ciertos puertos, como el 80(http), 53(dns), 443(https)..etc, y los demás van a estar bloqueados, como el p2p, que usan los puertos del 1025 a 65535.
Tengamos en cuenta que estamos haciendo uso de un squid transparente, para mas info vea la instalación y configuración de squid en ubuntu
Las siguientes lineas, se guardan en un archivo “proxy_rules.sh” en “/etc/init.d/” :

la LAN es: 192.0.2.0/24 y su puerta de enlace es 192.0.2.1(en la interfaz eth1 del proxy) y su salida a internet es atraves del ip: 192.168.1.191(de la interfaz eth0 del proxy).


LAN="192.0.2.0/24"
PROXY_IP="192.168.1.191"
WAN="eth0"
LAN_I="eth1"

iptables -t nat -A PREROUTING -i $LAN_I -p tcp --dport 80 -j DNAT --to $PROXY_IP:3128
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j REDIRECT --to-port 3128
#HTTP
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p tcp --dport 80 -j SNAT --to $PROXY_IP
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p udp --dport 80 -j SNAT --to $PROXY_IP
#DNS
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p udp --dport 53 -j SNAT --to $PROXY_IP
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p tcp --dport 53 -j SNAT --to $PROXY_IP
#SSH
#ICMP
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p icmp -j SNAT --to $PROXY_IP
#HTTPS
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p tcp --dport 443 -j SNAT --to $PROXY_IP
#POP3
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p tcp --dport 995 -j SNAT --to $PROXY_IP
#MSN
iptables -t nat -A POSTROUTING -o $WAN -s $LAN -p tcp --dport 1863 -j SNAT --to $PROXY_IP
#ATAQUES DDOS
iptables -t nat -N SYN-FLOOD
iptables -t nat -A SYN-FLOOD -m limit --limit 12/s --limit-burst 24 -j RETURN
iptables -t nat -A SYN-FLOOD -j DROP
#
iptables -t nat -A PREROUTING -i $WAN -d $PROXY_IP -p tcp --syn -j SYN-FLOOD 
echo 1 > /proc/sys/net/ipv4/ip_forward

Luego le damos permisos de ejecución:

chmod +x proxy_rules.sh

Luego editamos el archivo “/etc/init.d/rc.local” y le agregamos al inicio:

cd /etc/init.d
./proxy_rules.sh

Con esto las reglas iptables se cargan automáticamente cada vez que se reinicie el proxy.

saludos.

INSTALACIÓN DE IPP2P

Seguramente muchos de ustedes dueños o administradores de redes que tienen a cargo una red wiriless o una cabina de internet, les habrá fastidiado, los programas tipo p2p como el ares, limewire, bittorrent .. etc, pues para quienes tengan implemetado un proxy como squid (si no, pueden ver como se instala en ubuntu ), existe un módulo como Ipp2p, el cual permite justamente bloquear y controlar estos programas p2p, basándose en el comportamiento que tienen estos, a la hora de querer conectarce a sus nodos por medio de muchos puertos simultaneamente.
Nota:
A mí me funcionó según lo provisto, esto es que sí filtraba los p2p, pero cuando teníamos una máquina en donde ya había un ares con descargas pauseadas, osea ya estaba funcionando, en este caso cuando dicha máquina entraba en nuestra red, como parte de nuestra lan, entonces, los p2p’s en particular ares sí podían descargar, violando las reglas del ipp2p, entonces decidimos hacer un bloqueo por puertos esto lo podemos ver en bloqueo de p2p por iptables.

Ahora veamos como se instala este módulo en nuestro ubuntu 9.04:
Empecemos:

su
cd /usr/src

*Preparando al sistema

apt-get install iptables-dev
apt-get install linux-source-$(uname -r)
apt-get install build-essential kernel-package libncurses5
apt-get install linux-headers-$(uname -r)

*Descomprimimos el kernel-source

bunzip2 linux-source-$(uname -r).tar.bz2
tar -xvf linux-source-2.6.18.tar

*Creamos un enlace simbolico a linux-source-*

ln -s linux-source-2.6.18/ linux

*Descargar IPP2P y los parches para el kernel 2.8.22 y 2.8.28 (el nuestro es 2.8.28-11-generic), además de parches para iptables 1.4.0 y 1.4.1.

wget http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz
wget http://aur.archlinux.org/packages/ipp2p/ipp2p/ipp2p-0.8.2-kernel-2.6.22.patch
wget http://aur.archlinux.org/packages/ipp2p/ipp2p/ipp2p-0.8.2-kernel-2.6.28.patch
wget http://aur.archlinux.org/packages/ipp2p/ipp2p/ipp2p-0.8.2-iptables-1.4.0.patch
wget http://aur.archlinux.org/packages/ipp2p/ipp2p/ipp2p-0.8.2-iptables-1.4.1.patch

*Parchamos IPP2P para nuestro kernel.

tar xvzf ipp2p-0.8.2.tar.gz
  cd ipp2p-0.8.2
  patch -p1 < ../ipp2p-0.8.2-kernel-2.6.22.patch
  patch -p1 < ../ipp2p-0.8.2-kernel-2.6.28.patch
  patch -p1 < ../ipp2p-0.8.2-iptables-1.4.0.patch
  patch -p1 < ../ipp2p-0.8.2-iptables-1.4.1.patch

*Editamos el archivo “libipt_ipp2p.c”
y editamos la estructura:

struct xtables_match ipp2p=
{
.next = NULL,
.name = "ipp2p",
.family = PF_INET,
.version = XTABLES_VERSION, ##<-- Aquí hacemos el cambio
.size = XT_ALIGN(sizeof(struct ipt_p2p_info)),
.userspacesize = XT_ALIGN(sizeof(struct ipt_p2p_info)),
...
}

*Guardamos cambios
*Editamos el archivo “Makefile”
*Editamos la linea:

ld -shared -o libipt_ipp2p.so libipt_ipp2p.o

-cambiando “ld” por el compilador gcc “$(CC)”

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

*Guardamos cambios
*Ejecutamos:

  make

-Hasta aqui no debe de presentarnos ningún error, en caso de error revisemos los pasos anteriores.
*Y finalmente copiamos los archivos compilados en carpetas pertenecientes a iptables y squid.

  cp libipt_ipp2p.so /lib/xtables/
  cp ipt_ipp2p.ko /lib/modules/$(uname -r)/kernel/net/netfilter/
  depmod -a

* Probamos:

  iptables -m ipp2p --help

Ejemplo de uso:

iptables -A FORWARD -p udp -m ipp2p --edk --dc --kazaa --gnu --bit --apple --winmx --soul --ares -j DROP
iptables -A FORWARD -p tcp -m ipp2p --edk --dc --kazaa --gnu --bit --apple --winmx --soul --ares -j DROP

o en su forma simplificada:

iptables -I FORWARD -p tcp -m ipp2p --ipp2p -j DROP
iptables -I FORWARD -p udp -m ipp2p --ipp2p -j DROP

Saludos.