10.4.5.1. Proxies transparentes
Muchas organizaciones (incluyendo empresas, colegios y familias) usan los proxies para reforzar las políticas de uso de la red o para proporcionar seguridad y servicios de caché. Normalmente, un proxy Web o NAT no es transparente a la aplicación cliente: debe ser configurada para usar el proxy, manualmente. Por lo tanto, el usuario puede evadir el proxy cambiando simplemente la configuración.
Un proxy transparente combina un servidor proxy con un cortafuegos de manera que las conexiones son interceptadas y desviadas hacia el proxy sin necesidad de configuración en el cliente, y habitualmente sin que el propio usuario conozca de su existencia.
Además, suele ser frecuente en el proxy-caché la instalación de un servicio de control de acceso a la web y algún antivirus de red. El control de acceso a la web normalmente se implementa mediante algún tipo de software de filtrado por contenido (además de URL e IP, puede bloquear accesos a páginas web según el contenido de estás (palabras desagradables, obscenas o similares e incluso por imágenes -aunque esté último método suele dar peores resultados-). Un software libre muy utilizado para ello es Dansguardian y sus listas negras asociadas.
A continuación se muestra un ejemplo de script Linux para cortafuegos con reglas activadas para habilitar un proxy-transparente. Básicamente lo que hace es dirigir todas las petición a puertos destino 80 (web), 3128 (cliente despistado con configuración manual de proxy) y algunos otros puertos que nos interesen al puerto 8080 (dansguardian) donde tenemos el filtro de contenido.
#!/bin/sh
### BEGIN INIT INFO
# Provides: cortafuegos
# Required-Start: balanceo-de-carga
# Required-Stop:
# Should-Start:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Cortafuegos para IES Guadalpeña - Dpto. Informática
# Description: Cortafuegos contiene las reglas de iptables que se aplicarán
# después de la configuración del soporte de red o networking
# y del balanceo de carga (si está habilitado).
# Proporciona redirección de puertos en el canal PREROUTING
# para dar soporte a un proxy transparente.
### END INIT INFO
# Variables generales
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=cortafuegos
PIDFILE=/var/run/$NAME.pid
# Variables de red
IF_ADSL1="p1p1" # Interface conectada a ADSL1
IF_ADSL2="p4p1" # Interface conectada a ADSL2
IF_LOCAL="p2p1" # Interface conectada a la LAN
IP_ADSL1="192.168.1.2" # IP de la IF_ADSL1
IP_ADSL2="192.168.2.2" # IP de la IF_ADLS2
IP_LOCAL="10.0.0.1" # IP de la IF_LOCAL, Gateway Local
NET_ADSL1="192.168.1.0/24" # Red para IF_ADSL1
NET_ADSL2="192.168.2.0/24" # Red para IF_ADLS2
NET_LOCAL="10.0.0.0/8" # Red para IF_LOCAL
GW_ADSL1="192.168.1.1" # Gateway para ADSL1
GW_ADSL2="192.168.2.1" # Gateway para ADSL2
###### START
do_start () {
# Reglas de iptables
echo "Limpiando Reglas Anteriores..."
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t mangle -F
# Ahora hago el NAT
echo "Activando NAT ..."
echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s ${NET_LOCAL} -o ${IF_ADSL1} -j MASQUERADE
# iptables -t nat -A POSTROUTING -s ${NET_LOCAL} -o ${IF_ADSL2} -j MASQUERADE
iptables -t nat -A POSTROUTING -o ${IF_ADSL1} -j SNAT --to-source ${IP_ADSL1}
iptables -t nat -A POSTROUTING -o ${IF_ADSL2} -j SNAT --to-source ${IP_ADSL2}
# Redirecciono al Proxy
echo "Creando reglas para proxy transparente..."
iptables -t nat -A PREROUTING -i ${IF_LOCAL} -p tcp --dport http -j DNAT --to ${IP_LOCAL}":8080"
iptables -t nat -A PREROUTING -i ${IF_LOCAL} -p tcp --dport 81 -j DNAT --to ${IP_LOCAL}":8080"
iptables -t nat -A PREROUTING -i ${IF_LOCAL} -p tcp --dport 8080:8099 -j DNAT --to ${IP_LOCAL}":8080"
iptables -t nat -A PREROUTING -i ${IF_LOCAL} -p tcp --dport 3128:3130 -j DNAT --to ${IP_LOCAL}":8080"
#echo "Reglas Aplicadas"
}
###### STATUS
do_status () {
echo "Listado de Reglas activas"
iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v
}
###### STOP
do_stop () {
echo "Limpiando Reglas anteriores..."
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t mangle -F
}
case "$1" in
start|"")
do_start
;;
restart)
do_stop
do_start
;;
reload|force-reload)
echo "Error: el argumento '$1' no está soportado" >&2
exit 3
;;
stop)
do_stop
;;
status)
do_status
;;
*)
echo "Uso: cortafuegos [start|stop|restart|status]" >&2
exit 3
;;
esac
: