У моїй установці трафік багатоадресної TX був позначений iptables, але маршрутизація політики за допомогою нових таблиць маршрутизації ніколи не працювала. Хоча він працював для одноадресних TX-пакетів (перенаправлення вихідних пакетів з eth0 на eth5). Використовуючи tc, я міг би отримати трафік eth0 mcast на eth5. Src mac та src ip-адреса змінені t-адреса eth5, тому не виникатиме проблем із вивченням комутаторів. Потрібно включити всю підтримку ядра для планування пакетів ядер CONFIG_NET_SCHED
Нижче РОБОТИ для одноадресної та багатоадресної передачі трафіку з eth0 на eth5
Netfilter можна використовувати для взаємодії безпосередньо зі структурою, що представляє пакет в ядрі. Ця структура, sk_buff, містить поле під назвою "__u32 nfmark", яке ми збираємось змінити. Потім TC прочитає це значення для вибору класу призначення пакету.
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 --chch multiport --dports 329.330 -o eth0 -j MARK - set-mark 2
Будемо створювати дерево, яке представляє нашу політику планування, і використовує PRIO qdisc (планувальник пакетів) (можна спробувати інші доступні). qdiscs, що приєднується до кореня пристрою
tc qdisc Додати dev eth0 root ручка 15: prio
Тепер з одного боку встановіть політику формування трафіку, а з іншого - маркування пакетів. Щоб з'єднати ці два, нам потрібен фільтр.
зверніться до man-tc-zrled (8): Дзеркальна дія дозволяє дзеркально відображати (копіювати) або перенаправляти (красти) отриманий пакет. Дзеркальне відображення - це те, що іноді називають аналізатором комутаційних портів (SPAN) і зазвичай використовується для аналізу та / або налагодження потоків.
reference man tc-fw (8): fw - фільтр управління трафіком fwmark, фільтр fw дозволяє класифікувати пакети на основі попередньо встановленого параметра fwmark за допомогою iptables. Якщо він ідентичний "ручці" фільтра, фільтр відповідає. iptables дозволяє позначати окремі пакети цільовою позначкою або цілі з'єднання за допомогою 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 додати dev eth0 батьків 15: 0 протокол ip prio 1 ручка 0x2 fw дії pedit ex munge eth src set $ {MAC_ADDR_ETH1} труба \ дія pedit ex munge ip src set $ {IP_ADDR_ETH1} труба \ дія перемикання перемикається dev eth1
показати вище встановлені правила: tc qdisc show dev eth0 tc фільтр show dev eth0
видалити / скасувати вище встановлених правил: tc qdisc del dev eth0 root