Proxy transparente con Squid en Debian

icono de herramientas Si fuese cristiano pensaría que Zaryn Dentzel es el anticristo y esa abominación suya que se llama tuenti el camino a la perdición de toda una generación de adolescentes que prefieren perder el tiempo con estas bobadas en lugar de atender a las clases… O eso hacían, antes de que instalara el proxy con squid, claro. ¿Necesitáis un filtro de contenido eficiente y barato que funcione con software libre? Pues acompañadme…

La máquina que hará de proxy debe de tener dos tarjetas de red. Le instalamos una Debian seleccionando como interfaz de red primaria la que irá conectada al router externo, en mi caso la eth0. La instalación ha de ser mínima (sólo sistema estandard) para que la máquina no tenga ningún servicio superfluo.

Al final, el diagrama de red que perseguimos es como este:

Diagrama de red con Squid

Después del primer arranque configuramos las tarjetas de red en /etc/network/interfaces. Las mías quedan de la siguiente forma:

allow-hotplug eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.252
gateway 192.168.1.1
network 192.168.1.0
broadcast 192.168.1.3

allow-hotplug eth1
iface eth1 inet static
address 192.168.100.1
netmask 255.255.255.0
network 192.168.100.0
broadcast 192.168.100.255

Instalamos ahora los paquetes correspondientes a los servicios que vamos a necesitar y que no vienen incorporados en la instalación por defecto: dhcp y squid:

sudo apt-get install dhcp squid

Usaremos el servicio dhcp para asignar direcciones en nuestra red interna. Para configurarlo debemos, primero, editar el fichero /etc/default/dhcp para especificar la interface que queremos que use el servicio (por defecto es eth0 y nosotros lo queremos en eth1). Para ello basta con completar la siguiente línea en dicho fichero:

INTERFACES="eth1"

Luego editamos el fichero /etc/dhcpd.conf y configuramos los datos correspondientes a la subred que vamos a administrar:

subnet 192.168.100.0 netmask 255.255.255.0 {
     range 192.168.100.100 192.168.100.254;
     option broadcast-address 192.168.100.255;
     option routers 192.168.100.1;
     option domain-name-servers 80.58.61.250, 80.58.61.254;
     }

Y ahora ya arrancamos el servicio de dhcp con /etc/init.d/dhcp start

ACTUALIZACI�N PARA DEBIAN 7: Hay algunos cambios en lo relativo a la instalación del servidor dhcp:

  • El paquete de instalación se llama ahora dhcp3-server
  • El fichero de configuración principal (donde seleccionamos el interface de escucha) se llama ahora isc-dhcp-server y sigue estando en el directorio /etc/default
  • El fichero donde configuramos los pool de direcciones se sigue llamando dhcpd.conf pero se encuentra ahora en el directorio /etc/dhcp
  • El daemon del servicio se llama ahora isc-dhcp-server

Ya casi estamos. Ahora vamos a hacer unos cambios en el fichero de configuración de squid (/etc/squid/squid.conf). Primero localizamos la línea con el puerto de entrada de squid (por defecto http_port 3128) y añadimos el parámetro transparente. Debe de quedarnos algo así:

http_port 3128 transparent

A continuación de esto, y en el mismo fichero, añadimos la siguiente línea:

acl lan src 192.168.1.2 192.168.100.0/24

Y, por último, buscamos la siguiente línea y la descomentamos (o la escribimos si no aparece):

http_access allow localnet

Ahora sólo nos queda configurar la máquina como router y direccionar el tráfico web que recibe por el interfaz interno (eth1) al puerto 3128 que es el que usa squid. Esto lo hacemos gracias a IPtables (que vienen instaladas en Debian por defecto) y al script que os copio a continuación (que he tomado de las páginas de Unixcraft) y que debes de configurar para que se ejecute de forma automática en el arranque de la máquina:

#!/bin/sh
# squid server IP
SQUID_SERVER="192.168.1.2"
# Interface connected to Internet
INTERNET="eth0"
# Interface connected to LAN
LAN_IN="eth1"
# Squid port
SQUID_PORT="3128"
# DO NOT MODIFY BELOW
# Clean old firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Load IPTABLES modules for NAT and IP conntrack support
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# For win xp ftp client
#modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
# Unlimited access to loop back
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow UDP, DNS and Passive FTP
iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT
# set this system as a router for Rest of LAN
iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE
iptables --append FORWARD --in-interface $LAN_IN -j ACCEPT
# unlimited access to LAN
iptables -A INPUT -i $LAN_IN -j ACCEPT
iptables -A OUTPUT -o $LAN_IN -j ACCEPT
# DNAT port 80 request comming from LAN systems to squid 3128 ($SQUID_PORT) aka transparent proxy
iptables -t nat -A PREROUTING -i $LAN_IN -p tcp --dport 80 -j DNAT --to $SQUID_SERVER:$SQUID_PORT
# if it is same system
iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT
# DROP everything and Log it
iptables -A INPUT -j LOG
iptables -A INPUT -j DROP

Si hemos arrancado de forma manual el script anterior, a continuación hay que reiniciar el daemon de squid:

service squid restart

Y lo que nos queda ya es bien fácil: personalizar la página que muestra Squid cuando tratas de visitar una página restringida (esto es opcional, claro, pero conveniente) y configurar las reglas de páginas prohibidas y permitidas. Si tenéis problemas con el tema de las reglas u os resulta más cómodo contar con una interfaz web para la configuración de estas, webmin tiene un módulo para la configuración de squid.

13 comentarios

  1. Hola amigo, excelente POST, con una pregunta:
    Tengo Windows server 2012 con dos tarjetas de red , y quiero tener una maquina virtual con debian para el proxy, mi pregunta es como configuro la red en la maquina virtual, para que me funcione. Muchas gracias por tu comentario, excelente trabajo el que realizas en el blog.

    Saludos.

  2. Brillante: ojalá Google hubiera puesto ésta página en primer lugar. Me habría ahorrado 3 días de otros scripts caducos.

    ¡Muchas gracias!

  3. Hola buen dia con una consulta el proxy funcionaria si lo pongo atras de un firewall si es asi como direcciono la red lan, tengo que cambiar la configuracion de red en los host. para decirles que ya no vayan al fw sino que pasen por el proxy? o hay otra forma.

  4. Gracias por el tutorial, lo segui paso a paso y esta andando mi proxy en un ubuntu 11.10.
    Lo que ma interesa es ver la forma que en la misma pc que esta instalado el proxie se pueda hacer uso de el, por que para navegar en el servidor tengo que ponerle los datos del proxie al navegador.
    En los clientes si me funciona de forma transparente el provie.
    Puede usted ayudarme en eso por favor.

  5. Excelente Post amigo. Tengo una duda. Si no tenfo el router del diagrama (192.168.1.1) sino que la conexión de internet llega directamente al eth0 (192.168.1.2), y recibe ip por dhcp, como debo cambiar mi regla del firewall para que funciones???

  6. hola amigo, soy nuevo en el mundo de linux y quisiera preguntarte donde configuro el script de iptables,que archivo hay q abrir y modificar para hacer funcionar el iptables

  7. Hola Jose Maria

    soy nuevo en todo esto de Ubuntu , y me encontre con tu pagina,este script que pusite aqui, me ha servido de mucho para hacer funcionar iptables y poder implementar reglas con solo ver tus ejemplos

    muchisimas gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información

ACEPTAR
Aviso de cookies