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.

![[xml]](/images/xml.gif)
