LINUX.ORG.RU
ФорумAdmin

CONNMARK + MARK - путаница


0

0

Исходная тема тут : http://www.linux.org.ru/view-message.jsp?msgid=2217443

В кратце проблема - стоит только добавить строки

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 20 iptables -t mangle -A PREROUTING -m mark --mark 20 -j CONNMARK --save-mark

Для маркировки пакетов - то последующие правила начинают жить своей жизнью:

iptables -t mangle -A PREROUTING -p ! tcp -j MARK --set-mark 11 iptables -t mangle -A PREROUTING -p tcp --sport 80 -j MARK --set-mark 11 iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 11 iptables -t mangle -A PREROUTING -m mark --mark 0 -j MARK --set-mark 40

Т.е. в POSTROUTING маркировка этих пакетов выдает неадекватную информацию в объеме трафика + ( случайно заметил ) любое правило с маркировкой не упомянутой выше начинает генерировать трафик !

Т.е. :

iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 11 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 40 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 10 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -j ACCEPT

Правило с марком 10 покажет наличие трафика !!!

11 марк перестает совпадать с количеством трафика в прероутинге , 40 марк аналогично не совпадает с прероутингом!

Но ! Стоит убрать строку iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

как все становиться ОК в объемах трафика , но перестает ограничиваться пиринг. Т.е. природа "уплыва" объемов трафика между прероутингом и построутингом - эта строчка. Без нее все тип топ. Даже если из первых тех 4х строк остается только эта строчка - с объемами трафика начинается какой то голяк - и соответственно неадекватно начинает вести себя ограничение трафика при помощи HTB.

Вопрос - что я делаю не так ? ( я пробывал обычный трафик ДО , после , между 4 и последовательно между ними - та же фигня ) Без пиринга все тип топ и ограничивается как нужно, и подсчитывается адекватно - столько полоса, сколько она ограничивается...

Как соеденить это все правильно ???

anonymous

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 20
iptables -t mangle -A PREROUTING -m mark --mark 20 -j CONNMARK --save-mark

Для маркировки пакетов - то последующие правила начинают жить своей жизнью:

iptables -t mangle -A PREROUTING -p ! tcp -j MARK --set-mark 11 iptables -t mangle -A PREROUTING -p tcp --sport 80 -j MARK --set-mark 11
iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 11 iptables -t mangle -A PREROUTING -m mark --mark 0 -j MARK --set-mark 40

Т.е. в POSTROUTING маркировка этих пакетов выдает неадекватную информацию в объеме трафика + ( случайно заметил ) любое правило с маркировкой не упомянутой выше начинает генерировать трафик !

Т.е. :

iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 11 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 40 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 10 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth1 -j ACCEPT

Правило с марком 10 покажет наличие трафика !!!

11 марк перестает совпадать с количеством трафика в прероутинге , 40 марк аналогично не совпадает с прероутингом!

Но ! Стоит убрать строку iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

как все становиться ОК в объемах трафика , но перестает ограничиваться пиринг. Т.е. природа "уплыва" объемов трафика между прероутингом и построутингом - эта строчка. Без нее все тип топ. Даже если из первых тех 4х строк остается только эта строчка - с объемами трафика начинается какой то голяк - и соответственно неадекватно начинает вести себя ограничение трафика при помощи HTB.

Вопрос - что я делаю не так ? ( я пробывал обычный трафик ДО , после , между теми первыми 4мя строчками и последовательно между ними - та же фигня ) Без пиринга все тип топ и ограничивается как нужно, и подсчитывается адекватно - столько полоса, сколько она ограничивается...

Как соеденить это все правильно ???

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

Блин ну что за херня - вот как это понимать ?

Вводим для эксперемента эти команды:

iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 80 -j MARK --set-mark 11

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 40 iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 80 -j MARK --set-mark 11

Chain PREROUTING (policy ACCEPT 415M packets, 188G bytes) pkts bytes target prot opt in out source

43392 50M MARK tcp -- eth0 * 0.0.0.0/0 tcp spt:80 MARK set 0xb 734K 371M CONNMARK all -- * * 0.0.0.0/0 CONNMARK restore 455K 279M ACCEPT all -- * * 0.0.0.0/0 MARK match !0x0 25767 3422K MARK all -- * * 0.0.0.0/0 ipp2p v0.8.2 --ipp2p MARK set 0x28 25767 3422K CONNMARK all -- * * 0.0.0.0/0 MARK match !0x0 CONNMARK save 32529 34M MARK tcp -- eth0 * 0.0.0.0/0 tcp spt:80 MARK set 0xb

НИКАКИХ БОЛЬШЕ ПРАВИЛ НИГДЕ НЕТ.

Итого имеем 50М на входе, и каким таким чудом уже 34М на выходе, это как так ???

Как это все сдружить с коннмарком ?!

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

Блин ну что за херня - вот как это понимать ?

Вводим для эксперемента эти команды:

iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 80 -j MARK --set-mark 11

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 40
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 80 -j MARK --set-mark 11


Chain PREROUTING (policy ACCEPT 415M packets, 188G bytes)
pkts bytes target prot opt in out source

43392 50M MARK tcp -- eth0 * 0.0.0.0/0
tcp spt:80 MARK set 0xb
734K 371M CONNMARK all -- * * 0.0.0.0/0
CONNMARK restore
455K 279M ACCEPT all -- * * 0.0.0.0/0
MARK match !0x0
25767 3422K MARK all -- * * 0.0.0.0/0
ipp2p v0.8.2 --ipp2p MARK set 0x28
25767 3422K CONNMARK all -- * * 0.0.0.0/0
MARK match !0x0 CONNMARK save
32529 34M MARK tcp -- eth0 * 0.0.0.0/0
tcp spt:80 MARK set 0xb


НИКАКИХ БОЛЬШЕ ПРАВИЛ НИГДЕ НЕТ.

Итого имеем 50М на входе, и каким таким чудом уже 34М на выходе, это как так ???

Как это все сдружить с коннмарком ?!

anonymous
()
Ответ на: комментарий от mky

нет .... селерон 667 ... с 256 РАМ.

Этот CONNMARK уже достал до не приличия .

Я попробывал такие же маневры на FC7 с CONNMARK - таже фигня...

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

всмысле на другом кампе с другим процом - АМД

anonymous
()
Ответ на: комментарий от mky

Попробуйте две вещи:

1. Везде, где используется CONNMARK добавит --mask 0xFF или --mask 0xFFFF

2. Воткнуть в начало -m state --state ! ESTABLISHED -j CONNMARK --set-mark 0

mky ★★★★★
()
Ответ на: комментарий от anonymous

Может посмотреть /proc/net/ip_conntrack... Там показывается поле CONNMARK как mark= .

Понятно, что сначала cat /proc/net/ip_conntrack > /tmp/ip_contrack.tmp, а уже потом просматривать файл /tmp/ip_contrack.tmp

Потом проверить, работает ли --save-mark и --restore-mark на отдельном соединении (определенные src и dst ip адреса).

Вот здесь http://www.archivum.info/netfilter/2005-02/msg00427.html утверждалось, что --save-mark и --restore-mark не работают, и вроде бы был отправлен bug-report (но там Мандрейк, ядро 2.6.10). И там говорилось про ошибку в модуле ядра http://archives.mandrivalinux.com/cooker/2005-06/msg01555.php

P.S. У вас нет сообщений от ядра (dmesg), что таблица conntrack переполнена?

mky ★★★★★
()
Ответ на: комментарий от mky

Да , разобрался
Как только мы используем -j CONNMARK --restore-mark ядро начинает юзать форму маркировки записанную коннмарком в ip_conntrack , и поэтому если мы предварительно юзали например маркировку "20" для сложных соеденений типа p2p , то эта маркировка останеться там пока соеденение не умрет даже после iptables -t mangle -F

Именно с ковыряния ip_conntrack я осилил это дело.

Дальше все оказалось намного проще.

-j CONNMARK --save-mark не выкидывает пакет из цепочки PREROUTING , он там дальше путешествует , натыкаясь на другие цепочки и возникают парадоксы такого вида :
маркировка 20 p2p и маркировка например дальше udp трафика порождала какие угодно показания в построутинге, но не те какие нужно.

Поэтому нужно юзать -j ACCEPT тому трафику которому не нужно делать CONNMARK что бы выкинуть его с прероутинга для дальнейшего прохождения пакета.
Вот часть как должно быть, точнее как работает ;)

-t mangle -A PREROUTING -i eth0 -m ipp2p --ipp2p -j MARK --set-mark 20
-t mangle -A PREROUTING -m mark --mark 20 -j CONNMARK --save-mark

Так мы заставляем коннмарк отслеживать только пиринг.
А дальше все оказалось на много проще

-t mangle -A PREROUTING -i eth0 -p tcp --sport 80 -j MARK 40
-t mangke -A PREROUTING -m mark 40 -j ACCEPT

и тд ниже по правилам.

Маркировка пиринга должна быть первой , иначе вы рисскуете промаркировать пиринговые пакеты другим марком и в цепочку марка пиринга они не попадут с соотв последствиями. ( например !tcp или lenght:64 )

Так что для каждого марка по ACCEPT`у и все начинает работать тип топ как надо - построутинге отражается промаркированый пакет кроме пиринга соответствующего объема что и в прероутинге.
Сам пиринг в построутинге больше чем в прероутинге - видать такая особенность коннмарка , главное что работает и переданый объем в построутинге совпадает с полученным объемом клиентом. ( Скорость ограниченная при помощи htb для марка пиринга отлично видна по количеству трафика пиринга в построутинге.

Вотс. Все что мне нужно было - юзать ACCEPT ;)

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