В моей настройке многоадресный TX-трафик был отмечен iptables, но политика маршрутизации с использованием новых таблиц маршрутизации никогда не работала. Хотя он работал для одноадресных пакетов TX (перенаправляя исходящие пакеты с eth0 на eth5). Используя tc, я мог получить eth0 mcast-трафик к eth5. Src mac и src ip-адрес были изменены по сравнению с 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 --match multiport --dports 329,330 -o eth0 -j MARK - set-mark 2
Собираемся создать дерево, которое представляет нашу политику планирования и использует PRIO qdisc (планировщик пакетов) (можно попробовать другие доступные). qdiscs прикрепление в корне устройства
tc qdisc добавить dev eth0 корневой дескриптор 15: prio
Теперь на одной стороне есть политика формирования трафика, а на другой - маркировка пакетов. Чтобы соединить два, нам нужен фильтр.
refer man tc-mirred (8): действие mirred позволяет зеркалировать (копировать) или перенаправлять (красть) пакет, который он получает. Зеркалирование - это то, что иногда называют анализатором портов коммутатора (SPAN) и обычно используется для анализа и / или отладки потоков.
см. man tc-fw (8): fw - фильтр управления трафиком fwmark, фильтр fw позволяет классифицировать пакеты на основе ранее установленного fwmark по iptables. Если он идентичен «дескриптору» фильтра, фильтр совпадает. iptables позволяет помечать одиночные пакеты с целью MARK или целые соединения, используя 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} труба \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} труба \ действие зеркальный выход красный dev eth1
показать выше установленные правила: tc qdisc показать dev eth0 tc filter показать dev eth0
удалить / сбросить установленные выше правила: tc qdisc del dev eth0 root