jueves, 12 de febrero de 2015

VLANs y DD-WRT II

Siguiendo el hilo del post anterior sobre wrt y retomando el asunto del modo promiscuo en las interfaces he conseguido un resultado mas que aceptable finalmente:


root@L1:~# ip link
1: lo: <LOOPBACK,MULTICAST,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: teql0: <NOARP> mtu 1500 qdisc noop
    link/void
3: eth0: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast
    link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast
    link/ether 68:7f:74:16:37:77 brd ff:ff:ff:ff:ff:ff
5: vlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop
    link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff
6: vlan1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
    link/ether 68:7f:74:16:37:76 brd ff:ff:ff:ff:ff:ff
7: vlan2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
    link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff
8: vlan4: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
    link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff
9: br0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
10: etherip0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop
    link/ether 6a:d0:e4:50:90:b3 brd ff:ff:ff:ff:ff:ff


El esquema fundamental para entender como trabaja el firmware es el siguiente:



Como se puede ver dispone de 3 interfaces, un puerto interno (5), un puerto WAN y 4 puertos LAN unidos que comparten bus.
Segun he podido leer y entender, "parece" ser una solución recurrente en los switches usar VLANs internamente y usar el mismo cable/bus para unir los puertos.

El resultado final ha sido en:

Vlan 1 -> WAN con none
Vlan 2 -> 1 2 3 asignados a NONE
Vlan 4 -> 4 a NONE
Wireless -> NONE

Setup-> Vlan: 

Igual que la versión anterior, con la excepción de que la VLAN2 no está en el bridge LAN (br0) sino en NONE.

Setup-> Networking:



Es decir todo vacio, menos br0 que si se elimina entonces la web deja de funcionar en este apartado debido a un fallo en js de su web.





Cada vlan2 unbridged y la WAN en la suya (lo único predeterminado).




VLAN4 la suya igualmente y para cada una el DHCP.

Destacar que no hace falta crear ninguna VLAN en eth1 pues al estar en una subred ya resuelve el "problema" del dominio de broadcast y si se quisiera/necesitado cualquier tipo de filtrado mayor se podría utilizar ebtables para dichos menesteres de la capa 2.

Por ultimo para hacerlo funcionar he necesitado las siguientes instrucciones via telnet:

#Crea las vlans 2 y 4
nvram set vlan2hwname=et0
nvram set vlan4hwname=et0

# Mirar esquema anterior porque se las trae la numeración (case label = frontal)
nvram set vlan2ports="3 2 1 5*"
nvram set vlan4ports="0 5"

#elimina vlan0 del puente
brctl delif br0 vlan0

# (no perduran al reinicio...)
#Borra la vlan0
nvram unset vlan0ports
nvram unset port0vlans
nvram unset vlan0hwname
nvram set lan_ifname="eth0"



Y por último para variar seguia sin funcionar (v24-SP2 13064), básicamente por 2 causas:

eth1 no coge la configuración de la web y aunque la fuerzes la pierde cada reinicio:

ifconfig eth1 192.168.3.1 netmask 255.255.255.0 

Y el wifi o bien se resistía a funcionar el enlace o bien fallaba el dhcp. 
Resultó ser un bug persistente debido al orden de arranque de los servicios (nas y despues dnsmasq) por lo que el primero tiene que ser arrancado despues del segundo, solución matarlo y volverlo a lanzar.

Añadir lo siguiente a Administration  -> Commands  y luego Save startup

sh -c 'ifconfig eth1 192.168.3.1 netmask 255.255.255.0; sleep 15;nas=$(ps w
 | grep "^ *$(pidof nas) " | sed "s/.*nas -P/nas -P/"); killall -9 nas; ${nas}'


Y funcionando.

La siguiente fase será la de iptables y la última y mas cuantiosa y larga con diferencia será en el lado del servidor, en el que posiblemente intervengan imnumerables tecnologias (selinux/grc/X,puppet/chef/vgrant/X, systemd, lxc/docker/X, libvirt(svirt), openswitch/X, iptables/ebtables/nfbtables?, netns, lvm/btrfs/X y un sinfin de servicios (dns,ntp,correo,web,git,backup,monitoring, ids, honeypot,db...) ).

Respecto a la configuración por defecto de wrt y del 99,9% de las configuraciones encontradas en internet, algunas de gente de redes mejor no comment, solo decir que salvo honrosas excepciones, vivimos tiempos dificiles sin lugar a dudas y los bridges("hubs") campan a sus anchas.


Útiles usados en el wrt:

killall {nas , dnsmasq}

dnsmasq -k -d --interface=eth1 --dhcp-range=192.168.3.2,192.168.3.10,12h --conf-file=/dev/null

nas -P /tmp/nas.wl0lan.pid -H 34954 -i eth1 ....

dnsmasq.conf básico: (antes de limpiarlo, recortar las redes y los lease time entre otras cuestiones)

interface=br0,vlan2,vlan4,eth1
resolv-file=/tmp/resolv.dnsmasq
dhcp-leasefile=/tmp/dnsmasq.leases
dhcp-lease-max=125
dhcp-option=lan,3,192.168.2.1
dhcp-option=vlan2,3,192.168.2.1
dhcp-option=vlan4,3,192.168.4.1
dhcp-option=eth1,3,192.168.3.1
dhcp-authoritative
dhcp-range=lan,192.168.2.100,192.168.2.149,255.255.255.0,1440m
dhcp-range=vlan2,192.168.2.10,192.168.2.60,255.255.255.0,3600m
dhcp-range=vlan4,192.168.4.10,192.168.4.20,255.255.255.0,3600m
dhcp-range=eth1,192.168.3.2,192.168.3.17,255.255.255.0,3600m


lunes, 9 de febrero de 2015

VLANs y DD-WRT I

Despues de 40 tutoriales que he pensado que deberia de hacer (hacking del de verdad (asm,gdb, calculo hexadecimal y c a raudales) ,lua,virtualizacion,selinux...), me animo y hago este de seguido que para eso lo acabo de terminar que sino despues estoy en otras batallas y como que no... :)


En este caso se trata de implementar sobre la red interna VLANs, básicamente por seguridad, puesto que va a estar funcionando varios "servidores" internos y mas vale que si ocurre algun problema la red interna ni se entere, también por el tema del internet de las cosas y en los proximos dias seguramente extender las VLANs con trunking al WDS por temas parecidos.

Introducción
----------------

Para el que no sepa para lo que sirve una VLAN, breve explicación de andar por casa: "Una vlan crea distintos dominios de broadcast (Layer 2!!!) sobre una o más redes físicas"

Es decir, trabaja únicamente a nivel de capa 2, por lo que si quieres aislarlas a nivel de capa 3 necesitas o bien un switch que lo permita o bien un router. Muy importante esta diferencía básica, porque yo estaba "aconstumbrado" a los switches cisco de nivel 3 y no me terminaba de encajar el tema del aislamiento en este caso...

Por último aclarar someramente igualmente, que "las vlan" pueden ser tagged o untagged (así muy de andar por casa), básicamente para conectar dispositivos vlan aware necesitas usar tagged (normalmente para los trunks únicamente salvo excepciones) y usar untagged cuando los puertos del dispositivo estan conectados a dispositivos finales y no vlan aware (un pc con configuración estandar).

Objetivo
-----------------

Configurar en el router principal, un wrt54gl 1.1 chip broadcom, necesita las siguientes VLAN:

VLAN 0 -> Eliminar (viene por defecto), puesto que da problemas
VLAN 1 -> Para el puerto WAN
VLAN 2 -> Los dispositivos del dia a dia
VLAN 3 -> Wifi (moviles, visitas, tvs...)
VLAN 4 -> Servidores

Pasos 
-----------------

Ir a Setup-> VLANs:

Entrar en el router y dejarlo así:







Explicación (los numeros corresponden con la parte trasera):

Vlan 1 -> WAN con none
Vlan 2 -> 1 2 3 asignados a la LAN
Vlan 4 -> 4 con none 

Wireless -> NONE


Ir a Setup-> Networking:




Explicación:

Crear un bridge llamado br1 (si escoges por ejemplo wifi no aparece en la web... :S), con el STP desactivado y asignarle una ip.
Asignar al bridge la interfaz del wifi (eth1 en mi caso) y a su vez la vlan3 (mas adelante explicaré como crearla).

Finalmente se puede observar que existen 2 bridges (br0 -> vlan2 (recuerdas el LAN de la pagina anterior??) y el que acabamos de crear y establecer.

Con esto los clientes del wifi pertenecerán a la vlan3 automáticamente y estarán dentro de una 192.168.3.0/24 (siguiente imagen dhcp).






Explicación:

Vlan 1 -> WAN (mismo que pagina anterior)

Todas unbridged menos vlan4, debido a que:
eth0 por definición es, eth1 también y vlan2 y 3 no "corresponde" por lo menos a mi juicio.
En este caso por lo tanto únicamente a vlan4 se le asigna su rango.

Por ultimo dhcp para:
vlan 4 -> (temporalmente/pruebas ...)
vlan 3 -> br1 -> eth1 -> wifi  ->  su rango. 
vlan  2 -> Se establece desde Setup->Basic setup 


Comandos telnet

Por último una vez establecido esto, casi nada funcionará :D , debido a que realmente la interfaz web funciona a medias en TODAS las versiones DD-WRT.

Es decir, que hace el trabajo a medias, establece las variables portXvlan correctamente pero ni establece las vlans ni vlanXports.

telnet 192.168.2.1
...

#Crea las vlans 2 y 4
nvram set vlan2hwname=et0
nvram set vlan4hwname=et0

#Borra la vlan0 (no la queremos para nada ya)
nvram unset vlan0ports
nvram unset port0vlans
nvram unset vlan0hwname

#portXvlan y vlan1port (WAN) si los crea via WEB
#Hay que añadir en todos el 5. Van al reves de portXvlan en el gl 1.1. :D
nvram set vlan2ports="3 2 1 5*"
nvram set vlan4ports="0 5"

#El wifi...
nvram set vlan3hwname=et0
nvram set vlan3ports="5"
nvram set port5vlans="1 2 3 4 16"  # Ponemos correctamente port5vlans

------

La explicación de esto es algo mas larga, pero básicamente crea las demas vlans, borra las antiguas y establece los puertos de las vlans con vlan2ports (la numeración es al reves y comenzando desde el 0 para el gl 1.1 ... O_o) y por último como quisquillosos establecemos correctametne port5vlans (las vlans de la CPU).

Resultado

Recalcar que no hacen falta configurar nada en los clientes de vlan puesto que al ser untagged (van sin la t los vlanXports) se le incluye esta etiqueta al frame cuando atraviesa el puerto/interfaz y que incluso si lo llevara lo descartaría para poner el suyo propio o directamente eliminaría la trama. 

Con esto, se tendrian las subredes diferenciadas a nivel 2, luego habría que mediante el iptables (nivel 3) bloquear el tráfico segun nos interese con iptables (pendiente).

No he testeado la red en gran medida por lo que es posible que exista algun error, lo que si he podido notar es que hay "demasiadas" interfaces en modo promiscuo, cosa que no me agrada en un principio (habría que ver la implementación).

Quizas tenga que refinar el tema del unbridge,  porque a los ojos de un sysadmin parece una aberración, pero lo mismo es una solución estandar en dispositivos de red.


 root@DD-WRT:~# ip link  
 1: lo: <LOOPBACK,MULTICAST,UP> mtu 16436 qdisc noqueue   
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
 2: teql0: <NOARP> mtu 1500 qdisc noop   
   link/void   
 3: eth0: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  
 4: eth1: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast   
   link/ether 68:7f:74:16:37:77 brd ff:ff:ff:ff:ff:ff  
 6: vlan1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:76 brd ff:ff:ff:ff:ff:ff  
 7: vlan2: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  
 8: vlan3: <BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  
 9: vlan4: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  
 10: br0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  
 11: etherip0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop   
   link/ether 8a:82:d5:63:63:73 brd ff:ff:ff:ff:ff:ff  
 19: br1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue   
   link/ether 68:7f:74:16:37:75 brd ff:ff:ff:ff:ff:ff  


Y bueno he querido recalcar las cosas que muy dificilmente o directamente no se encuentran en internet respecto a este caso concreto, lo restante puede constar menos o mas pero yo creo que se encuentran "sin problemas" en cualquier tutorial (todo el mundo explica/hace lo mismo).

Por ultimo hacer notar que en vlan2ports="3 2 1 5*", se establece esta vlan (la LAN) como "nativa",  si la "CPU interna de eth0" recibe una trama sin etiqueta la etiquetará como vlan2. En muchisimos tutoriales establecen varias VLANs como "nativas", no he comprobado este asunto pero habría que ver realmente como maneja el asterisco este firmware (lo dejo pendiente igualmente de verificar). En la documentación se especifica que debería de colocarse únicamente en una vlan y que esta sea la de la LAN.