Имеется машина с одним физическим интерфейсом. Она терминирует несколько вланов.
Возникла задача с внешнего untagged интерфейса снять выборочно трафик (например, по IP-адресу) и влить этот трафик в отдельный влан, который уже на свиче вывалится в untagged порт и улетит в некую железку.
Решаю с помощью tc. С виду все просто:
#!/bin/sh
modprobe ifb numifbs=1
ip link set dev ifb0 up
tc qdisc del dev eth0 root 2>/dev/null
tc qdisc del dev eth0 ingress 2>/dev/null
tc qdisc add dev eth0 root handle 1: htb r2q 625 default 65
tc filter add dev eth0 parent 1: protocol all u32 match ip src 192.168.0.77 action mirred egress mirror dev ifb0
tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol all u32 match ip dst 192.168.0.77 action mirred egress mirror dev ifb0
В ifb0 трафик нормально прилетает, но как только мы пытаемся вместо ifb0 влить, к примеру, в eth0.13 - машина встает колом безо всяких сообщений об ошибках.
Пробовал лить трафик в bridge. Если бридж пустой - все ок, как только в бридж добавляю eth0.13 - машина подвисает.
Подозреваю, проблема в том, что мы пытаемся залить нетегированный трафик в тегированный интерфейс. Как-то с помощью tc можно добавить vlan tag к пакету? Обгуглился но не нашел..