Autor Tema: Análisis del cortafuegos por defecto en OpenWrt  (Leído 2021 veces)

0 Usuarios y 1 Visitante están viendo este tema.

hardwarer

  • Visitante
Análisis del cortafuegos por defecto en OpenWrt
« en: 17-12-2013, 18:56 (Martes) »
=================================================================
                                                   EN CONSTRUCCION=================================================================
Hola Buenas, me he estado volviendo loco unos meses estudiando el funcionamiento de netfilter, en linux en general y en los router con openwrt en particular, al principio me parecía una locura todas esas reglas anidadas y queria sacarle la lógica....y bueno luego no era para tanto, y por si le sirve a alguien he hecho unos esquemas en español sobre las reglas....Empezaré con Backfire y luego haré un análisis de Barrier Breaker que son las dos compilaciones que puedo probar en mi  ct5361 y ar5387un respectivamente.
Básicamente esto es un copy paste (maquetado para foros que es lo que mas tiempo me esta llevando) de mi blog que he iniciado hace poco, si a alguien le interesa que me pida la dire por mp para no hacer publi x si no esta permitido.

PARTE 1 - REGLAS DE ENTRADA OPENWRT BACKFIRE 10.03
Lo primero que nos encontramos al examinar a fondo  las reglas del cortafuegos son tropecientas cadenas anidadas y casi todas estan vacías...y te preguntas, ¿para qué es todo esto? Pues como veremos más adelante principalmente todas esas cadenas anidadas están vacias para que nosotros las llenemos con nuestras propias reglas.

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
    2      238 18810 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    3       13   884 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0          
    4        4   240 syn_flood  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02
    5        4   240 input_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
    6        4   240 input      all  --  *      *       0.0.0.0/0            0.0.0.0/0          

Las cadenas que vemos aquí arriba son por defecto, exceptuando que he cambiado el REJECT por DROP desde la interfaz Luci simplemente para liberar de trabajo y ancho de banda a la máquina:(prefiero el stealth del DROP que el REJECT)
Vamos a empezar el destripe por la cadena INPUT, o sea las reglas que rigen como debe comportarse el nucleo ante los paquetes que apuntan a los procesos de la propia máquina(el router en este caso).
INPUT

Chain INPUT (policy ACCEPT)
1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID

Descartar todos los paquetes inválidos, por ejemplo conexiones nuevas que no hayamos solicitado nosotros o paquetes que por cualquier razón no se pueden identificar como válidos.
2      238 18810 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

Aceptar todos los paquetes de conexiones nuevas siempre que esten relacionadas con una conexion creada por nosotros previamente o relacionadas con una conexión ya establecida por nosotros(FTP control-data).
3       13   884 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0          

Aceptar todo lo que provenga del bucle local.
4        4   240 syn_flood  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02


Chain syn_flood (1 references)    
1        4   240 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 limit: avg 25/sec burst 50
2        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0          

 Protección contra la inundación con paquetes con bandera SYN marcada y todas las demás desmarcadas(ataque de denegación de servicio). La regla permite (RETURN) 25 paquetes por segundo , con picos de 50 y los demás paquetes que excedan de esos máximos son descartados (DROP)
5        4   240 input_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain input_rule (1 references)
Destino a la cadena input_rule, vacía por defecto.
6        4   240 input      all  --  *      *       0.0.0.0/0            0.0.0.0/0        


Chain input (1 references)

   
1        1    60 zone_lan   all  --  br-lan *       0.0.0.0/0            0.0.0.0/0

Enviar a la subcadena zone_lan todo lo que provenga del interfaz br-lan(la interfaz local)
Chain zone_lan (1 references)

1        1    60 input_lan  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain input_lan (1 references)
Cadena input_lan vacía por defecto.
 
2        1    60 zone_lan_ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Enviar a la cadena zone_lan_accept todo.

Chain zone_lan_ACCEPT (2 references)

           
1        0     0 ACCEPT     all  --  *      br-lan  0.0.0.0/0            0.0.0.0/0      

Aceptar todos los paquetes que salgan por la interfaz br-lan.(que a su vez provengan de esa misma interfaz ya que esta cadena es una subcadena de zone_lan)

2        1    60 ACCEPT     all  --  br-lan *       0.0.0.0/0            0.0.0.0/0

Aceptar todos los paquetes que entren por la interfaz br-lan.(que a su vez provengan de esa misma interfaz ya que esta cadena es una subcadena de zone_lan)          

Lo anterior permite completa comunicación bidireccional de los procesos del router con cualquier equipo de la red local. Podríamos ir aprentando esto un poco más añadiendo reglas, eso ya con la paranoia de cada uno, pero con mucho cuidado porque tocar cualquier filtro que afecte a la interfaz br-lan(que es un puente de las interfaces wlan y eth0.0) puede dejarnos sin comunicación con el router quedando como única alternativa resetearlo o volver a flasear el firmware.

2        0     0 zone_wan   all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0

Enviar a la subcadena zone_wan todos los paquetes con origen la interfaz eth0.1

Chain zone_wan (1 references)

       1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:68
Aceptar todos los paquetes del protocolo UDP con puerto de destino 68.(para poder renovar la direccion ip por DHCP)

       2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8
Aceptar PING desde WAN.

       3        0     0 input_wan  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
Pasamos todo a la subcadena input_wan que por defecto está vacía.

       4        0     0 zone_wan_DROP  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
Y por último descartamos todos los paquetes restantes enviándolos a la subcadena zone_wan_DROP, por si habiamos dejado alguna puerta abierta:

       Chain zone_wan_DROP (2 references)        
1        0     0 DROP       all  --  *      eth0.1  0.0.0.0/0            0.0.0.0/0          
2        0     0 DROP       all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0          


Como hemos podido ver la entrada de paquetes desde internet destinados al propio router está bastante bien cerrada. Vamos a ver ahora como se comportan los filtros para las cadenas de salida y de reenvio.

PARTE 2 - REGLAS DE SALIDA OPENWRT BACKFIRE 10.03

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
2      165 15013 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       13   884 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0          
4       26  1768 output_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
5       26  1768 output     all  --  *      *       0.0.0.0/0            0.0.0.0/0          

1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
Descartar   todos los paquetes invalidos, por ejemplo conexiones nuevas que no hayamos solicitado nosotros o paquetes que por cualquier razón no se pueden identificar como válidos.

2      165 15013 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED Aceptar todos los paquetes de conexiones nuevas siempre que esten relacionadas con una conexion creada por nosotros previamente o relacionadas con una conexión ya establecida por nosotros(FTP control-data).
3       13   884 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0          
Aceptar todo lo que provenga del bucle local.

4       26  1768 output_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
Destino a la cadena output_rule, vacia por defecto.

5       26  1768 output     all  --  *      *       0.0.0.0/0            0.0.0.0/0  
Destino a la cadena output
Chain output (1 references)  
   
1       26  1768 zone_lan_ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0    

   Chain zone_lan_ACCEPT (2 references)    
1        0     0 ACCEPT     all  --  *      br-lan  0.0.0.0/0            0.0.0.0/0        
2        1    60 ACCEPT     all  --  br-lan *       0.0.0.0/0            0.0.0.0/0            

Estas dos reglas dan permiso de salida a todos los paquetes que hayan entrado por la interfaz br-lan o bien que salgan por esa interfaz.    

2       26  1768 zone_wan_ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0    

   Chain zone_wan_ACCEPT (2 references)
   
1       22  1496 ACCEPT     all  --  *      eth0.1  0.0.0.0/0            0.0.0.0/0          
2        0     0 ACCEPT     all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0          

Y por último también acepta la salida de todos los paquetes que salgan por la interfaz eth0.1 (el puerto asignado a WAN) o que hayan entrado por la misma.

Ahora ya solo nos queda analizar el comportamiento de las reglas de reenvio (FORWARD) que será en la próxima entrada.

PARTE 3 - REGLAS DE REENVIO OPENWRT BACKFIRE 10.03

Chain FORWARD (policy DROP 0 packets, 0 bytes)
1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
2        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3        0     0 forwarding_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
4        0     0 forward    all  --  *      *       0.0.0.0/0            0.0.0.0/0          

1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID

Descartar   todos los paquetes invalidos, por ejemplo conexiones nuevas que no hayamos solicitado nosotros o paquetes que por cualquier razón no se pueden identificar como válidos.

 2        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
Aceptar todos los paquetes de conexiones nuevas siempre que esten relacionadas con una conexion creada por nosotros previamente o relacionadas con una conexión ya establecida por nosotros(FTP control-data).

3        0     0 forwarding_rule  all  --  *      *       0.0.0.0/0            0.0.0.0/0            
Destino a la cadena forwarding_rule, vacia por defecto.

4        0     0 forward    all  --  *      *       0.0.0.0/0            0.0.0.0/0
Destino a la cadena Forward


1        0     0 zone_lan_forward  all  --  br-lan *       0.0.0.0/0            0.0.0.0/0

Destino de todos los paquetes que entren por la interfaz br-lan a la cadena zone_lan_forward

Chain zone_lan_forward (1 references)
1        0     0 zone_wan_ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0      


Chain zone_wan_ACCEPT (2 references)
1       22  1496 ACCEPT     all  --  *      eth0.1  0.0.0.0/0            0.0.0.0/0          

Acepta el reenvio todos los paquetes que salgan a WAN y que prevengan de LAN.
2        0     0 ACCEPT     all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0
Acepta el reenvio de los paquetes que hayan entrado por la interfaz WAN, pero como esta regla es dependiente de zone_lan forward pues nunca llegará ningún paquete con esa condicción.

2        0     0 forwarding_lan  all  --  *      *       0.0.0.0/0            0.0.0.0/0  
Chain forwarding_lan (1 references)
Regla vacía, probablemente para nuestras reglas personalizadas.

3        0     0 zone_lan_DROP  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
Chain zone_lan_DROP (1 references)
1        0     0 DROP       all  --  *      br-lan  0.0.0.0/0            0.0.0.0/0          
2        0     0 DROP       all  --  br-lan *       0.0.0.0/0            0.0.0.0/0        

Regla para descartar paquetes lan no deseados, bien de salida como de entrada "a" y "desde" br-lan
2        0     0 zone_wan_forward  all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0   
       

Chain zone_wan_forward (1 references)
1        0     0 forwarding_wan  all  --  *      *       0.0.0.0/0            0.0.0.0/0      
Subcadena vacia.

2        0     0 zone_wan_DROP  all  --  *      *       0.0.0.0/0            0.0.0.0/0  
Chain zone_wan_DROP (2 references)
1        0     0 DROP       all  --  *      eth0.1  0.0.0.0/0            0.0.0.0/0          
2        0     0 DROP       all  --  eth0.1 *       0.0.0.0/0            0.0.0.0/0          
Cadenas para descartar el resto de paquetes de reenvio.

Resumiendo vemos que las reglas por defecto de filtrado de openwrt consisten en reenviar sin concesiones todo lo que venga de las interfaces ethernet (br-lan) del router y descartar el reenvio de todos los paquetes que provengan de la interfaz eth0.1 (WAN)
Son bienvenidos los comentarios y correciones que harán falta muchas.


« Última modificación: 19-12-2013, 11:52 (Jueves) por hardwarer »