=================================================================
=================================================================
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 INVALIDDescartar 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,ESTABLISHEDAceptar 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/0Chain 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/0Enviar 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/0Chain 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/0Enviar 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/0Enviar 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,ESTABLISHEDAceptar 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/0Destino 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/0Acepta 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.