All streams
Search
Write a publication
Pull to refresh
67
0
Антон Данилов @EvilMan

User

Send message
Да, можно. Например, можно построить вот такое правило, чтобы зеркалировать все арп-пакеты (значение «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 у многих вызывает затруднения, а по фильтрам в нём информации не так уж и много.
12 ...
8

Information

Rating
Does not participate
Location
Тула, Тульская обл., Россия
Registered
Activity

Specialization

System Administration, Network Engineer
Lead