En mi configuración, el tráfico TX de multidifusión estaba marcado por iptables, pero el enrutamiento de políticas utilizando nuevas tablas de enrutamiento nunca funcionó. Aunque funcionó para paquetes TX de unidifusión (redirigiendo paquetes de origen de eth0 a eth5). Usando tc, podría llevar el tráfico eth0 mcast a eth5. La dirección src mac y src ip se cambian a la de eth5, por lo que no creará problemas con los aprendizajes de los conmutadores. Todo el soporte del núcleo para la programación de paquetes del núcleo CONFIG_NET_SCHED debe estar habilitado
Abajo FUNCIONA para el tráfico de unidifusión y multidifusión que redirige de eth0 a eth5
Netfilter se puede usar para interactuar directamente con la estructura que representa un paquete en el núcleo. Esta estructura, sk_buff, contiene un campo llamado "__u32 nfmark" que vamos a modificar. TC leerá ese valor para seleccionar la clase de destino de un paquete.
IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multipuerto --dports 329,330 -o eth0 -j MARK --set-mark 2
Vamos a crear un árbol que represente nuestra política de programación y que use el qdisc PRIO (programador de paquetes) (puede probar otros disponibles). qdiscs adjuntando en la raíz de un dispositivo
tc qdisc add dev eth0 root handle 15: prio
Ahora tenga a un lado una política de modelado de tráfico y al otro lado la marca de paquetes. Para conectar los dos, necesitamos un filtro.
refer man tc-mirred (8): la acción mirred permite la duplicación de paquetes (copia) o la redirección (robo) del paquete que recibe. La duplicación es lo que a veces se denomina Switch Port Analyzer (SPAN) y se usa comúnmente para analizar y / o depurar flujos.
refer man tc-fw (8): fw - filtro de control de tráfico fwmark el filtro fw permite clasificar paquetes basados en un fwmark previamente establecido por iptables. Si es idéntico al 'identificador' del filtro, el filtro coincide. iptables permite marcar paquetes individuales con el objetivo MARK, o conexiones completas usando CONNMARK.
MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address
IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc filter add dev eth0 parent 15: 0 protocol ip prio 1 handle 0x2 fw action pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred redirect de salida dev eth1
mostrar las reglas establecidas arriba: tc qdisc show dev eth0 filtro tc show dev eth0
eliminar / desarmar las reglas establecidas arriba: tc qdisc del dev eth0 root