_dx Posted August 12, 2011 · Report post Нужно чтобы 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 таким сложным! Ну не нормально же это! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
_dx Posted August 12, 2011 · Report post ну в общем стало понятно, что без 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. Чего-то я явно не догоняю.... Или это как раз тот случай, когда автор намеренно допускает ошибку? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
_dx Posted August 13, 2011 · Report post Нет, ну это просто жесть какая-то, а! Я себе весь моск вынес с этим 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! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
voron Posted August 13, 2011 · Report post Нужно чтобы 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 А что, так не заработало? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
_dx Posted August 13, 2011 · Report post Заработало, но меня смутило это 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. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...