Pull to refresh
68
Антон Данилов@EvilMan

User

20
Subscribers
Send message
Ну тут уж ничего не поделаешь :) Можно использовать скрипты-обёртки, коих на просторах интернета великое множество.
На больших скоростях лучше использовать полисеры. Разницы между шейпером и полисером уже не ощущается. Так же лучше использоваться дисциплину HFSC вместо HTB, так как она с распараллеливается лучше и сама по себе не так сильно нагружает железо.
В общем случае, чем больше правил и они сложнее, тем нагрузка больше на цпу. Но в случае применения фильтров на основе хеш-таблиц даже с большим количеством фильтров нагрузка относительно невелика. Как показывает практика, тот же netfilter съедает на порядок больше ресурсов, чем фильтры.
Ещё одно небольшое замечание по вланам. Некоторые сетевые карты имеют аппаратную поддержку 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 нет, поставьте версию посвежее.
Прошу прощения, пропущено ключевое слово в команде. Влан надо создавать так:

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


Так же этот флаг можно задать/снять с помощью утилиты vconfig.
Да, можно. Например, можно построить вот такое правило, чтобы зеркалировать все арп-пакеты (значение «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

Системный администратор, Сетевой инженер
Ведущий