Inicio

Navegación

  • Foros
  • Buscar
  • Idiomas

Proyectos

  • Howto
  • Open Hardware
  • Open Software

Inicio de sesión

  • Solicitar una nueva contraseña

Pulpito JM60

Tweets

Videos

Coundown Ubuntu

The next version of Ubuntu is coming soon

Filtro para Internet (Squid3 + Iptables)

sebest — Vie, 10/30/2009 - 19:05

Voy a explicar rápidamente como configurar una Pc para usarla como filtro de internet. Los objetivos de este proyecto son:

  • Establecer unas reglas para filtrar el contenido de las web visitadas
  • Restringir el acceso de determinados puertos
  • Y configurar redirecciones a puertos en determinados ips (port forwarding)

Los requisitos para llevar a cabo este proyecto son:
Una PC como mínimo, un Pentium 3, 512mb Ram, 2 placas de red y 80 Gb de disco serán un buen punto de inicio.
Además necesitaremos bajar de internet alguna versión para servidores de alguna distro de linux.
Cualquier versión de linux estará bien, pero por simplicidad y gusto personal recomiendo la versión server de Ubuntu que se puede descargar gratis de www.ubuntu.com

Por tratarse de una versión server, la misma no cuenta con un entorno gráfico y es necesario trabajar todo desde la consola. Para quien nunca uso la consola, quizá sea un poco difícil al principio, pero voy a detallar todos los comandos para ayudar un poco al entendimiento.

Voy a dar por hecho que la versión server de Ubuntu pudo ser instalada sin problemas que nos conectamos a internet mediante ppp0 (ip dinamica) y que eth1 es la interface de la red local con un ip 192.168.1.1 que se tiene que definir manualmente.

Es necesario tener permisos de root para ejecutar todas las tareas que a continuación se detallarán. Si se utiliza Ubuntu, esto se puede hacer simplemente con el comando sudo su y luego ingresar la cable del usuario.

Tendríamos que empezar por instalar Squid3 (esto es un proxy).

apt-get install squid3

Una vez instalado, tendremos que empezar a configurarlo. Vamos primero al directorio donde se encuentran los archivos de configuración:

cd /etc/squid3

Allí se encuentra el archivo squid.conf, que es el archivo que tiene toda la configuración del proxy, entraremos modificaremos algunas cosas, definiremos un par de reglas y listo.

nano squid.conf

El comando nano, es un editor de texto, y la información sobre los comandos de este, se encuentra en la parte de abajo, y el simbolo ^ es el Ctrl, por ejemplo:
^X Salir => Significa que Ctrl + X = Sale, cierra el editor, si fue modificado, pregunta si hay que salvar los cambio.
El archivo es bastante extenso, y es un poco complicado manejarlo con la consola, pero con un poco de paciencia se puede, aclaro todo lo que esta precedido por un # es un comentario, por lo tanto será omitido por el squid.

Vamos a modificar donde dice http_port 3128 agregándole al final la palabra transparent, quedará así:

http_port 3128 transparent

Esto nos permitirá configurar nuestro proxy de forma transparente, de esta manera no será necesario modificar nada en la Pc clientes. Más tarde veremos más de esto.

Ahora buscamos la sección ACCESS CONTROLS y allí vamos a agregar nuestros controles, hay mucha información de esto, vamos a ver algo genérico, pero dentro del archivo de configuración del squid se puede ver varios ejemplos.

acl permitidos src "/etc/squid3/permitidos"
acl dominios_permitidos dstdom_regex "/etc/squid3/dom-permitidos"
acl web_permitir dstdomain "/etc/squid3/web-permitir"
acl web_denegar dstdomain "/etc/squid3/web-denegar"
acl url_denegar url_regex "/etc/squid3/denegar"

Lo que se hizo fue definir algunos controles, la primera tendrá una lista de ips de la red local, se cargaran uno abajo de la otra en el archivo permitidos, que en este ejemplo queremos que todas esas ips tengan acceso total.
El segundo va a contener dominios primarios, por ejemplo .gov.ar, .gov, etc, uno abajo del otro.
El tercero va a tener una lista de páginas que queremos permitir.
El cuarto tendrá una lista de páginas que queremos prohibir.
Y la quinta regla tendrá una lista de palabras que queremos prohibir.

Todos estos archivos deberán ser creados por nosotros, y tendríamos que cargarle algo. Con el comando nano seguido del nombre del archivo podemos crear el archivo y empezar a editarlo, toda la información deberá ser cargada una abajo de la otra. Ejemplo de los archivos:

nano /etc/squid3/permitidos
192.168.1.1
192.168.1.2

nano /etc/squid3/dom-permitidos
.gov.ar
.gov
.org

nano /etc/squid3/web-permitir
.google.com.ar
.google.com
.sebest.com.ar

nano /etc/squid3/web-denegar
.youtube.com
.microsoft.com
.hotmail.com

nano /etc/squid3/denegar
xxx
porn
windows
bill
gates
mac

Ahora debemos definir el orden de las reglas y cual será permitida y cual denegada. Para eso vamos a la sección INSERT YOUR OWN RULE (S)

http_access allow localhost
http_access allow permitidos
http_access allow dominios_primarios
http_access deny url_denegar
http_access deny web_denegar
http_access allow web_permitir
http_access deny all

El orden de las reglas es muy importante, cuando coincide con una saltea el resto. Esta configuración es muy restrictiva, prohíbe todo lo que no se acepta explícitamente, quitando la última regla, podríamos hacerlo un poco más libre. Notar las palabras claves allow y deny que denotan permitir o denegar respectivamente.

También es posible cambiar el tamaño del cache desde este archivo y modificar un par de cosas más pero estamos haciendo algo básico. Así que lo dejaremos acá. Una vez terminado de editar el archivo, salimos salvando y reseteamos el servicio con el comando

/etc/init.d/squid3 restart

Con esto ya podemos empezar a disfrutar de nuestro proxy, pero tendríamos que configurar el browser del cliente, con la opción de proxy en el puerto 3128. Pero como nuestra intención es que los usuarios no tengan que modificar nada vamos a crear un script para que el iptables routee todos los paquetes que vayan al puerto 3128 y los mande al 80, que es el que usan las páginas webs por defecto. Así nos evitamos de modificar todas las Pc clientes.

IPTABLES

El iptables es un firewall que permite definir algunas reglas, y va a cumplir varias funciones en nuestra red. Por un lado va a hacer que el squid sea transparente, como explicamos anteriormente, y por otro lado va a permitirnos bloquear puertos de ingreso, salida y forward de la red. Además nos va a permitir hacer port forwarding.

Las reglas de ingreso, reciben el nombre de INPUT y hacen referencia a conexiones que ingresan en el servidor.

Las reglas de salida, reciben el nombre de OUTPUT y hacen referencia a las conexiones que salen del servidor.

Y las reglas de FORWARD, reciben el nombre de FORWARD y hacen referencia a las conexiones que se transmiten por la red interna.

Creamos el script con el comando

nano /etc/init.d/iptables.sh

y allí escribiremos los siguientes comandos.

#Borrar cadenas anteriores
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

#Condiciones por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

#Desde el localhost se puede hacer todo
iptables -A INPUT -i lo -j ACCEPT

#Desde la red local se puede acceder al servidor
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

#Dejamos abiertos los puertos que necesitemos que se vean desde internet
#Supongamos que también tenemos un servidor web en esta PC
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#Supongamos que queremos acceder al ssh desde internet
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Permitimos los puertos que pueden usar en la red local
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 22 -j ACCEPT
#Si queremos que nuestros clientes se conecten al msn descomentar la siguiente linea
#iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 1863 -j ACCEPT

#Redirecciones port forwarding
#En el ip 192.168.1.10 y puerto 5900 tenemos una pc con escritorio remoto.
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 5900 -j DNAT --to 192.168.1.10:5900
iptables -A FORWARD -s 192.168.1.10 -i eth1 -p tcp --sport 5900 -j ACCEPT

#Denegamos todos los demas puertos de FORWARD
#Con esto bloqueamos todo lo que no se acepto anteriormente
#por ejemplo cualquier P2P y el msn.
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -j DROP

#Cerramos todos los puertos de INPUT que no permitimos anteriormente
iptables -A INPUT -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -p udp --dport 1:1024 -j DROP

#Con esto hacemos transparente el squid
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

#Esta linea es muy importante, habilita el forwardeo de nuestro servidor
echo 1 > /proc/sys/net/ipv4/ip_forward

Solo falta cerrar y guardar, ahora tendríamos que hacer que este script tenga permisos de ejecución y se ejecute cada vez que iniciamos el

chmod +x /etc/init.d/iptables.sh
ln -s /etc/init.d/iptables.sh /etc/rc2.d/S98iptables

Listo solo ahora podrías ejecutar tu script o reiniciar el servidor para poder empezar a usar todo esto.

Algunos detalles más, se debe tener en cuenta que el servidor no tiene instalado un servicio de dhcp, es fácil de instalar y es recomendable hacerlo, para poder usar el proxy en la red tendríamos que definir manualmente un ip en alguna máquina cliente y poner la dirección de ip del servidor como gateway (pasarela o puerta de enlace predeterminada), además tendrás que cargar los dns de tu conexión de internet.

Comparta este post con:
  • Delicious
  • Digg
  • StumbleUpon
  • Newsvine
  • Facebook
  • Google
  • Yahoo
  • Twitter
  • Inicie sesión para enviar comentarios

como combinar reglas para bloquear ciertas paginas a ciertas ip

darlingm16 — Mié, 05/16/2012 - 16:44

Hola, gracias por la explicación, esto me funciona si quiero bloquear páginas a toda la red o si quiero bloquear todo el acceso por ip, pero por favor me puedes decir como combino las reglas para bloquear ciertas páginas a un grupo de ip? en squid me funcionaba la combinación pero no logro que me funcione con squid3, de antemano muchas gracias!

  • Inicie sesión para enviar comentarios
Imagen de sebest

No probé hacer eso, pero

sebest — Mié, 05/16/2012 - 21:18

No probé hacer eso, pero conta como lo hacías en la versión anterior y en función de eso vemos como se puede hacer en esta versión.

  • Inicie sesión para enviar comentarios

Hola de nuevo

darlingm16 — Vie, 05/18/2012 - 10:01

.
Hola, pues estas eran las lineas modificadas en el archivo de configuración del squid, he consultado y al parecer es igual para squid3, sin embargo no me funciona, sigo haciendo pruebas
.
acl CONNECT method CONNECT
acl red_local src 192.168.250.0/24
acl bloqueados dstdomain "/etc/squid/bloqueados.txt"
acl ip_bloqueados src "/etc/squid/ip_bloqueados.txt"
.
.
#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny bloqueados ip_bloqueados
http_access allow red_local

  • Inicie sesión para enviar comentarios

los archivos de texto

darlingm16 — Vie, 05/18/2012 - 10:06

ah, se me olvidaba los archivos de texto bloqueados.txt y ip_bloqueados.txt contienen las listas de url's y la lista de ip's respectivamente, y lo que necesito es que se bloqueen esas url en esas direcciones ip. Consulté la sintaxis aqui http://tuxjm.net/docs/Manual_de_Instalacion_de_Servidor_Proxy_Web_con_Ub...

  • Inicie sesión para enviar comentarios

duda con iptables

elchinoeloriginal — Vie, 05/06/2011 - 13:01

hola excelente post, solo tengo una inquietud que no he podido resolver, cuando cierro el p2p y el msn con esta linea

#Denegamos todos los demas puertos de FORWARD
#Con esto bloqueamos todo lo que no se acepto anteriormente
#por ejemplo cualquier P2P y el msn.
#iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -j DROP

tambien no puedo enviar correos por el puerto 25, ya agregue la linea del forward mas atras:

#Permitimos los puertos que pueden usar en la red local
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -S 192.168.0.0/24 -i eth1 -p tcp --dport 25 -j ACCEPT

pero aun asi no jala me pudes echar una mano porfavor ?

te anexo mi iptables completo:

#Borrar cadenas anteriores
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

#Condiciones por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

#Desde el localhost se puede hacer todo
iptables -A INPUT -i lo -j ACCEPT

#Desde la red local se puede acceder al servidor
iptables -A INPUT -s 192.168.0.0/24 -i eth1 -j ACCEPT

#Dejamos abiertos los puertos que necesitemos que se vean desde internet
#Supongamos que tambié¯n tenemos un servidor web en esta PC
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#Supongamos que queremos acceder al ssh desde internet
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#el puerto del correo 25
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT

#Permitimos los puertos que pueden usar en la red local
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -S 192.168.0.0/24 -i eth1 -p tcp --dport 25 -j ACCEPT
#Si queremos que nuestros clientes se conecten al msn descomentar la siguiente linea
#iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 1863 -j ACCEPT

#Redirecciones port forwarding
#En el ip 192.168.0.2 y puerto 5900 tenemos una pc con escritorio remoto.
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport5900 -j DNAT --to 192.168.0.10:5900
#iptables -A FORWARD -s 192.168.0.2 -i eth1 -p tcp --sport 5900 -j ACCEPT

#Denegamos todos los demas puertos de FORWARD
#Con esto bloqueamos todo lo que no se acepto anteriormente
#por ejemplo cualquier P2P y el msn.
#iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -j DROP

#Cerramos todos los puertos de INPUT que no permitimos anteriormente
iptables -A INPUT -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -p udp --dport 1:1024 -j DROP

#Con esto hacemos transparente el squid
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
#Esta linea es muy importante, habilita el forwardeo de nuestro servidor
echo 1 > /proc/sys/net/ipv4/ip_forward

  • Inicie sesión para enviar comentarios
Imagen de sebest

Los asteriscos son

sebest — Vie, 05/06/2011 - 15:23

Los asteriscos son comentarios. Si queres que ande le tenes que sacar el asterisco.

Para probar el firewall te podes instalar iptraf que funciona en modo consola, que te permite ver los puertos que usa cada conexion.

  • Inicie sesión para enviar comentarios

muchas gracias por la pronta respuesta

elchinoeloriginal — Vie, 05/06/2011 - 17:07

igual no me supe explicar, te decia que cuando dejo cometada esta linea :

#Denegamos todos los demas puertos de FORWARD
#Con esto bloqueamos todo lo que no se acepto anteriormente
#por ejemplo cualquier P2P y el msn.
#iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -j DROP

no me funciona la salida de correo de la lan por el puerto 25 que cres que sea????

si la descomento si sale correo pero automaticamente los clientes pueden acceder al msn y al p2p que es lo que quiero evitar

  • Inicie sesión para enviar comentarios
Imagen de sebest

Como lo tenes tiene que

sebest — Vie, 05/06/2011 - 18:19

Como lo tenes tiene que andar. Probá ponerle la "S" en minuscula por las dudas, no veo otro error.

iptables -A FORWARD -S 192.168.0.0/24 -i eth1 -p tcp --dport 25 -j ACCEPT

Revisa bien que no haya algún error de ese tipo, cuando corres el script no te da ningún error?.

  • Inicie sesión para enviar comentarios

muchas gracias

elchinoeloriginal — Vie, 05/06/2011 - 18:30

de seguro ahy esta la cosa lo pruebo y te aviso

suerte !!!!!!

  • Inicie sesión para enviar comentarios

gracias ya quedo

elchinoeloriginal — Lun, 05/09/2011 - 12:05

muchas gracias ya esta funcionando correctamente mi correo electronico, solo dos dudas:

1o. es recomendable tener el proxy, con otros servicios como smb y ftp, en un mismo servidor, mi server es potente (solo ocupo el 25 % de su capacidad), y por economia pretendo tener todos los servicios en el mismo, o me recomiendas mejor tener el proxy en otra pc?

2. pretendo abrir el ares para ciertas ip, por ejemplo la mia y otras tres de gerencias, como hago una excepcion a esta regla????

iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -j DROP

gracias de antemano por todo

saludos desde Mexico

  • Inicie sesión para enviar comentarios
Imagen de sebest

1o. Depende del servidor, si

sebest — Lun, 05/09/2011 - 17:42

1o. Depende del servidor, si no se pone muy lento no hay problema.
2o. Hay un ejemplo para abrir un puerto para forwarding

#Redirecciones port forwarding
#En el ip 192.168.1.10 y puerto 5900 tenemos una pc con escritorio remoto.
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 5900 -j DNAT --to 192.168.1.10:5900
iptables -A FORWARD -s 192.168.1.10 -i eth1 -p tcp --sport 5900 -j ACCEPT

Con eso abri el puerto, pone eso con el puerto que vos quieras usar en lugar del 5900 y la ip correspondiente, podes hacer una linea de esas por ip. Despues de cerrar todos los ip de forwardeo, o sino podes poner las condiciones por defecto en drop, la primeras de todas, y borrar la linea

iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -j DROP

Que se me hace seria lo más correcto.

Probá por las dudas de las dos maneras y fijate si te anda bien.

Suerte

  • Inicie sesión para enviar comentarios

Seguinos en Twitter
Seguir a sebastianoldani en Twitter