Да, можно. Например, можно построить вот такое правило, чтобы зеркалировать все арп-пакеты (значение «0x0806» в поле протокола заголовка ethernet) с мак-адресом источника «12:34:56:78:9a:bc»:
tc filter add \
dev eth0 \
parent 1: \
protocol 802_3 \
pref 10 \
u32 \
match u32 0x12345678 0xffffffff at -8 \
match u32 0x9abc0000 0xffff0000 at -4 \
match u16 0x0806 0xffff at -2 \
action mirred egress mirror dev ifb0
Нулевое смещение, как я писал ранее, соответствует началу пакета сетевого уровня. Для фильтров с разным параметром «protocol» необходимо указывать разный приоритет (параметр «pref»). Поддерживаются следующие обозначения протоколов: loop, pup, ip, irda, control, x25, arp, bpq, mobitex, tr_802_2, dec, dna_dl, dna_rc, ppptalk, localtalk, dna_rt, lat, cust, wan, ppp, ddcm, sca, rarp, atalk, snap, 802_2, aarp, ipx, ipv6, all, ax25, 802_3. Но придётся покопаться в стандартах, чтобы посчитать смещения и длины полей.
Для ethernet-фреймов есть немного синтаксического сахара для сопоставления по мак-адресам. Например, предыдущий пример, написанный в другой манере:
tc filter add \
dev eth0 \
parent 1: \
protocol 802_3 \
pref 10 \
u32 \
match ether src 12:34:56:78:9a:bc \
match u16 0x0806 0xffff at -2 \
action mirred egress mirror dev ifb0
Ещё одно небольшое замечание по поводу проверки полей заголовков 802.1q (Vlan): по-умолчанию влан-интерфейсы создаются с флагом «reorder header», что приводит к тому, что теги во фреймах отсутствуют (информация о номере влана и приоритете хранится в структуре sk_buf, соответствующей пакету). Чтобы теги появились, надо флаг на влан-интерфейсе выключить (или при создании влана указывать этот флаг отключённым), например, с помощью утилиты ip:
#меняем флаг reorder_hdr на интерфейсе eth0.134
ip link set dev eth0.134 type vlan id 134 reorder_hdr off
#создаём влан-интерфейс
ip link add eth0 name eth0.135 type vlan id 135 reorder_hdr off
Сама утилита tc работает в юзерспейсе и осуществляет управление ядерной частью через протокол netlink. Сама же обработка пакетов выполняется непосредственно ядром. Примерно так же и с утилитой iptables, которая лишь управляет подсистемой netfilter.
Рад стараться. Надеюсь, что статья окажется полезной. На первых парах tc у многих вызывает затруднения, а по фильтрам в нём информации не так уж и много.
Нулевое смещение, как я писал ранее, соответствует началу пакета сетевого уровня. Для фильтров с разным параметром «protocol» необходимо указывать разный приоритет (параметр «pref»). Поддерживаются следующие обозначения протоколов: loop, pup, ip, irda, control, x25, arp, bpq, mobitex, tr_802_2, dec, dna_dl, dna_rc, ppptalk, localtalk, dna_rt, lat, cust, wan, ppp, ddcm, sca, rarp, atalk, snap, 802_2, aarp, ipx, ipv6, all, ax25, 802_3. Но придётся покопаться в стандартах, чтобы посчитать смещения и длины полей.
Для ethernet-фреймов есть немного синтаксического сахара для сопоставления по мак-адресам. Например, предыдущий пример, написанный в другой манере:
Ещё одно небольшое замечание по поводу проверки полей заголовков 802.1q (Vlan): по-умолчанию влан-интерфейсы создаются с флагом «reorder header», что приводит к тому, что теги во фреймах отсутствуют (информация о номере влана и приоритете хранится в структуре sk_buf, соответствующей пакету). Чтобы теги появились, надо флаг на влан-интерфейсе выключить (или при создании влана указывать этот флаг отключённым), например, с помощью утилиты ip: