Jump to content
Калькуляторы

помогите составить tc filter UDP пакеты с порта 1194 загнать в класс 1:10

Нужно чтобы UDP пакеты с sport 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.

Естественно я не уверен насчёт ip header contains no options.. читаю дальше

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.

 

Честно говоря я пока не очень понял как пропустить ip заголовок(ибо длина то его может меняться)

 

Хочется попроще как-нибудь... Никак?

 

P.S. У меня уже возникло желание разобраться во всем этом детально и либо конкретно пропатчить tc, либо как минимум написать нормальную обёртку для всех этих дел.

Ну не должен быть match по sport таким сложным! Ну не нормально же это!

Share this post


Link to post
Share on other sites

ну в общем стало понятно, что без link не обойтись... ладно..

Накурился этого

рецепт такой:

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.

 

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

Share this post


Link to post
Share on other sites

Нет, ну это просто жесть какая-то, а! Я себе весь моск вынес с этим 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!

Share this post


Link to post
Share on other sites

Нужно чтобы UDP пакеты с sport 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

 

А что, так не заработало?

Share this post


Link to post
Share on other sites

Заработало, но меня смутило это

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this