Перейти к содержимому
Калькуляторы

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну в общем стало понятно, что без 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.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нужно чтобы 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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.