Asesoria con Script IPTABLES + SQUID

Imagen de jdvd

Forums: 

Buen dia amigos.
Me llamo Jesus Moncada, soy analista de sistemas y redes. He estado trabajando en un servidor Firewall (con IpTables) en conjunto con Proxy (Squid), con S.O. Debian (todos con su ultima version estable para la fecha - Agosto 2007). Mi problema es el siguiente:

La politica por defecto del firewall es Drop. Utilizo Proxy transparente, redirecciono con iptables del Pto 80 al 3128. pero:
- No puedo navegar desde la LAN
- No puedo navegar desde el mismo server (pc local)
- Del resto los puertos que se permite andan bien (ftp, mail, isq, msn, otros...).

Se que parece un problema sencillo, de verdad le he dado la vuelta al script y no entiendo xq no me funciona. Ya abri los puerto con que redireccion las peticiones WWW (80) al Proxy (3128). Algo curioso, cuando comento la linea donde redirecciono el puerto 80, si navega normal en la LAN como si no trabajase con el proxy, pero el server sigue sin conectarse por el 80, no se si es el squid o iptables.
Hechenme una mano por favor, aqui les dejo el script para que me asesoren:


#!/bin/sh
#
# generated by /usr/local/sbin/quicktables-2.3 on 2007.08.29.46
# Le doy creditos al quictables por ayudarme a generar el script

### set a few variables ###
echo ""
echo " setting global variables"
echo ""
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
iptables="/sbin/iptables"

### adjust /proc ###
echo " applying general security settings to /proc filesystem"
echo ""
### Activo la opción de sync cookies. Con ello, nos protejemos ante el ataque DOS de bomba SYNC ###
if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then echo 1 > /proc/sys/net/ipv4/tcp_syncookies; fi
### Habilito la opción de verificación de dirección ###
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter; fi
### Activo la opción de FORWARDING. ###
if [ -e /proc/sys/net/ipv4/ip_forward ]; then echo 1 > /proc/sys/net/ipv4/ip_forward; fi
### Activo la opción de protección de mansajes ICMP, con ello evitamos ataques DOS de bomba ICMP ###
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
### IMPORTANTE: SÓLO PARA USUARIOS CON IP DINÁMICA. (La mayoría) ###
### Si ISP proporciona IP's dinámicas en la conexión SLIP, PPP, o DHCP ###
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
### DESHABILITO la aceptación de paquetes cuyas ruta haya sido prefijada en el origen (source routed packets). ###
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo "0" > $f done
### DESHABILITAO la aceptación de paquetes ICMP del tipo Redirect Acceptance ###
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo "0" > $f done
### DESHABILITO la posibilidad de enviar paquetes ICMP del tipo Redirect Acceptance.###
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do echo "0" > $f done
### DESHABILITO la posibilidad de enviar mensajes de redirección ###
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do echo "0" > $f done

### load some modules ###
if [ -e /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_nat_irc.o ]; then modprobe ip_nat_irc; fi
if [ -e /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_conntrack_irc.o ]; then modprobe ip_conntrack_irc; fi
if [ -e /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_conntrack_ftp.o ]; then modprobe ip_conntrack_ftp; fi
if [ -e /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_nat_ftp.o ]; then modprobe ip_nat_ftp; fi

### flush any existing chains and set default policies ###
$iptables -F INPUT
$iptables -F OUTPUT
$iptables -P INPUT DROP
$iptables -P OUTPUT ACCEPT

### setup nat ###
echo " applying nat rules"
echo ""
$iptables -F FORWARD
$iptables -F -t nat
$iptables -P FORWARD DROP
$iptables -A FORWARD -i eth2 -j ACCEPT
$iptables -A INPUT -i eth2 -j ACCEPT
$iptables -A OUTPUT -o eth2 -j ACCEPT
$iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -t nat -A POSTROUTING -s 192.168.249.0/24 -o eth0 -j MASQUERADE

### allow all packets on the loopback interface ###
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A OUTPUT -o lo -j ACCEPT

### allow established and related packets back in ###
$iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

### blocking reserved private networks incoming from the internet ###
echo " applying incoming internet blocking of reserved private networks"
echo ""
$iptables -I INPUT -i eth0 -s 10.0.0.0/8 -j DROP
$iptables -I INPUT -i eth0 -s 172.16.0.0/12 -j DROP
$iptables -I INPUT -i eth0 -s 192.168.0.0/16 -j DROP
$iptables -I INPUT -i eth0 -s 127.0.0.0/8 -j DROP
$iptables -I FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
$iptables -I FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
$iptables -I FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
$iptables -I FORWARD -i eth0 -s 127.0.0.0/8 -j DROP

### outbound blocks and exceptions ###
echo " applying outbound blocks and exceptions"
echo ""
$iptables -I INPUT -i eth2 -p tcp --dport 3128 -j ACEPT
#$iptables -I OUTPUT -p tcp --dport 3128 -j ACEPT
$iptables -I FORWARD -i eth2 -p tcp --dport 1214 -j DROP
$iptables -I OUTPUT -p tcp --dport 1214 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 1214 -j DROP
$iptables -I OUTPUT -p udp --dport 1214 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 6346 -j DROP
$iptables -I OUTPUT -p tcp --dport 6346 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 6346 -j DROP
$iptables -I OUTPUT -p udp --dport 6346 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 6347 -j DROP
$iptables -I OUTPUT -p tcp --dport 6347 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 6347 -j DROP
$iptables -I OUTPUT -p udp --dport 6347 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1222 -j DROP
$iptables -I OUTPUT -p tcp --dport 1222 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 1222 -j DROP
$iptables -I OUTPUT -p udp --dport 1222 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1225 -j DROP
$iptables -I OUTPUT -p tcp --dport 1225 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1234 -j DROP
$iptables -I OUTPUT -p tcp --dport 1234 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1243 -j DROP
$iptables -I OUTPUT -p tcp --dport 1243 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1245 -j DROP
$iptables -I OUTPUT -p tcp --dport 1245 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1255 -j DROP
$iptables -I OUTPUT -p tcp --dport 1255 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 1256 -j DROP
$iptables -I OUTPUT -p tcp --dport 1256 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 4662 -j DROP
$iptables -I OUTPUT -p tcp --dport 4662 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 2710 -j DROP
$iptables -I OUTPUT -p tcp --dport 2710 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 2710 -j DROP
$iptables -I OUTPUT -p udp --dport 2710 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 6881:6999 -j DROP
$iptables -I OUTPUT -p tcp --dport 6881:6999 -j DROP
$iptables -I FORWARD -i eth2 -p udp --dport 6881:6999 -j DROP
$iptables -I OUTPUT -p udp --dport 6881:6999 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 6969 -j DROP
$iptables -I OUTPUT -p tcp --dport 6969 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 7000 -j DROP
$iptables -I OUTPUT -p tcp --dport 7000 -j DROP
$iptables -I FORWARD -i eth2 -p tcp --dport 2234 -j DROP
$iptables -I OUTPUT -p tcp --dport 2234 -j DROP

### icmp ###
echo " applying icmp rules"
echo ""
$iptables -A OUTPUT -p icmp -m state --state NEW -j ACCEPT
$iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -A INPUT -p icmp --icmp-type echo-request -i eth0 -j DROP

### apply icmp type match blocking ###
echo " applying icmp type match blocking"
echo ""
$iptables -I INPUT -p icmp --icmp-type redirect -j DROP
$iptables -I INPUT -p icmp --icmp-type router-advertisement -j DROP
$iptables -I INPUT -p icmp --icmp-type router-solicitation -j DROP
$iptables -I INPUT -p icmp --icmp-type address-mask-request -j DROP
$iptables -I INPUT -p icmp --icmp-type address-mask-reply -j DROP

### squid ###
echo " applying squid rules"
echo ""
$iptables -t nat -A PREROUTING -i eth2 -p tcp --dport 80 -j REDIRECT --to-port 3128

### logging ###
echo " applying logging rules"
echo ""
$iptables -A INPUT -i eth0 -p tcp -m limit --limit 1/s --dport 0:1024 -j LOG --log-prefix "tcp connection: "
$iptables -A INPUT -i eth0 -p udp -m limit --limit 1/s --dport 0:1024 -j LOG --log-prefix "udp connection: "

### drop all other packets ###
echo " applying default drop policies"
echo ""
$iptables -A INPUT -i eth0 -p tcp --dport 0:65535 -j DROP
$iptables -A INPUT -i eth0 -p udp --dport 0:65535 -j DROP

echo "### iptables is loaded ###"
echo ""

Cita: Segun mis

Imagen de Monkito

[quote]
Segun mis apreciaciones, el iptables no esta tomando las peticiones de los clientes (www o 80) para redireccionarla al puerto del proxy (3128), todo pasa directo al internet
[/quote]

Me parece que quien redirecciona los paquetes es el iptables, con la regla que tienes en tu firewall: "iptables -t nat -A PREROUTING -i eth2 -j REDIRECT --to-port 3128", y también los deja entrar con la línea que acepta las conexiones al 3128 en -A INPUT..

por otro lado revisando los manuales de linuxparatodos.net me parece que te faltan algunas opciones para proxy transparente...

counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Proxy transparente

Imagen de misho

Lee este sitio para el proxy trnasparente

http://www.tldp.org/HOWTO/TransparentProxy-6.html

Y agrega esto en la configuracion del squid, a mi me funciono muy bien tanto con iptables normal como con el shorewall, mi proxy da el servicio en el puerto 8080

Linea del shorewall /etc/shorewall/rules
REDIRECT loc 8080 tcp www - -

Lineas del squid

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

El amigo esta usando squid

Imagen de damage

El amigo esta usando squid 2.6, esas directivas de proxy transparente que ustedes proponen es para el squid 2.5, en el 2.6 solo se necesita poner "transparent" y nada mas.

http_port 3128 transparent

Si sigues con problemas, es muy seguro tu script de iptables tenga algo mal declarado (no creo que sea el squid), revisa con nmap o con netstat si esa tu PC ecuchando en el puerto del proxy.
Revisa que te sale con iptables -nL y con iptables -nL -t nat.
Debes depuara las cosas y comenzar con lo más sencillo y poco a poco ir probando, esa es una tarea que tu debes hacer, por eso te recomiendo que depures el script de iptables, has uno mas sencillo con lo basico y a manera que vayas probando le sigues declarando más lineas que consideres necesarias.

Saludos.

Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

Gracias por las respuesta

Imagen de jdvd

Ciertamente esos comando ya no funcionan en esta ultima versión de squid para ese TAG solo utilizo httpd_accel_no_pmtu_disc off, y por otro lado solo basta con poner http_port 3128 transparent y listo.

[quote]es muy seguro tu script de iptables tenga algo mal declarado (no creo que sea el squid), revisa con nmap o con netstat si esa tu PC ecuchando en el puerto del proxy.[/quote]
Si amigo, tanto el firewall como el pc que esta en la LAN estan trabajando bien por esos puertos, escuchan sin necesidad de gritar :) . En eso no hay problema. El problema reside en que tengo que configurar el explorardor web para que pueda salir por el 3128, si no sale directo por el 80, y es lo que no quiero. necesito que sea transparente para ahorrarme trabajo...

[quote]Revisa que te sale con iptables -nL y con iptables -nL -t nat.
Debes depuara las cosas y comenzar con lo más sencillo y poco a poco ir probando, esa es una tarea que tu debes hacer, por eso te recomiendo que depures el script de iptables, has uno mas sencillo con lo basico y a manera que vayas probando le sigues declarando más lineas que consideres necesarias.[/quote]
Ya esto lo hice varias veces hermano, comence desde el mas sencillo script con politica ACCEPT hasta llegar a este, depure y probe lineas por lineas, todo iba bien hasta que cambie de politica a DROP, ciertamente observe mas seguridad con esta politica porque hubieron cambios notables, a diferencia de este problema que es lo unico que me quejo :( ...

He estado investigando por la web, y e visto que muchos usuarios con el mismo problema, tal cual; Ya casi formo una coperativa para resolver este problema para la organizaciones de linux IPTABLES :D

A mi parecer señores, sacando mis conclusiones (talvez muy apresuradas), que esto ya es problema del diseño de IPTABLES o cuestiones de Compactibilidad con ciertos parametro que fueron modificados en estas versiones actuales (para ciertas condiciones como las mias claro, que por lo visto somos mayorias con el mismo problema porque puede que a otros si les funcione).
Haciendole seguimiento a esta situación, le voy a echar una vista a la site oficial de netfilter a ver si consigo hablar con el mismisimo Rusty Russell ;) jeje haber que encuentro. Luegos les comento si tengo otras soluciones.

De igual forma gracias por la ayuda amigos son muy amables. No cierren el tema continuemos la discusion con relacion a esto. ;)
Aun seguire esperando sus comentarios :D Gracias...

Si el proxy funciona

Imagen de Monkito

Si el proxy funciona cofigurando en el navegador, y el firewall está bien... sólo quiere decir que posiblemente tus clientes no tengan como puerta de enlace el proxy, si les has hecho modificaciones a los scripts que posteastes sería bueno que nos muestres denuevo el código para siguir analizando...

counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Si funciona y a la perfeccion

Imagen de jdvd

Todo esta bien, los PC´s en la LAN tiene su parametros bien establecidos, en eso no me cabe duda.
Ejemplo:

PC1 (en la LAN):
IP - 192.168.249.xx
MK - 255.255.255.0
PE - 192.168.249.1
DNS- 192.168.249.1

y en el Explorador Web coloco esto:

Proxy en la LAN:
IP - 192.168.249.1 | PUERTO: 3128

Y si funciona, lo cachea en el serve y todo. Los puertos se comunican, lo puedo ver desde IPTRAF. Pero (lo repito) esto lo quiero evitar, deseo que funcione transparente, sin tener que configurar en cada maquina.

Los script siguen iguales, no he hecho cambio alguno mientra investigo mas cosas. Cualquier modificacion se las hago saber compañeros.

Gracias por el comentario amigo, buen dia...

Si el proxy funciona, prueba

Imagen de Monkito

Si el proxy funciona, prueba poner un script sencillo como:


#!/bin/bash
#
# script de emergencia
#
# Variables
WAN=eth0
LAN=eth2
IPT=iptables

#flush de reglas
$IPT -t nat -F
$IPT -t nat -X
$IPT -t nat -Z
$IPT -t filter -F
$IPT -t filter -X
$IPT -t filter -Z
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -t mangle -Z

# Polóticas por defecto

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

# reglas para lo
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Enmascaramiento de red interna
$IPT -t nat -A POSTROUTING -s 0/0 -o $WAN -j MASQUERADE
# Redireccionamiento a proxy transparente
$ITP -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128

# Entrada al proxy
$IPT -A INPUT -p tcp --dport 3128 -j ACCEPT

# Activar de forward
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPT -t filter -A FORWARD -j ACCEPT

# fin de script

y cuando te funcione vas depurando lo que necesitas..
PD: modifica las variables según tus requerimientos...

counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Páginas