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

35 pensamientos en “Proxy transparente con Squid + DHCP en Ubuntu 13.04 32 bits”

    1. Hola jhon, perdona el retraso, cómo has configurado la interfaz que da la salida? si es por DHCP, debe haber un router u otro dispositivo que te de la configuración y la salida a Internet.

      1. quiero montar un proxy con squid en mi trabajo, pero no logro entender como va la configuracion de las dos tarjetas. ( no se si debo dejar una como DHCP o las dos configuradas con IP internas)

        Tenemos el router que entrega el proveedor de internet, configure squid, iptables, y el script sh, pero los demas equipos quedan sin reconocer la red y sin salida a internet.

        aclaro que una de las tarjetas la tengo configurada con una IP publica estatica que esta contratada a nuestro proveedor.

        http://imagizer.imageshack.us/v2/800x600q90/89/bkz4.jpg

        1. Hola Antonio,
          Veamos, entiendo que el proxy estará entre le router que os da la salida a internet y la red. La tarjeta que conecte con el router deberá tener la configuración por DHCP, si el router está configurado para dar IPs, si no es así, deberás configurarla estática como corresponda.
          La tarjeta interna del proxy será la que acepte las peticiones de red de tus clientes, esta sí debes configurarla como fija, ya que será la puerta de enlace para ellos.
          Fíjate en esta imagen.
          Espero haberte aclarado algo.

  1. Hola compañeros! he configurado el proxy como decís y funciona bien, lo que ahora quería implementar la validación de usuarios a través de ncsa_auth y he conseguido que funcione pero mi gran problema es que en modo transparente no funciona, me deniega el acceso siempre, tengo que ir maquina por maquina a configurar la opción de proxy ( así ya no tiene sentido lo del proxy transparente ) alguna idea o algún manual de como configurar squid transparente con validación de ncsa_auth ????

    Gracias

    1. Hola,
      Me alegro que te haya servido, en cuanto a tu planteamiento, yo no lo he conseguido, si configuras Squid como transparente, no puedes utilizar autenticación. Si lo piensas fríamente, verás que perdería la razón de ser, ya que, que éste sea transparente, significa que el usuario no tiene constancia de su existencia.
      Pero si lo consigues, por favor cuéntanoslo.

      Un saludo.

  2. Hola, utilice tu publicacion y me sirvió de mucho, tenía tiempo.tratando de hacerlo en opensuse, instale Ubuntu 14.04 y todo marcha bien, hasta que reinicio; sucede que el servicio DHCP no inicia durante el arranque, a pesar de que lo configure así por medio de webmin. Espero puedas ayudarme. Saludos y Gracias por darte el tienpo de hacer estas publicaciones, son de gran ayuda.

    1. Hola oscar,
      todavía no lo he probado sobre la 14.04, pero se me ocurre, que para asegurar el inicio del DHCP, metas la siguiente línea:

      service isc-dhcp-server start

      en el archivo rc.local, justo después de ### END INIT INFO. De esta forma, lanzas el servicio antes de cargar las IPTABLES.
      Ya me cuentas si todo va bien.
      Un saludo.

          1. ninguno, entro al webmin, doy clic al boton “start service” y cambia a “stop service”, verifico el estado desde la terminal y me dice “isc-dhcp-server start/running, process 2788”

          2. sin embargo (olvide mencionar), al iniciar el equipo me indica error en el sistema y me pregunta si deseo reportarlo o cancelar “system program problem detected. do you want to report the problem now?”

            en detalles dice: Acccion com.ubuntu.apport-gtk-root, entre otros detalles dice que ubuntu ha experimentado un error interno, executable path /usr/squid3/pinger

  3. He probado todos los pasos correctamente y aun así no me funciona la transparencia, el dhcp me funciona y los clientes tienen como puerta de enlace el del servidor quid pero no les llega la internet, en la maquina ubuntu tengo 2 nics, una para la adsl y la otra para la lan. Todo va bien, si pongo el proxy manualmente lo coge, pero no sin proxy.

    1. Hola Jaime,
      Has añadido las iptables? son necesarias para la redirección de una tarjeta de red a otra. Con lo que me dices, el DHCP y el proxy Squid parece que está bien configurado.
      Un saludo.

      1. Si he añadido las iptables tal como tu indicas canviando las direcciones ip especificas que yo tengo en cada adaptador

      2. hola
        1-una duda en esta linea quiero saber sei “mi_red” a q reemplaza en cada configuracion personal ?
        acl mi_red src 192.168.0.0/24
        http_access allow mi_red

        2- el puerto 3128 es acceso completo no?
        y hay otro puerto para usuarios estandares o limitados en privilegios?
        Gracias!!

        1. Hola Javier,
          Veamos, al punto 1, sí “mi_red” se reemplaza con la Red que configures en el ACL.
          En cuanto al punto 2, hasta donde llego, todos los usuarios van hacia el mismo puerto, debes controlar con las reglas la diferencia entre usuarios.

          Un saludo.

  4. Los sctipt de iptables es recomendable guardarlos en /etc/network/if-up.d/ en este directorio se ejecutan automaticamente cuando inicie la tarjeta de red. y asi evitamos problemas de que se inicie el script antes que la tarjeta lo que seria inutil ya que la lan no existe.

  5. Saludos, he configurado el servidor de la manera indicada pero tengo un problema, no me coje automaticamente el servidor sino que tengo q agregar la direccion y puerto para que funcione. Se supone que si ponemos en modo transparent no deberiamos configurar esto. Me podrias ayudar con el problema que tengo Saludos.

  6. Hola que tal un apregunta he realizado todo al pie de la letra pero en ubuntu server 14.04 y hay coneccion en las maquinas clientes pero la maroria de paginasestanbloqueadas o cunado trato de ingresar a hotmail ya no lo hace ssimplemente muestra la pagina principal o de logeo, si busco algun tema en google lo busca pero a la hora de darle click al link o la liga este ya no lo abre saluos y espero haya respuesta !!

  7. He seguido esta guia y todo va funcionando correctamente, pero al momento de ejecutar iptables, me sale un error que no ha podido hacer cd /etc/init.d. es como si no permitiera hacer las modificaciones que solicita, aunque hice las modifcicaciones de permisos de root que usted pedia, la version de ubuntu que estoy usando es 14.04. Gracias por cualquier ayuda.

  8. Buenos dias.
    Esta buenisima la guia, perfectamente explicada. Ahora, mi problema es el siguiente:
    Quiero levantar un servidor proxy, pero tengo un firewall encargado de hacer el DHCP en la red. Por algunas cuestiones, me gustaria que este siga siendo el encargado de esta funcion. Es posible hacer esto?

  9. Buenos dias Javier, muy buena guia! la segui completa y me funciona, pero tengo unas dudas:
    Cuando hago esto me funciona todo bien, pero internet me va lentisimo! pero demasiado lento.
    Yo creo que mi conf. influye. te lo cuento:
    Yo tengo 1 router Lan y un router ADSL (ambos cisco) y entre ambos he colocado el servidor con squid y toda la conf que tu has puesto arriba. Tengo 8 subredes y unos 60 equipos repartidos x las subredes.
    Tanto en el router ADSL como en servidor Proxy hago rutas estaticas para que se vean todas las redes y puedan llegar.
    Me podrias echar una mano en esto, ya que no he conseguido a nadie que pueda ayudarme con esto.
    Muchas gracias.

    1. Hola, veo que hay mucho equipo, pero ten en cuenta que es un proxy caché, por lo que ésta tendrá que crearse a medida que los clientes vayan navegando. Yo aumentaría el tamaño de la caché para soportar bien el tráfico.
      Ya me cuentas.

  10. Hola, primeramente gracias a todos de antemano por ese caudal de conocimiento en especial a javier quien fue el que inicio este post.
    Bueno la razon de este post es hacerles saber la configuracion que tengo en mi squid3 (vercion 3.1.2).
    Primeramente lo hice como javier con los scripts de iptables.
    luego me di cuenta por accidente que no inicie ese script y me siguio funcionando. :-0..
    cargue de nuevo el backup de mi squid.conf para observar si tenia alguna configuracion especial.
    Y pues no.
    Lo unico que hice fue definir la ip de mi server squid (es la interfaz de cara a la red local) con el puerto de escucha. y una acl de mi red local que permita el acceso a http.
    La cosa fue que no tube que hacer nada mas que configurar eso. 🙁
    no entiendo muy bien. quiere decir que squid3 automaticante fitra y hace el forward de paquetes a la otra interfaz por nosotros. ??
    gracias por su atencion y le agradeceria a alquien, que me contestara esta pregunta.

  11. Muy bueno tu post, todo me funciona a las mil maravillas, solo que no puedo navegar por contenido https, que le modifico al script, le puse estas lineas pero ni así.

    # 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
    iptables -t nat -A PREROUTING -i $LAN_IN -p tcp –dport 443 -j DNAT –to $SQUID_SERVER:$SQUID_PORT
    iptables -t nat -A PREROUTING -i $LAN_IN -p tcp –dport 18090 -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
    iptables -t nat -A PREROUTING -i $LAN_IN -p tcp –dport 443 -j DNAT –to $SQUID_SERVER:$SQUID_PORT
    iptables -t nat -A PREROUTING -i $LAN_IN -p tcp –dport 18090 -j DNAT –to $SQUID_SERVER:$SQUID_PORT

  12. Hola javier estuve con lo del proxy semanas y semanas hasta que logre que funcionara en ubuntu 14.04 sin problema alguno solo que no use las iptables si no que use el firewal de webmin agregando algunas cosas en el y funciono perfectamente con squid + dhcp + webmin solo que tengo un problema anteriormente usabamos mikrotik mejor dicho aun lo usamos el problema es que aun no e podido usar el proxy ya que mikrotik tiene un script de dyndns dentro de el para un dominio donde se ejecuta un sistema hecho en php para gestion administrativa de la empresa entonces cuando cambio al proxy el dominio del sistema no me lo reconoce ando buscando como hacer o buscar un ejemplo de dyndns para ubuntu y que ese mismo script en mikrotik corra en ubuntu cuando inicie o se reinicie el servidor si puiedes hecharme una mano y entiendes de lo que te pido te lo agradeceria.. muy bueno este tutorial me sirvio demasiado para entender el proxy Gracias…

  13. Excelente artícuo Javier Carrasco., he configurado el proxy transparente siguiendo tus recomendaciones, funciona perfecto. Sin embargo, he puesto un filtro de contenidos, probé en el navegador del servidor apuntando a la dirección IP de proxy y funciona bien, pero en los clientes el filtro de bloqueos no funciona.. Agradezco cualquier recomendación.

  14. Muy buen tutorial me ayudo demasiado, se agradece, el unico detalle es que a mi me funcionó el iptables con chnod +x /etc/init.d/iptables_proxy.sh y luego /etc/init.d/iptables_proxy.sh start…1 todo en un par de horas saludos!

  15. Funciono Perfecto, tengo una duda deseo poner una pagina de inicio a todos los que se conecten a mi red pero no se como hacer esta la aplicacion de ir-1.0 pero no puedo hacerlo andarya lo instale solo me falta crear creo la BD pero no se como ya instale mysql y los programas que necesita la aplicacion ir.

  16. Me falto lo mas importante agradecer a personas como usted que se preocupa de compartir sus conocimientos y hacer que personas que apenas vamos entrando al mundo linux nos sea mas facil. Mil Gracias

Deja un comentario

* Copy This Password *

* Type Or Paste Password Here *