LINUX.ORG.RU
решено ФорумAdmin

помогите составить tc filter


0

1

нужно чтобы UDP пакеты с порта 1194 попадали в класс 1:10

хотел написать
tc filter add dev «${wan_iface}» protocol ip parent 1:0 prio 1 \
u32 match ip sport 1194 0xffff flowid 1:10

но потом прочитал это
ip sport <VALUE> <MASK>
Matches the 16 bit source port in a TCP or UDP IPv4 packet.
This only works if the ip header contains no options. Use the
«link» and «match tcp src» or «match udp src» options if you
can not be sure of that.

Городить тут хэш таблицы не хотелось бы, потому что на интерфейсе будет всего два фильтра.
Хочется попроще как-нибудь...


udp src <VALUE> <MASK>
Match the 16 bit source port in the udp packet. This must be
in a hash table is «link"ed to by a filter item which contains
an „offset“ option that skips the IP header.

куда offset то засунуть? и на сколько оффсетить то? если опции меняют длину заголовка.... непоняяятно :(

dx
() автор топика
Ответ на: комментарий от dx

ну в общем стало понятно, что без link не обойтись... ладно..
накурился этого http://b42.cz/notes/u32_classifier/
рецепт такой:
tc filter add dev eth0 parent 999:0 protocol ip prio 99 u32 \
link 1: offset at 0 mask 0f00 shift 6 plus 0 eat \
match ip protocol 6 ff
всё понятно, но почему shift 6, а не 8?????
Ведь нам нужно получить длину заголовка, а она в старшем байте, точнее даже в полубайте(что и видно по маске), но младший байт по любому нужно шифтить нафиг! А это же 8, а не 6.

Чего-то я явно не догоняю.... Или это как раз тот случай, когда автор намеренно допускает ошибку?

dx
() автор топика
Ответ на: комментарий от dx

Нет, ну это просто жесть какая-то, а! Я себе весь моск вынес с этим tc!
В тексте не точность, но не shift 6, а выше.
Там где
Here is how it works. Recall that the match option looks like this:
match u32 VALUE MASK at OFFSET

I said earlier that OFFSET tells the kernel which word in the packet to compare to VALUE.

Автору стоило бы обратить внимание на то, что на самом то деле offset в БАЙТАХ, а не в вордах. Да, в принципе он написал всё правильно - оффсет определяет какой именно ворд будет взят на матч, но ведь на такие моменты нужно обращать внимание!
Я часа 4 эту тему мусолил в голове перед тем как запостил сюда вопрос и только сейчас пришло просветление:
Дело всё в том, что в поле IHL IP заголовка значение хранится как раз в 32битных ВОРДАХ!
т.е. к offset нужно прибавить IHL*4
И делая shift 6, вместо shift 8 мы как раз и делаем результат в 4 раза больше! Там то нули в младшем байте(после маски 0f00), а значит их не страшно оставить и получаем в аккурат IHL*4!

dx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.