LINUX.ORG.RU
ФорумAdmin

Сложный вопрос про htb и Squid


0

0

Всем привет.

Заранее хочу извинится за длинный текст.

Прошу помочь разобраться с маркировкой пакетов перед отправкой в определённый класс шейпинга.
Дано: сервер под управлением Gentoo со Squid-ом на борту. Два канала инета по 4М мира и 100М украины, по которым сервер равномерно распределяет нагрузку. До сих пор все шейпились в одном классе с максимальной скоростью 6000kbit (собственно исходя из толщины мирового канала) и при помощи esfq и hash dst равномерно распределялось по всем айпишникам (а не по потокам как в sfq). Но как показала практика, это не совсем оптимальное использование каналов. Посему возникла необходимость по Украине пускать с полной скоростью 100M, а мир как и раньше загонять с 6000kbit-ный класс как и раньше.

Вот как я все это реализовал:
Есть корневой класс 1: который я поделил на 1:10 со скоростью 6000kbit и приоритетом 0 (чтоб качающие по украине были в приоритете ниже чем по миру), и 1:20 со скоростью 200М (учитывая что два канала по 100М).

Вот как заворачиваю трафик в 1:10:
IPT -t mangle -A POSTROUTING -d 192.168.0.0/16 -o eth0 -j CLASSIFY --set-class 1:10

Вот как проверяю и заворачиваю в 1:20 (UA-IX):
$IPT -t mangle -N UA-IX
for i in `cat /etc/conf.d/ua-list.txt`; do \
$IPT -A UA-IX -t mangle -s $i -j CLASSIFY --set-class 1:20
done
$IPT -A POSTROUTING -t mangle -d 192.168.0.0/16 -o eth0 -j UA-IX

В чем собственно проблема:
Поскольку у меня еще и Squid работающий в прозрачном режиме, то пакеты выползающие с eth0 и идущие в локалку прекрасно захватываются правилом -t mangle -A POSTROUTING -d 192.168.0.0/16, поскольку мы проверяем адрес получателя а не источника. А вот правило, которым нужно проверять по источнику -A UA-IX -t mangle -s <UA-IX net> не срабатывают, так как пакеты не проходят через цеполчку POSTROUTING, потому, что они выходят с Squid-а а не роутятся с инета. Я пробовал -n mangle -A OUTPUT, но результат тот же. Без Сквида, понятное дело, что все работает.

Внимание вопросы:
1) Можно ли каким-то образом маркировать пакеты выходящие из Сквида в локалку по адресу источника?
2) Можно ли маркировать только пакеты с установленным SYN флагом, чтоб не прогонять весь трафик через всю цепочку UA-IX? Знаю, что можно юзая CONNMARK, но проблема в том, что у меня уже маркируются таким образом соединения при балансировке нагрузки каналов:
$IPT -A POSTROUTING -t mangle -j MARK --set-mark 0x200 -m state --state NEW -o $IF1
$IPT -A POSTROUTING -t mangle -j MARK --set-mark 0x100 -m state --state NEW -o $IF2
$IPT -A POSTROUTING -t mangle -j CONNMARK --save-mark -m state --state NEW
Тогда каким образом делать CONNMARK, чтоб одно не мешало другому?

Заранее благодарен за ответы!

★★★★★

Ответ на: комментарий от tungus

Спасибо за ссылку. Патч мог бы решить мою проблему. Но он написан под Squid 2.5. Я пробовал его переписать под 3.0.9, но у меня ничего не получилось. Уж сильно там все поменялось. Судя по Squid-овскому мейл-листу, разработчики обещают внедрить функцию socket priority в squid-3.1.

Может каким-то образом фильтровать по содержимому пакетов выходящих со Сквида, и отправлять в соответствующий класс?

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