LINUX.ORG.RU
ФорумAdmin

HTB & ограничение трафика с шлюза


0

0

Есть сервер под управлением Debian, выполняющий роль шлюза и torrent качалки. Пытаюсь настроить HTB по примеру: http://www.opennet.ru/docs/RUS/LARTC/x2755.html Главная задача - сделать трафик локальной сети более приоритетным по отношению к трафику процессов на шлюзе. На шлюзе в инет смотрит eth0(192.168.1.2), в LAN eth1(192.168.2.1). Маскарадим так:

OUTIF="eth0"
INTIF="eth1"

$IPTABLES -A FORWARD -i $OUTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $OUTIF -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $OUTIF -j MASQUERADE

HTB:

CEIL=100
tc qdisc add dev eth0 root handle 1: htb default 11
tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50kbit ceil ${CEIL}kbit prio 0
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 50kbit ceil ${CEIL}kbit prio 1
tc qdisc add dev eth0 parent 1:10 handle 120: sfq perturb 10
tc qdisc add dev eth0 parent 1:11 handle 120: sfq perturb 10

tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11

iptables -t mangle -A PREROUTING -j MARK --set-mark 0x1

iptables -t mangle -A OUTPUT -j MARK --set-mark 0x2
Но проблему это не решает. LAN трафик идет через приоритетный 10 класс.
class htb 1:11 parent 1:1 prio 1 rate 50000bit ceil 100000bit burst 1624b cburst 1649b
 Sent 3695055 bytes 13767 pkt (dropped 0, overlimits 0 requeues 0)
 rate 12384bit 4pps backlog 0b 0p requeues 0
 lended: 11658 borrowed: 1785 giants: 0
 tokens: -179845 ctokens: -87969

class htb 1:10 parent 1:1 leaf 120: prio 0 rate 50000bit ceil 100000bit burst 1624b cburst 1649b
 Sent 352060 bytes 1129 pkt (dropped 0, overlimits 0 requeues 0)
 rate 832bit 0pps backlog 0b 0p requeues 0
 lended: 1082 borrowed: 47 giants: 0
 tokens: 245155 ctokens: 124531

class htb 1:1 root rate 100000bit ceil 100000bit burst 1649b cburst 1649b
 Sent 4047115 bytes 14896 pkt (dropped 0, overlimits 0 requeues 0)
 rate 13216bit 4pps backlog 0b 0p requeues 0
 lended: 1832 borrowed: 0 giants: 0
 tokens: -87969 ctokens: -87969
Но торрент на шлюзе все равно съедает весь канал. Что я делаю не правильно?

О, товарищ по несчастью))

Мне бросается в глаза 120 и там и там:
tc qdisc add dev eth0 parent 1:10 handle 120: sfq perturb 10
tc qdisc add dev eth0 parent 1:11 handle 120: sfq perturb 10

А потом почему tc прикручено к egress eth0, если eth0 это инет, ограничивается траф В инет? Или я туплю просто уже )

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

хендлы поправил, но проблема не в них.
торрент шлюза все равно отбирает весь канал и не отдает.
если найдешь решение, не забудь отписать
прикручено к eth0 потому, что нужно динамически распределять инет.

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

Сейчас вы пытаетесь ограничить траф, которые идет от шлюза и локалки в инет, соответственно на скорость закачки торрентом это мало влияет (хотя есть выход затянуть исходящий траф от торрента настолько, что это скажется на входящем).

Т.е. вам нужно ограничивать траф, приходящий с инета. Это с легкостью делается для пользователей локалки путем навешивания шейпера на исходящую очередь в локалку. Но вся загвоздка в том, что траф для самого шлюза, будучи пришедшим, уже не попадает ни в какие исходящие очереди сетевых интерфейсов, ибо это конечный пункт назначения.

Обычно это решается с помощью перенаправления этого трафика на виртуальное устройство imq, на выходе которого он станет исходящим, и соответственно шейпуемым. Но для поднятия самого imq нужно иметь как минимум бубен вуду. Еще есть аналог ifb, но вроде он как-то там с iptables не стыкуется, в любом случае по нему я не советчик.

Либо можно навесить на входящую очередь с инета дропалку пакетов для локальной станции, хотя я не знаю, можно ли их как-то выделить из общего потока.

Либо можно хитро извращнуться с использованием DNAT'а и алиасов, и пустить этот траф на какой-нибудь существующий интерфейс.

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

>О, товарищ по несчастью))
Попробуйте поставить пакет ipp2p
И сделать следующие
iptables -A PREROUTING -t mangle -p tcp -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -p tcp -m mark ! --mark 0 -j ACCEPT
iptables -A PREROUTING -t mangle -p tcp -m ipp2p --ipp2p -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -p tcp -m mark --mark 1 -j CONNMARK --save-mark

У меня нормально запхнуло торренты в отдельный класс. И допустим клиент заходит на какой-нибудь спидометр он ему показывает его должную скорость, а в торренте - на порядок ниже. Еще скажу - делайте как написано на сайте ipp2p.org. Я пробывал по разному ихний модуль использовать, но нифига неполучилось. Возможно только дропать пакеты в цепочке FORWARD, это в принципе актуально для вай-фай точек. И еще если использовать ихний модуль - как на сайте написано выбирайте не -p tcp а -p all, так как в последние время торренты стали использовать протокол udp а не tcp. Но все равно трафик будет просачиваться в другие классы, ведь торренты должны зайти http, запросить рейтинг и другое... Затем им понадобится пакеты ASK/ASK-FIN/FIN и тд. Но потом, после установки соединения, если используете модуль ipp2p пакеты попадают в тот класс, в который вы ему отвели.
Но, еще хочу заметить, разметить трафик торрентов - это только половина, вот никак не получается ограничить колличество активных соединений торренщиков.

someday
()

И будет съедать весь канал. Вы сначала разметьте трафик должным образом. Навесьте шейперы на интерфейсы в инет и в локалку. Затем поделите траф на классы 1- маленькие пакеты, 2- http, 3 - все что не отмаркировалось(в этом классе и будут сидеть торренты + плюс всякий другой трафик(скайп, аська, локальные игры и др.)). И еще не мойму использование цепочки OUTPUT - ???. У вас роутер использует интернет для своих каких-то целей?. Ну а для лучшего маркирования торрентов могу вам подсказать пакет ipp2p, мне лично он хорошо помог.

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