Blackhold

Proxy transparente dentro de un contenedor openVZ

Posted on setembre 11th, 2012 by admin

Todos sabemos que los contenedores cuando se trata de comunicarse con el núcleo del sistema operativo siempre nos deja algun regalito, así que aquí tenemos otro caso, en este caso queremos montar un proxy transparente dentro de un contenedor OpenVZ (Proxmox).

Nos encontramos que queremos ejecutar una línea de iptables en nuestro contenedor, pero nos sale este error:

iptables v1.4.8: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

Lo primero de todo tendremos que configurar el fichero /etc/vz/vz.conf y comentaremos la línea con el parámetro IPTABLES= y pondremos otra así:

IPTABLES="ipt_REJECT ipt_recent ipt_owner ipt_REDIRECT ipt_tos ipt_TOS ipt_LOG ip_conntrack ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ipt_state iptable_nat ip_nat_ftp"

Luego reiniciaremos el servicio vz para que se apliquen los cambios:

# service vz restart

Ahora ya podremos entrar en nuestro contenedor víctima e instalamos lo básico para montar un proxy transparente (a partir de aquí también sirve para montar este servicio en una maquina que no esté como un contenedor openvz).

Instalaremos squid:

# apt-get install squid3

Modificaremos la línea para permitir a los usuarios de las redes 192.168.0.0/16 usar el proxy:

# vi /etc/squid3/squid.conf
acl localhost src 127.0.0.1/32 ::1 192.168.0.0/16
http_port 3128 transparent

Reiniciamos squid

# service squid3 restart

Y ahora crearemos unos scripts que ejecutaremos cuando queramos levantar el proxy transparente o bajarlo:

Levantar proxy transparente:

# vi /root/scripts/makemetransparent.sh
#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Bajar proxy transparente:

# vi /root/scripts/clean.sh
#!/bin/sh

# Clean old firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

Y otro script que podriamos poner en /etc/crontab o en el arranque del sistema para verificar que el proxy transparente está funcionando (vamos una chapuzilla :P ya que por defecto si se levanta la maquina el ip_forward está a 0):

# vi /root/scripts/check_is_running.sh
#!/bin/bash

VALOR=`cat /proc/sys/net/ipv4/ip_forward`

if [ $VALOR -eq 0 ]; then
        echo "1" > /proc/sys/net/ipv4/ip_forward
        service isc-dhcp-server start
        echo "was not running!"
fi
# vi /etc/crontab
# chapuzilla
*/10 * * * *  root /root/scripts/check_is_running.sh

Y ahora simplemente tendremos que cambiar el DHCP que como default gw ponga como IP la IP del servidor. Quizás nos encontraremos que en nuestra red no tenemos un buen router que nos pueda ofrecer DHCP a una IP distinta a la del router que ofrece DHCP, así que la otra opción es deshabilitar el DHCP del router cutre e instalar DHCP en nuestro servidor

# apt-get install dhcp3-server

Y editamos la configuración del servicio DHCP

# vi /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;

authoritative;

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.30 192.168.1.250;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name "ud4kamp.local";
option domain-name-servers 192.168.1.254;
#filename "pxelinux.0";
#next-server 192.168.1.30;
}

Esto es un ejemplo de DHCP para una red 192.168.1.0/24, donde el default gateway (quien dice como se sale a internet) es el servidor 192.168.1.254, el servidor que tiene el proxy transparente. Es el caso real de la red de la ud4kamp (80 personas y una adsl de 10 megas).

A continuación, en esta configuración le hemos dicho que este server también sea quien nos gestiona los DNS de la red, para ello instalaremos el paquete dnsmasq:

# apt-get install dnsmasq

Y copiaremos el fichero de /etc/resolv.conf a /etc/resolv.dnsmasq.conf

# cp /etc/resolv.conf /etc/resolv.dnsmasq.conf

Y reiniciaremos el servicio dnsmasq:

# service dnsmasq restart

Si nos da algun problema verificaremos que /etc/default/dnsmasq el servicio está operativo.

Si queréis saber mas sobre la configuración del servidor DHCP, seguid este link.

De esta forma pasaran todas las peticiones por este servidor y las peticiones al puerto 80 se cachearán y se optimizará muchisimo más la conexión.

Pues esto es todo :)

« »

guy fawkes