24 de Diciembre, 2004

Filtrando por dirección MAC en OpenBSD

Por lo que he estado investigando, para filtrar por dirección MAC en OpenBSD tendremos que emplear un bridge (aunque sea con una sola interfaz).

Hay dos formas de hacerlo, o filtrando por MAC directamente y a saco, o marcando el tráfico desde o hacia una MAC concreta para luego hacer cosas más creativas desde Packet Filter empleando esa marca.

Voy a hacer algunas pruebas empleando la red inalámbrica, que casualmente puede resultar muy útil poder trastear a nivel de dirección MAC y no solo de dirección IP.

En primer lugar voy a jugar contra scuba (elxwifi) para que veamos que está ahí:

# ping -c 1 scuba.elxwifi
PING scuba.elxwifi (10.1.2.1): 56 data bytes
64 bytes from 10.1.2.1: icmp_seq=0 ttl=64 time=2.222 ms
--- scuba.elxwifi ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 2.222/2.222/2.222/0.000 ms
# arp scuba.elxwifi
ns1.nodo4.elxwifi (10.1.2.1) at 00:90:4b:23:8b:13 on wi0

Todo correcto. Ahora vamos a filtrar TODO el tráfico que venga de scuba (o de una máquina con su dirección MAC, que ya sabemos que esto de la MAC no es infalible :P). Para ello creamos un bridge con solo la tarjeta wireless y añadimos la regla de filtrado que necesitamos:

# ifconfig bridge0 create
# brconfig bridge0 add wi0 up
# brconfig bridge0 rule block in on wi0 src 00:90:4b:23:8b:13

Hemos creado un bridge (bridge0), añadimos nuestra tarjeta wireless y metemos una regla que bloquee la entrada desde la MAC de scuba.

Las reglas de filtrado son similares a las que empleamos en PF (hay ejemplos la página del manual de brconfig).

A ver si esto ha funcionado:

# ping -c 1 scuba.elxwifi
PING scuba.elxwifi (10.1.2.1): 56 data bytes
--- scuba.elxwifi ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss

El paquete sale sin problemas, pero la respuesta nunca llega debido a que viene de una MAC bloqueada. Vamos a quitar las reglas y a repetir la prueba:

# brconfig bridge0 flushrule wi0
# ping -c 1 scuba.elxwifi
PING scuba.elxwifi (10.1.2.1): 56 data bytes
64 bytes from 10.1.2.1: icmp_seq=0 ttl=64 time=2.362 ms
--- scuba.elxwifi ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 2.362/2.362/2.362/0.000 ms

Indicamos que queremos eliminar las reglas de filtrado asociadas a la tarjeta wireless (wi0) y el tráfico vuelve a funcionar sin problemas.

Filtrando a este nivel tenemos un esquema de todo/nada. Si marcamos el tráfico, podemos usar la marca desde PF a placer (por ejemplo, para permitir/bloquear acceso a SSH desde solo una determinada MAC; es una idea). Las marcas se ponen con:

# brconfig bridge0 rule pass in on wi0 src 00:90:4b:23:8b:13\
 tag scuba_mac

Ahora en /etc/pf.conf podremos referirnos a esa marca (scuba_mac):

block return in on wi0 inet proto tcp from any to wi0 port 22\
 tagged scuba_mac

Con lo que se bloquearían las peticiones SSH desde una tarjeta con la dirección MAC de scuba. Interesante, ¿no?

Si queremos que nuesto bridge se cree y configure en cada arranque, recomiendo leer la página del manual de bridgename.if, que está muy bien.

La verdad es que no conocía estas posibilidades. Como sabía que PF no podía filtrar por MAC (Packet Filter, paquetes... era una deducción algo lógica :D), tenía este tema algo en el aire. He tardado unos diez minutos en dar con la pista ojeando la guía de PF, y la clave han sido las marcas :P.

Anotación por Juan J. Martínez.

Hay 2 comentarios

Gravatar

¡Todo esto con una OpenBSD recien instalada y sin software adicional!. Los límites están en la imaginación de cada uno :D. La verdad, lo único que faltaría sería (aparte de este filtrado por MAC) un módulo de autentificación de usuario tipo Radius y tendríamos un AP como los comerciales, con herramientas que vienen de serie en OpenBSD y muchísima más potencia y flexibilidad. Está claro que para ciertas tareas es el mejor Sistema Operativo (espero no pecar de fanatismo).

por r0sk, en 2004-12-24 08:21:51

Gravatar

Sí se soporta radius (man login_radius), pero no hay ningún servidor radius en la base, habría que tirar de ports.
Hombre, OpenBSD es una buena plataforma de desarrollo casi en general, aunque en ciertos aspectos las cosas están más preparadas.

por Juanjo, en 2004-12-24 10:43:04

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.