Navegación
Proyectos
Inicio de sesión
Tweets
Videos
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.
- Inicie sesión para enviar comentarios












como combinar reglas para bloquear ciertas paginas a ciertas ip
darlingm16 — Mié, 05/16/2012 - 16:44Hola, 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!
No probé hacer eso, pero
sebest — Mié, 05/16/2012 - 21:18No 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.
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
los archivos de texto
darlingm16 — Vie, 05/18/2012 - 10:06ah, 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...
duda con iptables
elchinoeloriginal — Vie, 05/06/2011 - 13:01hola 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
Los asteriscos son
sebest — Vie, 05/06/2011 - 15:23Los 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.
muchas gracias por la pronta respuesta
elchinoeloriginal — Vie, 05/06/2011 - 17:07igual 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
Como lo tenes tiene que
sebest — Vie, 05/06/2011 - 18:19Como 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?.
muchas gracias
elchinoeloriginal — Vie, 05/06/2011 - 18:30de seguro ahy esta la cosa lo pruebo y te aviso
suerte !!!!!!
gracias ya quedo
elchinoeloriginal — Lun, 05/09/2011 - 12:05muchas 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
1o. Depende del servidor, si
sebest — Lun, 05/09/2011 - 17:421o. 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