Configurando SQUID en modo transparente + IPTABLES con soporte para clientes outlook

Tema: 

Que tal en esta ocasión les detallaré como implementé un servidor proxy en Ubuntu Server 10.04.3 LTS

Un poco de historia de squid lo tenemos por acá

La computadora que utilizo posee 2 tarjetas de red, eth0 para la wan la cual está directamente conectada a mi modem infinitum y la eth1 que está conectada a mi switch que a su vez interconecta a mi red de área local.

Teniendo instalado Ubuntu Server escribimos en la terminal sudo apt-get install squid (esto instalará squid).

Nota: Ubuntu server por default viene sin entorno grafico, si deseas instalarle entorno grafico eres libre de hacerlo con el comando sudo apt-get install ubuntu-desktop.

Como pueden ver poseo 2 tarjetas de red cada una con su direccion ip fija si no sabes como situar una ip fija desde consola lo puedes hacer facilmente con el comando ifconfig bajo la siguiente sintaxis:

ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255

con eso lo que haces es que asignas dirección IP, máscara y broadcast al mismo tiempo XD.

como la eth0 es la que va al modem de infinitum le agregamos la puerta de enlace con:

route add default gw 192.168.1.254 (que es la direccion por default del modem)

y la otra interface la configuras de igual forma con ifconfig pero OJO esta como va hacia la lan NO LLEVA gateway.

Una ves instalado SQUID tenemos que editar el archivo de configuracions squid.conf situado en /etc/squid. siempre es bueno respaldar este archivo ya que podemos disponer y hacer malabares con el que vamos a ocupar.

Nos cambiamos al directorio de squid con: cd /etc/squid

Respaldamos el squid.conf con: cp squid.conf squid.bak

ahora en el directorio de squid tendremos el archivo squid.conf y squid.bak con esto podremos editar libremente el squid.conf si algo sale mal, no te preocupes pues tenemos el squid.bak.

Vale pues a configurar el squid.conf para ello escribo en la terminal: sudo nano squid.conf
a continuación borro todo lo que hay ahí (si lo quiero consultar pues tengo el squid.bak)

y pego el siguiente código:

http_port 3128 transparent
httpd_accel_host virtual
httpd_accel_port 3128
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
cache_mem 500 MB
cache_dir ufs /var/spool/squid 750 16 256
cache_mgr pon_tu_correo@gmail.com
access_log /var/log/squid/access.log squid
#############################################################
## Creamos las acl a las que daremos acceso al Proxy
#############################################################
acl sitios_bloqueados url_regex “/etc/squid/sitios_bloqueados”
acl bloquea_msn url_regex “/etc/squid/bloquea_msn”
acl servidores src “/etc/squid/servidores”
acl contraloria src “/etc/squid/contraloria”
acl contabilidad src “/etc/squid/contabilidad”
acl cajas src “/etc/squid/cajas”
acl gerencia src “/etc/squid/gerencia”

acl ventas src “/etc/squid/ventas”
acl reservaciones src “/etc/squid/reservaciones”
acl recepcion src “/etc/squid/recepcion”
acl rh src “/etc/squid/rh”
acl banquetes src “/etc/squid/banquetes”
acl almacen src “/etc/squid/almacen”
acl ayb src “/etc/squid/ayb”

###################################################
## Ahora permitimos el acceso a las acl creadas
###################################################
acl localhost src 127.0.0.1/32
acl all src all
http_access allow localhost
http_access allow contraloria
http_access allow contabilidad !sitios_bloqueados !bloquea_msn
http_access allow ventas !sitios_bloqueados !bloquea_msn
http_access allow reservaciones
http_access allow recepcion !sitios_bloqueados !bloquea_msn
http_access allow almacen !sitios_bloqueados !bloquea_msn
http_access allow ayb !sitios_bloqueados
http_access allow banquetes !sitios_bloqueados !bloquea_msn
http_access allow cajas !sitios_bloqueados !bloquea_msn
http_access allow rh !sitios_bloqueados
http_access allow servidores !sitios_bloqueados
http_access allow gerencia

grabamos los cambios con CONTROL + o y salimos de nano con CONTROL + x.

Explicacion:

http_port 3128 transparent //Le digo a squid que escuche peticiones por el puerto 3128 y en modo transparente.

httpd_accel_host virtual
httpd_accel_port 3128
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

//Con esos parametros establecemos politicas de proxy acelerado.

cache_mem 500 MB //Establecemos una cache de 500 MB para almacenar paginas que visitan los clientes, mientras mas grande la cache mas ahorro de ancho de banda tenemos. Nota: en este parametro debemos tener enn cuenta el tamaño de nuestro disco duro (si establecemos una cache muy grande y no tenemos espacio en nuestro disco duro, squid se colapsará)

cache_mgr tucorreo@gmail.com //Para que aparesca nuestro mail en la página de acceso denegado

access_log /var/log/squid/access.log squid //Activamos el log de squid para futuras auditorias hacia nuestros usuarios (podemos utilizar sarg para obtener reportes mas rápidos y legibles)

Lo demas son ACL mejor conocidas como listas de control de acceso, en ellas decimos quien tiene derecho al proxy y quien no.

como podemos notar yo hago referencia a archivos, o sea mis ACL hacen referencia a archivos que estan en la ruta /etc/squid. Como en mi red poseo direcciones ip fijas, cada archivo que en si es una ACL tiene las direcciones ip que pertenecen al departamento o al bloque de usuarios.

para crear tu archivo en el directorio /etc/squid hazlo con: sudo touch /etc/squid/nombre_de_tu_archivo

y cuando lo abras con nano pon la o las direcciones ip que pertenecen al nombre_de_tu_archivo

de tal suerte que tu ACL (referenciado por el archivo que acabas de crear contendrá algo como esto:

154.5.4.30

154.5.4.31

y asi para cada archivo o ACL que quieras crear.

Una vez que tienes creados tus archivos con las ip correspondientes inicia squid de la siguiente forma: /etc/init.d/squid start

Para que squid se inicie de manera automatica al iniciar o reiniciar el sistema, escribir en consola: sudo chkconfig squid on

Ahora lo que sigue son las IPTABLES

Activando el bit de forward
Por defecto un equipo GNU/Linux no permite que se pasen paquetes entre sus interfaces de red, pero si queremos que actúe como router o como dispositivo de NAT tenemos que cambiar este comportamiento, activando lo que se denomina bit de forward de alguna de las siguientes maneras:

escribiendo en consola: echo 1 > /proc/sys/net/ipv4/ip_forward

O de forma definitiva para que no nos importe si el equipo se reinicia, editamos el archivo /etc/sysctl.conf, buscamos la línea net.ipv4.ip_forward=1 y la descomentamos.

Ahora escribimos la instruccion de iptables que hace que nuestro router linux actue como dispositivo de NAT para nuestra red.


## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

iptables -t nat -A POSTROUTING -s 154.5.4.0/24 -o eth0 -j SNAT –to 192.168.1.1

la ip 192.168.1.1 esta asignada de manera fija y pertenece a mi interface de red eth0 (que uso para la wan). eth0 va conectada al modem de infinitum. Si esta IP la obtuviéramos de manera dinámica tendriamos que sustituir la instruccion por ésta otra:


iptables -t nat -A POSTROUTING -s 154.5.4.0/24 -o eth0 -j MASQUERADE

Redirigiendo todo hacia SQUID
Como squid.conf esta configurado de manera transparente redirigimos todo lo que provenga de nuestra LAN y quiera ir hacia el puerto 80, lo redirigimos al 3128 de nuestro proxy para que escuche las peticiones.


iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j DNAT –to 192.168.1.1:3128

y reforzamos con:


iptables -t nat -A PREROUTING -p tcp -s 0.0.0.0/0 –dport 80 -j REDIRECT –to 3128

Permitiendo el envío y recepción de mails a los clientes de outlook
Para hacer que los clientes de outlook envien y reciban mails a traves de SQUID hay que permitir el forward de datos de todo lo que provenga de nuestra LAN hacia la interface externa.

iptables –append FORWARD -s 154.5.4.0/24 –in-interface eth0 -j ACCEPT
iptables -A INPUT -s 154.5.4.0/24 -j ACCEPT

Como aqui en el trabajo tenemos una VPN con otro lugar mediante Fortinets se tuvo que añadir una ruta estática en mi router Linux para que todas las peticiones hacia la red del otro lugar, las encaminara por el fortinet.

# Añadimos una ruta estática para que todo lo que valla a la red de diamante pase por el fortinet

sudo route add -net 154.7.0.0 netmask 255.255.0.0 gw 154.5.4.101

y con esto terminamos el procedimiento de como implementar un servidor proxy en modo transparente con SQUID para Ubuntu Server.

En las computadoras cliente no tienes que configurar nada mas que poner como puerta de enlace la ip 154.5.4.100 que es la IP de nuestro Server Squid (que actúa como Router) y a probar, Suerte a Todos.

Ah otra cosa: si quieres que tu server squid figure tambien como server DNS, pues instalate BIND9 con sudo apt-get install bind9 y listo.

Comentarios

umm iptables –append FORWARD

Imagen de falcom

umm

iptables –append FORWARD -s 154.5.4.0/24 –in-interface eth0 -j ACCEPT
iptables -A INPUT -s 154.5.4.0/24 -j ACCEPT

[quote]Para hacer que los clientes de outlook envien y reciban mails a traves de SQUID hay que permitir el forward de datos de todo lo que provenga de nuestra LAN hacia la interface externa.[/quote]
esta configuracion me parece muy insegura, q tal si se te mete un virus en tus pc's windoze dentro tu lan, y empieza a enviar info/mails como loco hacie fuera....
te falta reforzar la seguridad, abrir unicamente los ptos de envio y recepcion! y para mas seguridad cambiarlos sobre todo el 25

buena observacion

Imagen de Astrosendero

Hola. gracias por comentar, de hecho tienes razòn tendrè que corregir la regla. En tu opiniòn ¿còmo quedaria la regla para permitir el envìo de correos?

Gerardo Jacinto Astudillo

Astrosendero

Imagen de deathUser

[quote=Astrosendero]Permitiendo el envío y recepción de mails a los clientes de outlook
Para hacer que los clientes de outlook envien y reciban mails a traves de SQUID hay que permitir el forward de datos de todo lo que provenga de nuestra LAN hacia la interface externa.[/quote]

Corrección...
SQUID es un proxy HTTP/HTTPS y FTP (algo limitado) de manera que nada tiene que ver con protocolos como SMTP/IMAP/POP3, etc ...

Lo que haces en tu configuración es un traducción de direcciones de red (NAT) y/o redirección (forwarding) de puertos usando iptables, así que como ves, SQUID no tienen nada que ver con esto, deberías corregir eso en tu POST, así como el título del mismo.

bye
;)

Gracias por tu comentario

Imagen de Astrosendero

Hola que tal, tu afirmación es correcta, lo que describo en las lineas es la configuraciòn que utilizè para que la red la gobernara el proxy squid, y como todos manejan clientes outlook, detallè el procedimiento para que èstos no tuvieran problemas a la hora de la recepcion y envìo de mails.

Gerardo Jacinto Astudillo

Astrosendero wrote: para que

Imagen de deathUser

[quote=Astrosendero]para que la red la gobernara el proxy squid[/quote]
solo digo que LA RED, NO LA GOBIERNA SQUID, de hecho, es el Kernel de LINUX, en concreto IPTABLES el que hace el redireccionamiento de los paquetes de acuerdo a las reglas aplicadas, mas el routing y demás funciones que las manejará el mismo Kernel, SQUID solo maneja los protocolos HTTP, HTTPS y FTP a lo sumo, y si es transparente, pues solo HTTP...

En el título "Configurando SQUID en modo transparente con soporte para outlook" se sugiere que es SQUID quien manejará las peticiones de los clientes outlook ya sean estas POP3 o IMAP o SMTP, lo cual es incorrecto, ya que SQUID no puede manejarlas.

A mi manera de ver, un título más adecuado al POST debería ser algo como:
"Configurando un firewall LINUX con SQUID en modo transparente y soporte para clientes outlook (POP3, IMAP, SMTP)"

Solo para no confundir a los lectores ...

bye
;)

Lo que decía es que el título

Imagen de deathUser

Lo que decía es que el título podía llegar a confundir al lector, creo que es más eficiente el poder identificar correctamente de que va el tema de una publicación por su título y no tener que leer más del 50% para darte cuenta de que no es lo que buscas :)

bye
;)

Correccion

Imagen de Astrosendero

Cuando mencioné que la red la gobierna squid, me refería a que squid GOBIERNA el acceso a contenidos de internet, ¿o nó mi estimado?

:)

Gerardo Jacinto Astudillo

Pues si, SQUID controla el

Imagen de deathUser

Pues si, SQUID controla el acceso al contenido WEB/HTTP el resto de contenido de Internet pasará a través del NAT, forwarding, masquerade, etc. creado por el Kernel de Linux (IPTABLES), incluyendo y no limitándose a protocolos como POP3, IMAP, SMTP, SNMP, HTTPS, P2P, VoIP, FTP, y un larguísimo etc ...

bye
;)

https no se bloquean

#!/bin/sh
#
# tomado de http://www.debuntu.org/iptables-how-to-share-your-internet-connection-p2

# Where to find iptables binary
IPT="/sbin/iptables"

# The network interface you will use
# WAN is the one connected to the internet
# LAN the one connected to your local network
WAN="eth0" #192.168.2.0 -> Speedy 1
LAN="eth1" #192.168.13.0 -> LAN
#WAN2="eth0" #192.168.0.0 -> Speedy 2

SQUIDIP="192.168.13.1"
SQUIDPORT="3128"

# First we need to clear up any existing firewall rules
# and chain which might have been created
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X

# Default policies: Drop any incoming packets
# accept the rest.
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT

# To be able to forward traffic from your LAN
# to the Internet, we need to tell the kernel
# to allow ip forwarding

# echo 1 > /proc/sys/net/ipv4/ip_forward

#ivancp mod
sysctl -w net.ipv4.ip_forward=1

# Masquerading will make machines from the LAN
# look like if they were the router
$IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE

#Redireccionamos solo el trafico de internet mediante Squid
$IPT -t nat -A PREROUTING -i $LAN -p tcp -m tcp --dport 80 -j DNAT --to-destination $SQUIDIP:$SQUIDPORT
$IPT -t nat -A PREROUTING -i $LAN -p tcp -m tcp --dport 80 -j REDIRECT --to-ports $SQUIDPORT

# If you want to allow traffic to specific port to be
# forwarded to a machine from your LAN
# here we forward traffic to an HTTP server to machine 192.168.2.254
#$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to 192.168.2.254:3128
#$IPT -A FORWARD -i $WAN -p tcp --dport 80 -m state --state NEW -j ACCEPT

# For a whole range of port, use:
#$IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 1200:1300 -j DNAT --to 192.168.0.2
#$IPT -A FORWARD -i $WAN -p tcp --dport 1200:1300 -m state --state NEW -j ACCEPT

# Do not allow new or invalid connections to reach your internal network
$IPT -A FORWARD -i $WAN -m state --state NEW,INVALID -j DROP

# Accept any connections from the local machine
$IPT -A INPUT -i lo -j ACCEPT
# plus from your local network
$IPT -A INPUT -i $LAN -j ACCEPT
$IPT -A INPUT -i $WAN -j ACCEPT

# Here we define a new chain which is going to handle
# packets we don't want to respond to
# limit the amount of logs to 10/min
$IPT -N Firewall
$IPT -A Firewall -m limit --limit 10/minute -j LOG --log-prefix "Firewall: "
$IPT -A Firewall -j DROP

# log those packets and inform the sender that the packet was rejected
$IPT -N Rejectwall
$IPT -A Rejectwall -m limit --limit 10/minute -j LOG --log-prefix "Rejectwall: "
$IPT -A Rejectwall -j REJECT

# use the following instead if you want to simulate that the host is not reachable
# for fun though
#$IPT -A Rejectwall -j REJECT --reject-with icmp-host-unreachable

# here we create a chain to deal with unlegitimate packets
# and limit the number of alerts to 10/min
# packets will be drop without informing the sender
$IPT -N Badflags
$IPT -A Badflags -m limit --limit 10/minute -j LOG --log-prefix "Badflags: "
$IPT -A Badflags -j DROP

# A list of well known combination of Bad TCP flags
# we redirect those to the Badflags chain
# which is going to handle them (log and drop)
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j Badflags
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j Badflags
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j Badflags

# Accept certain icmp message, drop the others
# and log them through the Firewall chain
# 0 => echo reply
$IPT -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# 3 => Destination Unreachable
$IPT -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# 11 => Time Exceeded
$IPT -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# 8 => Echo
# avoid ping flood
$IPT -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT
$IPT -A INPUT -p icmp -j Firewall

# Accept ssh connections from the Internet
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT

# Accept FTP connections from the Internet
$IPT -A INPUT -i $WAN -p tcp --dport 21 -j ACCEPT

# Accept HTTP connections from the Internet
$IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT

# or only accept from a certain ip
#$IPT -A INPUT -i $WAN -s 125.124.123.122 -p tcp --dport 22 -j ACCEPT

# Accept related and established connections
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Drop netbios from the outside, no log, just drop
$IPT -A INPUT -p udp --sport 137 --dport 137 -j DROP

# Finally, anything which was not allowed yet
# is going to go through our Rejectwall rule
$IPT -A INPUT -j Rejectwall

---
No puedo lograr bloquear webs en https: que debo agregar para que haga efecto los iptables

Páginas