Как стать автором
Обновить

Комментарии 11

спасибо за отличную статью
Рад стараться. Надеюсь, что статья окажется полезной. На первых парах tc у многих вызывает затруднения, а по фильтрам в нём информации не так уж и много.
Давненько уже хороших дремучих статей с разъяснением на пальцах про linux не было, спасибо.
Хабр торт. tc кстати работает в юзерспейсе или как?
Сама утилита tc работает в юзерспейсе и осуществляет управление ядерной частью через протокол netlink. Сама же обработка пакетов выполняется непосредственно ядром. Примерно так же и с утилитой iptables, которая лишь управляет подсистемой netfilter.
Спасибо за качественные материал.

А возможно ли с помощью tc проверять заголовки L2?
Да, можно. Например, можно построить вот такое правило, чтобы зеркалировать все арп-пакеты (значение «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


Прошу прощения, пропущено ключевое слово в команде. Влан надо создавать так:

ip link add link eth0 name eth0.135 type vlan id 135 reorder_hdr off


Так же этот флаг можно задать/снять с помощью утилиты vconfig.
Ещё одно небольшое замечание по вланам. Некоторые сетевые карты имеют аппаратную поддержку 802.1q, то есть вставляют и удаляют теги сами. В этом случае вы так же не сможете фильтровать трафик по полям тега, вы можете даже не видеть теги в выводе tcpdump. К счастью, в последних версиях ядра при соответствующей поддержке со стороны драйверов можно аппаратную акселерацию вланов отключать. Делается это с помощью утилиты ethtool (для компактности часть вывода я опустил):

~$ ethtool -k eth3
Offload parameters for eth3:
...
rx-vlan-offload: on
tx-vlan-offload: on

~$ ethtool -K eth3 rxvlan off txvlan off

~$ ethtool -k eth3
Offload parameters for eth3:
...
rx-vlan-offload: off
tx-vlan-offload: off


Если у вас этих опций в ethtool нет, поставьте версию посвежее.
Полезная статья, разжёвано про хэширование. Очень хорошо.
Добавлю в избранное, чтобы советовать новичкам для прочтения.
Спасибо за статью, жаль не могу плюсануть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории