LINUX.ORG.RU
ФорумAdmin

Подкасжите как трафик пошейпить

 


0

1

Полез посмотреть и выяснил, что единственный простой шейпер, который умеет ограничить трафик на закачку для процесса, не работает так как устарел. В итоге остается cgroup+tc, но там черт ногу сломит разбираться.

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

А что подсказать? Вы все совершенно точно написали: кидать нужные процессы в systemd scope, матчить траффик по соответствующей цгруппе.

i586 ★★★★★
()
Последнее исправление: i586 (всего исправлений: 1)

Сначала вам нужно создать cgroup для процесса, который вы хотите ограничить. Затем вы можете использовать инструмент tc для настройки ограничений на скорость трафика для этого cgroup.

Вот пример команд, которые вы можете использовать:

Создание cgroup: sudo cgcreate -g net_cls:myapp

Назначение процесса к cgroup:

sudo cgclassify -g net_cls:myapp Установка ограничений на скорость трафика для cgroup: sudo tc qdisc add dev eth0 root handle 1: htb default 12 sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit sudo tc class add dev eth0 parent 1:1 classid 1:12 htb rate 50mbit sudo tc filter add dev eth0 parent 1:0 protocol ip handle 1 fw classid 1:12

Эти команды устанавливают ограничение на скорость трафика на интерфейсе eth0 до 50Mbit/s для процесса, находящегося в cgroup myapp. Вы можете изменять ограничения по мере необходимости, используя команды tc.

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

Создайте новый класс в tc, который будет ограничивать скорость отправки данных из вашего процесса. Например, если вы хотите ограничить скорость до 100 Кб/сек, выполните следующую команду:

sudo tc qdisc add dev eth0 root handle 1: htb default 12 sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps

Теперь используйте cgroup, чтобы привязать ваш процесс к этому классу tc:

sudo cgcreate -g net_cls:myclass sudo cgset -r net_cls.classid=1:1 <your_process_PID> все трафик, отправляемый вашим процессом, будет ограничен до 100 Кб/сек чтобы изменить условия, просто измените скорость в команде tc.

Для автоматизации, вы можете написать скрипт, который будет запускать эти команды с нужными параметрами в нужное время. Вы также можете использовать cron для планирования запуска этого скрипта.

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

Не, сразу. Просто я вежливый :) Думал а вдруг обижу зря. Сразу текст заметен избыточным употреблением слов.

i3draven ★★
() автор топика
Последнее исправление: i3draven (всего исправлений: 1)
Ответ на: комментарий от i3draven

транслируешь ChatGPT ответы

Вот! Вот он правильный ответ! Я когда это прочитал, так и не смог понять, что же меня так коробит от подобного ответа, вроде и придраться конкретно особо не к чему, но в целом что-то тут не так... какой-то набор бездушных и главное не особо связных, в части нормального ответа для человека задавшего вопрос, формулировок.

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

Трафик входящий.

а мне надо исходящий

на закачку игр

Ещё раз объясните, что вам надо. Вам написали tc именно для исходящего трафика. В приниципе, если сильно зажимать исходящий в tcp-соединение, то и входящий подожмётся.

А так, если закачка игр и шейпить входящий трафик, то создаёте интерфейс ifb, на нём шейпите. Но, у пакета в ifb ещё нет метки iptables, поэтому в iptables ставите метку на соединение, а в tc ставите метку пакета через ″action connmark″. Как-то так:

https://wiki.archlinux.org/title/Advanced_traffic_control#Example_of_ingress_...

Готового решения с -m cgroup -j MARK, -j CONNMARK --save-mark, action connmark и handle MARK fw у меня нет.

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

Ну, вот мне написали «именно для исходящего», а надо для входящего. Что бы через косвенные методы не жать трафик. И надо с помощью tc+cgroup судя по всему. То есть все, что надо что бы root было в tc заменено на то, что там должно быть для входящего трафика. Я не нашел как это сделать когда гуглил, везде исходящий с root стоит. Чатгпт тоже не знает, кстати :) Я ей пользуюсь.

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

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

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

Идея ясна. Но она мне не нравится. Я это видел тоже как решение. Неужели у tc нет опции что бы просто шейпить входящий трафик? Сделал группу, в нее процесс занес и пошейпил входящий трафик, вот, что я хочу. Через вершины пердолинга я бы сделал давно :)

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

Несомненно, у tc есть нужные опции, но их знает только chatGPT, все остальные предпочитают пердолинг. :) Любая попытка разгласить эти опции будет жестоко подавлена.

Шейпинг, когда превышающие скорость пакеты буферизируются, возможен только для исходящих пакетов. Для входящих пакетов возможен только полисер, когда превышающие скорость пакеты отбрасываются. Как бы тоже вариант...

mky ★★★★★
()