Proxy transparente con Squid + DHCP en Ubuntu 13.04 32 bits

Ubuntu1304Bueno, este mes de julio he dispuesto de más tiempo para poder instalar y configurar en una de las aulas de informática el ordenador del profesor como PROXY TRANSPARENTE y servidor DHCP en Ubuntu 13.04 32 bits.

Para este caso dispongo de un servidor con dos tarjetas de red, una de ellas será la que esté conectada al router que nos da acceso a Internet (eth0) y la otra estará de cara al aula, la red interna (eth1).

En primer lugar debemos configurar nuestras interfaces de red, la primera, eth0 se configurará por DHCP desde el router, y la segunda, eth1, tendrá una IP estática a nuestra elección, para mi caso 192.168.0.1, como puerta de enlace la misma y DNS para navegar.

DHCP

Una vez configuradas las tarjetas de red, empezamos con el DHCP. Para instalar ejecutamos desde una consola el siguiente comando.

$ sudo apt-get install isc-dhcp-server

En algunos casos puede ser que funcione dhcp3-server (obsoleto) en vez de isc-dhcp-server.

Seguidamente debemos especificar la interfaz por la que serviremos las direcciones IP a nuestros clientes, recordar, la interfaz interna. Editamos el fichero /etc/default/isc-dhcp-server con nuestro editor favorito y buscamos la opción INTERFACES para indicar cual será la nuestra.

$ sudo gedit /etc/default/isc-dhcp-server

Dejándolo como se muestra a continuación.

# Defaults for isc-dhcp-server initscript
# sourced by /etc/init.d/isc-dhcp-server
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPD_PID=/var/run/dhcpd.pid

# Additional options to start dhcpd with.
#	Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth1"

Ahora debemos configurar los parámetros del servicio DHCP, para eso vamos a /etc/dhcp y antes de nada hacemos un backup de dhcpd.conf.

$ sudo cp dhcpd.conf dhcpd.conf.original

Y editamos el fichero.

$ sudo gedit dhcpd.conf

Lo podemos borrar por completo y añadir únicamente nuestra configuración, aquí dejo la que he utilizado yo para el aula.

option domain-name "server-inf01.public";
option domain-name-servers ns1.server-inf01.public, ns2.server-inf01.public;

default-lease-time 600;
max-lease-time 7200;

# AulaInformatica
subnet 192.168.0.0 netmask 255.255.255.0 {
	range 192.168.0.10 192.168.0.40;
	option domain-name-servers tu_DNS1, tu_DNS2;
	option domain-name "inf01.server.public";
	option routers 192.168.0.1;
	option broadcast-address 192.168.0.255;
	default-lease-time 600;
	max-lease-time 7200;
}

Guardamos y ya podemos reiniciar el servicio y comprobar.

$ sudo service isc-dhcp-server restart

En ocasiones, puede ser que necesitemos hacer reservas de direcciones IP, asignar la misma IP siempre al mismo equipo. En el mismo fichero de configuración, /etc/squid/dhcpd.conf, podemos añadir las siguientes líneas.

#Reservas
host inf01-13 {
	hardware ethernet 00:1d:60:96:53:85;
	fixed-address 192.168.0.13;
	option routers 192.168.0.1;
	option domain-name "inf01.server.public";
}

Deberemos tener este conjunto de líneas por cada una de las reservas que queramos tener.

Ya tenemos el segundo paso terminado.

PROXY TRANSPARENTE SQUID

En primer lugar debemos instalar Squid en nuestra máquina, desde un terminal ejecutamos el siguiente comando.

$ sudo apt-get install squid3

El siguiente paso será configurar nuestro Squid, editamos el fichero squid.conf que encontraremos en /etc/squid3.

$ sudo gedit /etc/squid3/squid.conf

Deberemos modificar las siguientes opciones.

http_port 3128

por esta otra

http_port 192.168.0.1:3128 transparent

3128 es el puerto de Squid y debemos indicar la dirección IP del servidor, la que se encuentre en la parte interna.

Si nuestra máquina tiene suficiente memoria, le quitamos la almohadilla a la opción cache_men, y utilizamos un valor coherente a nuestra máquina, en mi caso la he dejado como se muestra.

cache_mem 512 MB

Buscamos la opción cache_dir y la ajustamos como en la siguiente línea, aunque aquí los valores de caché dependerán de nuestras preferencias y máquina.

cache_dir ufs /var/spool/squid3 2048 16 256

Y activamos las siguientes opciones, para asegurar que ningún usuario pueda acceder a los recursos gestionados por Squid.

cache_effective_user proxy
cache_effective_group proxy

Descomentamos la opción half_closed_clients y la dejamos en off, esto permitirá a Squid cerrar las peticiones de los clientes que se queden a medias cuando cierran la conexión TCP.

half_closed_clients off

Ahora limitamos el tamaño máximo de los objetos que se guardarán en memoria, esto puede ahorrarnos problemas con el tamaño de la caché. Descomentamos la siguiente línea y la dejamos en 1024 KB.

maximum_object_size 1024 KB

También vamos a indicar cuando debe Squid vaciar la caché, esto nos permitirá un mejor mantenimiento. Descomentamos las siguientes líneas.

cache_swap_low 90
cache_swap_high 95

En mi caso dejo los valores que nos dan por defecto. Como última modificación en las opciones de configuración de Squid, buscamos la opción memory_pools, la descomentamos y la ponemos en off.

memory_pools off

Esta opción, hará que Squid libere la memoria RAM que no esté utilizando.

Por último, tras la siguiente línea,

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

Añadiremos la regla para permitir el acceso a Internet de nuestra red interna.

acl mi_red src 192.168.0.0/24
http_access allow mi_red

Y con esto ya podemos reiniciar Squid.

$ sudo service squid3 restart

IPTABLES

Ya sólo nos faltan las IPTABLES, estas son muy duras de entender y no es que las domine, pero podemos encontrar varios scripts por internet que hacen lo que necesitamos.

Yo me he quedado con el siguiente que se adapta bastante a lo que necesito.

#!/bin/sh
# IP del servidor SQUID
SQUID_SERVER="192.168.0.1"
# Interface conectada a Internet
INTERNET="eth0"
# Interface interna
LAN_IN="eth1"
# Puerto Squid
SQUID_PORT="3128"

# Limpia las reglas anteriores
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Carga los modulos IPTABLES para NAT e IP con soporte conntrack
modprobe ip_conntrack
modprobe ip_conntrack_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
# Politica de filtro por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
# Acceso ilimitado a loop back
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permite UDP, DNS y FTP pasivo
iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT
# Establece el servidor como router para la red
iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE
iptables --append FORWARD --in-interface $LAN_IN -j ACCEPT
# acceso ilimiato a la LAN
iptables -A INPUT -i $LAN_IN -j ACCEPT
iptables -A OUTPUT -o $LAN_IN -j ACCEPT
# Redirige las peticiones de la red interna hacia el proxy
iptables -t nat -A PREROUTING -i $LAN_IN -p tcp --dport 80 -j DNAT --to $SQUID_SERVER:$SQUID_PORT
# Redirige la entrada al proxy
iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT
# Registrar todo
iptables -A INPUT -j LOG
iptables -A INPUT -j DROP

Podéis encontrar el original aquí.

El inconveniente está en que las IPTABLES debes ejecutarlas cada vez que arranquemos la máquina, por eso crearemos un script y haremos que se ejecute siempre al iniciar el equipo.

Copiamos el script en /etc/init.d/.

$ sudo cp iptables_proxy.sh /etc/init.d

Cambiamos el propietario y los permisos del script.

$ sudo chown root:root iptables_proxy.sh
$ sudo chmod 700 iptables_proxy.sh

A continuación editamos el fichero /etc/init.d/rc.local.

$ sudo gedit /etc/init.d/rc.local

Y añadimos las siguientes líneas bajo ### END INIT INFO.

### END INIT INFO

cd /etc/init.d
./iptables_proxy.sh

Ya podremos reiniciar nuestra máquina y comprobar que se ejecuta y realiza su función correctamente, espero os sirva de ayuda.

Au!!

Fuentes:
Sebest
Ubuntu Server Guide
tldp.org