Marcar paquetes con iptables por dirección mac de destino

Marcar paquetes con iptables por dirección mac de destino

Necesito marcar los paquetes que van a una dirección mac específica.

Necesito esto para usarlo en Shaper con tc.

--mac-destinationno existe en iptables.

También intenté usar ebtables:

ebtables -t nat -A POSTROUTING -d 9c:4e:36:aa:bb:cc -j mark --set-mark 0x2003 --mark-target ACCEPT

pero no marca nada (al menos ebtables -t nat -L --Lcme muestra 0 contadores)

¡Por favor ayuda! ¡Muchas gracias!

Respuesta1

El truco consiste en combinar iptables --mac-sourcecon CONNMARK:

  • Primero utilícelo --mac-sourcepara hacer coincidir los paquetes que provienen de la dirección mac que le interesa. Es la dirección incorrecta ya que está interesado en los paquetes que van a esta dirección mac, pero ahora puede
  • Úselo CONNMARKpara marcar toda la conexión, es decir, ambas direcciones (!) y
  • establezca la marca de la marca de conexión con--restore-mark


# lan interface
if_lan=eth0

# create 'mark_mac' table for marking connections:
iptables -t mangle -N mark_mac
iptables -t mangle -A mark_mac -j MARK --set-mark 1234
iptables -t mangle -A mark_mac -j CONNMARK --save-mark

# mark connections involving mac address:
iptables -t mangle -A PREROUTING -i $if_lan -m state --state NEW -m mac --mac-source 9c:4e:36:aa:bb:cc -j mark_mac

# mark packets going to mac:
iptables -t mangle -A POSTROUTING -o $if_lan -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark


Inicialmente pensé que esto solo funcionaría para conexiones TCP que se originan en la LAN, pero dada la definición, --state NEWdebería funcionar en ambas direcciones tanto para TCP como para UDP (!)

Ver tambiénEnrutamiento de políticas en Linux basado en la dirección MAC del remitentecuál fue la inspiración para esta respuesta.

Respuesta2

iptablesFunciona en la capa 3 de OSI, por lo que no sabe nada sobre direcciones MAC.

De hecho, tiene unmódulo mac, que sin embargo contiene sólo el filtro adicional --mac-source: esto se debe a que los paquetes Ethernet que llegan llevan la dirección MAC de su origen. Sin embargo, dicha dirección MAC no existe para los paquetes que llegan a través de wifi y no es relevante para los paquetes salientes. La referencia anterior dice:

Tenga en cuenta que esto sólo tiene sentido para paquetes provenientes de un dispositivo Ethernet y que ingresan a las cadenas PREROUTING, FORWARD o INPUT.

En cuanto a ebtables, en primer lugar, solo se puede usar con tramas Ethernet, porque a las tramas wifi les falta una dirección MAC. En segundo lugar, las direcciones de origen MAC, como dije anteriormente, no existen en los paquetes IP.

Si quisieras controlar los paquetes ARP, descubrirías rápidamente que hay una instrucción

arp-mac-dst [!] dirección[/máscara]

La especificación de la dirección de destino MAC (R)ARP

pero, una vez más, esto se debe a que el protocolo ARPhaceUtilice direcciones MAC, a diferencia del protocolo IP.

información relacionada