[CentOS-es] iptables + squid proxy transparente

Mario Villela Larraza mario.villelalarraza en gmail.com
Lun Abr 4 21:06:57 EDT 2011


mmmm supongo que si ha de ser una restricción, pero bueno lo pego aquí para
mas rápido jejeje


#!/bin/bash
#
#
# Para guardar las reglas
#+ iptables-save > reglas
#+ iptables-restore < reglas
#

# Miramos si tenemos un parametro en linea de comando
if [ -n "$1" ] && [ "$1" = "q" ]
then
  QUIET="1"
else
  QUIET="0"
fi

# Registramos el inicio del firewall
#FECHA=$(date +"%C%y-%m-%d %H:%M")
#echo $FECHA
#/usr/bin/logger -p kern.notice  -t NETFILTER  \
#             "====== Iniciado Cortafuegos: $FECHA ========="

# PARAMETRIZACION DEL SCRIPT
##########################################
### Definimos constantes para usar en el
###+ script
if [ $QUIET = "0" ]; then
  echo "    Cargando parametros..."
fi

# Binario de iptables
IPTABLES=/sbin/iptables

# INTERFACES
# eth1 - conectado a internet con IP FIJA
EXT_IF=eth1
EXT_IP=192.168.2.10
# eth2 - conectado a LAN
LAN_IF=eth2
LAN_IP=10.0.0.1
LAN_RED=10.0.0.0/24
# lo - interfaz de loopback
LOO_RED=127.0.0.0/8
# cualquier red
ANY_RED=0.0.0.0/0

# MAQUINAS INTERNAS
IP_SERVIDOR_FTP=10.0.0.12
IP_SERVIDOR_WEB=10.0.0.13


if [ $QUIET = "0" ]; then
  echo "    Cargando modulos..."
fi
##########################################
### Nos aseguramos que tenemos cargados
###+ los modulos necesarios
modprobe ip_conntrack_irc
modprobe ip_conntrack_ftp
modprobe ip_nat_irc
modprobe ip_nat_ftp


if [ $QUIET = "0" ]; then
  echo "    Limpiando FW..."
fi
##########################################
### Limpiamos la configuracion existente

# Limpiamos (flush) las reglas
$IPTABLES -F
# Borramos 'cadenas' de usuario
$IPTABLES -X
# Ponemos a cero paquetes y contadores
$IPTABLES -Z
# Limpiamos las reglas de NAT
$IPTABLES -t nat -F
# Borramos 'cadenas' de usuario de NAT
$IPTABLES -t nat -X


if [ $QUIET = "0" ]; then
  echo "    Estableciendo politicas..."
fi
##########################################
### Establecemos las politicas por omision
###+ de las 'cadenas'

# Por omision descartamos los paquetes
$IPTABLES -P INPUT   ACCEPT
$IPTABLES -P OUTPUT  ACCEPT
$IPTABLES -P FORWARD ACCEPT
# PREROUTING - NAT sobre la IP destino: normalmente desde inet hacia LAN
# POSTROUTING - NAT sobre la IP origen: normalmente desde LAN hacia inet
$IPTABLES -t nat -P PREROUTING   ACCEPT
$IPTABLES -t nat -P POSTROUTING  ACCEPT

# Relajamos la politica de salida
#+ Dejamos salir paquetes de LAN_IP por LAN_IF
$IPTABLES -A OUTPUT -o $LAN_IF -s $LAN_IP -j ACCEPT
#+ Dejamos salir paquetes de EXT_IP por EXT_IF
$IPTABLES -A OUTPUT -o $EXT_IF -s $EXT_IP -j ACCEPT



if [ $QUIET = "0" ]; then
  echo "    -> Denegacion de redes invalidas..."
fi
##########################################
# No admitimos desde el exterior redes locales (RFC 1918)
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 192.168.0.0/16  -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 10.0.0.0/8      -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 172.16.0.0/12   -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 224.0.0.0/4     -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 240.0.0.0/5     -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $LOO_RED        -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 0.0.0.0/8       -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 169.254.0.0/16  -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 255.255.255.255 -j DROP
#$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $EXT_IP         -j DROP
# Desde el interior solo admitimos nuestra red LAN
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s ! $LAN_RED      -j ACCEPT


if [ $QUIET = "0" ]; then
  echo "    -> Denegacion de broadcast de NetBIOS..."
fi
##########################################
# Bloquear paquetes broadcast de NetBios salientes
iptables -A FORWARD -p tcp --sport 137:139 -o $EXT_IF -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT  -p tcp --sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT  -p udp --sport 137:139 -o $EXT_IF -j DROP


if [ $QUIET = "0" ]; then
  echo "    Activando NAT..."
fi
##########################################
# Activamos el bit de forward
echo 1 > /proc/sys/net/ipv4/ip_forward
# Enmascaramos la salida de la LAN
$IPTABLES -t nat -A POSTROUTING -s $LAN_RED -o $EXT_IF -j MASQUERADE



if [ $QUIET = "0" ]; then
  echo "    Accesos a la maquina local permitidos..."
fi
##########################################
### Permitimos ciertos accesos a la maquina

if [ $QUIET = "0" ]; then
  echo "    -> loopback..."
fi
# Permitimos todas las conexiones del interfaz loopback
$IPTABLES -A INPUT  -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT  -i lo -s $LOO_RED -d $LOO_RED -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s $LOO_RED -d $LOO_RED -j ACCEPT
# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o lo -s $LOO_RED -j ACCEPT


if [ $QUIET = "0" ]; then
  echo "    -> LAN..."
fi
# Damos acceso desde la red local
$IPTABLES -A INPUT  -s $LAN_RED -i $LAN_IF -j ACCEPT
$IPTABLES -A OUTPUT -d $LAN_RED -o $LAN_IF -j ACCEPT

if [ $QUIET = "0" ]; then
  echo "    -> DNS..."
fi
# Aceptamos conexiones DNS
$IPTABLES -A INPUT  -s $ANY_RED -i $EXT_IF -p udp -m udp --sport 53 --dport
1024:65535 -j ACCEPT
$IPTABLES -A OUTPUT -d $ANY_RED -o $EXT_IF -p udp -m udp --dport 53 --sport
1024:65535 -j ACCEPT

if [ $QUIET = "0" ]; then
  echo "    -> ntpd..."
fi
# Aceptamos conexiones ntpd
$IPTABLES -A INPUT  -p udp -m udp --dport 123 -i $EXT_IF -s $ANY_RED -j
ACCEPT
$IPTABLES -A OUTPUT -p udp -m udp --sport 123                        -j
ACCEPT

if [ $QUIET = "0" ]; then
  echo "    -> icmp..."
fi
# Permitimos paquetes ICMP (ping, traceroute...)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A INPUT   -p icmp --icmp-type echo-request  -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A OUTPUT  -p icmp --icmp-type echo-request  -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A INPUT   -p icmp --icmp-type echo-reply    -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A OUTPUT  -p icmp --icmp-type echo-reply    -m limit --limit 2/s
-j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A INPUT   -p icmp --icmp-type redirect      -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A OUTPUT  -p icmp --icmp-type redirect      -m limit --limit 2/s
-j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A INPUT   -p icmp --icmp-type time-exceeded -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A OUTPUT  -p icmp --icmp-type time-exceeded -m limit --limit 2/s
-j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A INPUT   -p icmp --icmp-type destination-unreachable -m limit
--limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp --icmp-type destination-unreachable -m limit
--limit 2/s -j ACCEPT

if [ $QUIET = "0" ]; then
  echo "    -> ssh..."
fi

# Abrimos el puerto xxxx para ssh
#$IPTABLES -A INPUT  -p tcp -i $EXT_IF -s $ANY_RED -m tcp --dport 22 --sport
1024:65535 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -s $ANY_RED -m tcp --dport 22 --sport 1024:65535
-m state --state NEW -j LOG --log-prefix "[FW -SSH] "
$IPTABLES -A INPUT  -p tcp -s $ANY_RED -m tcp --dport 22 --sport 1024:65535
-j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A OUTPUT -p tcp -m tcp --sport 22 -m state --state
RELATED,ESTABLISHED -j ACCEPT


if [ $QUIET = "0" ]; then
  echo "    Redirecciones..."
fi

##########################################
### Generamos redireccionamientos
###+ transparentes para el resto de maquinas

if [ $QUIET = "0" ]; then
  echo "    -> Proxy web transparente (Squid)..."
fi

#+ Con la redireccion activa (primera linea)
#+  no se llega a la segunda linea
#+ Para bloquear todo acceso a la web comentar
#+  solo la primera linea
#+ Para anular el proxy comentar las dos reglas
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp --dport 80 -j
REDIRECT --to-port 3128
$IPTABLES -A FORWARD -i $LAN_IF -p tcp --dport 80 -j DROP

#if [ $QUIET = "0" ]; then
#  echo "    -> Filtro de correo (P3Scan)..."
#fi
#+ Con la redireccion activa (primera linea)
#+  no se llega a la segunda linea
#+ Para bloquear todo acceso a POP comentar
#+  solo la primera linea
#+ Para anular el filtrado comentar las dos reglas
#$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp --dport 110 -j
REDIRECT --to-port 8110
#$IPTABLES -A FORWARD -i $LAN_IF -p tcp --dport 110 -j DROP
###$IPTABLES -t nat -A OUTPUT -p tcp --dport 110 -m owner --owner-id p3scan
-j ACCEPT
###$IPTABLES -t nat -A OUTPUT -p tcp --dport 110 -j REDIRECT --to-port 8110


if [ $QUIET = "0" ]; then
  echo "    -> DNAT (21 y 20)..."
fi
# Redirigimos "$EXT_IP":2220-1 a "$IP_SERVIDOR_FTP":20-1
###$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp --dport 21
-j LOG --log-prefix "[FW - FTP] "
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp --dport 20 -j
DNAT --to "$IP_SERVIDOR_FTP":20
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp --dport 21 -j
DNAT --to "$IP_SERVIDOR_FTP":21

# SERVIDOR WEB NACHO
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp --dport 80 -j
DNAT --to "$IP_SERVIDOR_WEB":80
#$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp --dport 80 -j
DNAT --to "$IP_SERVIDOR_WEB":80

# ...y conexiones salientes relacionadas (ftp pasivo)
$IPTABLES -t nat -A PREROUTING  -m state --state RELATED,ESTABLISHED -j
ACCEPT
# Permitimos postruteos a "$IP_SERVIDOR_FTP":20-1
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp
--dport 20 -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp
--dport 21 -j ACCEPT
# Permitimos reenvios desde el exterior a "$IP_SERVIDOR_FTP":20-1
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp --dport 20 -j
ACCEPT
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp --dport 21 -j
ACCEPT



if [ $QUIET = "0" ]; then
  echo "    Reenvios..."
fi
##########################################
### Aceptamos algunos reenvios

if [ $QUIET = "0" ]; then
  echo "    -> icmp..."
fi
# Permitimos paquetes ICMP (ping, traceroute...)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request  -m limit --limit 2/s
-j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type echo-reply    -m limit --limit 2/s
-j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A FORWARD -p icmp --icmp-type redirect      -m limit --limit 2/s
-j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A FORWARD -p icmp --icmp-type time-exceeded -m limit --limit 2/s
-j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A FORWARD -p icmp --icmp-type destination-unreachable -m limit
--limit 2/s -j ACCEPT
# Aceptamos todas en LAN_IF
$IPTABLES -t nat -A PREROUTING  -i $LAN_IF -p icmp --icmp-type any -m limit
--limit 2/s -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -p icmp --icmp-type any -m limit
--limit 2/s -j ACCEPT




if [ $QUIET = "0" ]; then
  echo "    Salida general..."
fi
##########################################
### Aceptamos conexiones salientes

# Permitimos cualquier salida tcp desde la propia maquina
$IPTABLES -A OUTPUT -o $EXT_IF -p tcp -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT
# ...y conexiones entrantes relacionadas
$IPTABLES -A INPUT  -i $EXT_IF -p tcp -m state --state
ESTABLISHED,RELATED     -j ACCEPT

# Permitimos el reenvio de paquetes enviados desde la LAN
$IPTABLES -A FORWARD -i $LAN_IF -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde la LAN
$IPTABLES -t nat -A PREROUTING  -i $LAN_IF -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING  -m state --state RELATED,ESTABLISHED -j
ACCEPT

# Permitimos el NAT de paquetes enviados desde inet hacia la IP publica
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING  -m state --state RELATED,ESTABLISHED -j
ACCEPT

# Permitimos el NAT de paquetes enviados desde la IP publica hacia inet
$IPTABLES -t nat -A POSTROUTING -o $EXT_IF -s $EXT_IP -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -t nat -A POSTROUTING -m state --state RELATED,ESTABLISHED -j
ACCEPT

# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -s $LAN_RED -j ACCEPT


if [ $QUIET = "0" ]; then
  echo "    Cerrando puertos restringidos..."
fi
##########################################
### Puertos restringidos (telnet, ftp, imap, pop3, etc.)
###+ Reiterativo: para pruebas
$IPTABLES -A INPUT -p tcp --dport 1:1024 -j DROP
$IPTABLES -A INPUT -p udp --dport 1:1024 -j DROP


###echo "    ACTIVADO DEBUG..."
##########################################
### Reglas utilizadas en debug para detectar
#+ paquetes no tratados todavia
#+ -j LOG --log-prefix "--PR> "
###$IPTABLES -t nat -A PREROUTING  -j LOG --log-prefix "[FW - PR] "
###$IPTABLES -t nat -A POSTROUTING -j LOG --log-prefix "[FW - PO] "
###$IPTABLES -A FORWARD -j LOG --log-prefix "[FW - FW] "
###$IPTABLES -A INPUT  -j LOG --log-prefix "[FW - IN] "
###$IPTABLES -A OUTPUT -j LOG --log-prefix "[FW - OU] "

if [ $QUIET = "0" ]; then
  echo "    Configuracion FW terminada."
  echo ""
  echo "    A continuacion podria desear:"
  echo "     - verificar reglas: iptables -nvL && iptables -nvL -t nat"
  echo "     - guardar reglas:   iptables-save > reglas"
  echo "     - restaurar reglas: iptables-restore < reglas"
fi
##########################################
exit 0

El 4 de abril de 2011 19:58, Ramón Macías Zamora <
ramon.macias en raykasolutions.com> escribió:

> No llega, supongo que una restricción de la lista.
>
> Podrías pegar el contenido
> --
>
>
>
> Ramón Macías Zamora
> Tecnología, Investigación y Desarrollo
> Guayaquil - Ecuador
> msn:    ramon_macias en hotmail.com
> skype:  ramon_macias
> UserLinux# 180926 (http://counter.li.org)
> Cel:    593-8-0192238
> Tel:    593 4 6044566
>
> <http://www.raykasolutions.com/>
>
>
> WEB SITES, HOSTINGS, DOMINIOS, MANTENIMIENTO DE EQUIPOS, REDES, SERVIDORES
> LINUX, SOPORTE.
>
>
>
> El 4 de abril de 2011 19:55, Mario Villela Larraza <
> mario.villelalarraza en gmail.com> escribió:
>
>> ahora si aquí esta el archivo adjunto perdón :s
>>
>> El 4 de abril de 2011 19:37, Ramón Macías Zamora <
>> ramon.macias en raykasolutions.com> escribió:
>>
>> > No llegó el adjunto :(
>> > --
>> >
>> >
>> >
>> > Ramón Macías Zamora
>> > Tecnología, Investigación y Desarrollo
>> > Guayaquil - Ecuador
>> > msn:    ramon_macias en hotmail.com
>> > skype:  ramon_macias
>> > UserLinux# 180926 (http://counter.li.org)
>> > Cel:    593-8-0192238
>> > Tel:    593 4 6044566
>> >
>> > <http://www.raykasolutions.com/>
>>
>> >
>> >
>> > WEB SITES, HOSTINGS, DOMINIOS, MANTENIMIENTO DE EQUIPOS, REDES,
>> SERVIDORES
>> > LINUX, SOPORTE.
>> >
>> >
>> >
>> > El 4 de abril de 2011 16:35, Mario Villela Larraza <
>> > mario.villelalarraza en gmail.com> escribió:
>> >
>> >> Hola amigos ya hace un muy buen rato que estoy batallando con un proxy
>> que
>> >> quiero levantar pero no encuentro cual es el problema tengo un servidor
>> >> con
>> >> la squid levantado y un script (que anexo en este correo) con un
>> servidor
>> >> de
>> >> DHCP pero no logro que las maquinas dentro de la red que pasarian por
>> el
>> >> proxy obtengan señal de internet ya revise y revise la configuracion de
>> mi
>> >> squid de echo ahorita no esta restringiendo nada, ya   tengo una lista
>> ACL
>> >> que apara todas mis direcciones del squid pero aun asi no obtengo
>> >> resultados
>> >> diferentes.
>> >>
>> >> Así que acudo a ustedes para que me ayuden con este pequeño proyecto
>> que
>> >> traigo en manos esperando que todos estén bien les mando un saludo y
>> >> agradesimentos de antemano.
>> >>
>> >> --
>> >> Mario Villela Larraza
>> >> mario.villelalarraza en gmail.com
>> >> Cel 0445512591926
>> >>
>> >> _______________________________________________
>> >> CentOS-es mailing list
>> >> CentOS-es en centos.org
>> >> http://lists.centos.org/mailman/listinfo/centos-es
>> >>
>> >>
>> >
>>
>>
>> --
>> Mario Villela Larraza
>> mario.villelalarraza en gmail.com
>> Cel 0445512591926
>>
>> _______________________________________________
>> CentOS-es mailing list
>> CentOS-es en centos.org
>> http://lists.centos.org/mailman/listinfo/centos-es
>>
>>
>


-- 
Mario Villela Larraza
mario.villelalarraza en gmail.com
Cel 0445512591926


Más información sobre la lista de distribución CentOS-es