Комментарии 11
спасибо за отличную статью
+5
Давненько уже хороших дремучих статей с разъяснением на пальцах про linux не было, спасибо.
+4
Хабр торт. tc кстати работает в юзерспейсе или как?
+1
Спасибо за качественные материал.
А возможно ли с помощью tc проверять заголовки L2?
А возможно ли с помощью tc проверять заголовки L2?
0
Да, можно. Например, можно построить вот такое правило, чтобы зеркалировать все арп-пакеты (значение «0x0806» в поле протокола заголовка ethernet) с мак-адресом источника «12:34:56:78:9a:bc»:
Нулевое смещение, как я писал ранее, соответствует началу пакета сетевого уровня. Для фильтров с разным параметром «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:
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
+1
Прошу прощения, пропущено ключевое слово в команде. Влан надо создавать так:
Так же этот флаг можно задать/снять с помощью утилиты vconfig.
ip link add link eth0 name eth0.135 type vlan id 135 reorder_hdr off
Так же этот флаг можно задать/снять с помощью утилиты vconfig.
+1
Ещё одно небольшое замечание по вланам. Некоторые сетевые карты имеют аппаратную поддержку 802.1q, то есть вставляют и удаляют теги сами. В этом случае вы так же не сможете фильтровать трафик по полям тега, вы можете даже не видеть теги в выводе tcpdump. К счастью, в последних версиях ядра при соответствующей поддержке со стороны драйверов можно аппаратную акселерацию вланов отключать. Делается это с помощью утилиты ethtool (для компактности часть вывода я опустил):
Если у вас этих опций в 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 нет, поставьте версию посвежее.
0
Полезная статья, разжёвано про хэширование. Очень хорошо.
Добавлю в избранное, чтобы советовать новичкам для прочтения.
Добавлю в избранное, чтобы советовать новичкам для прочтения.
+1
Спасибо за статью, жаль не могу плюсануть.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
QoS в Linux: фильтр U32