Icono del sitio Un lugar en el mundo…

Proxy transparente con Squid en Debian

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:

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.

Salir de la versión móvil