Моя цель - ограничить пропускную способность для каждого пользователя системы с помощью интерфейсов tc, IMQ и iptables. Прямо сейчас у меня проблема с массовой загрузкой (например, scp), которая создает задержку в интерактивных программах, таких как ssh server.
Это мой конфиг:
# UPLOAD # OUTBOUND #
tc qdisc add dev imq0 root handle 1:0 htb default 11
tc class add dev imq0 parent 1:0 classid 1:1 htb rate 700kbit ceil 700kbit
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 450kbit ceil 700kbit prio 0
tc class add dev imq0 parent 1:1 classid 1:11 htb rate 250kbit ceil 250kbit prio 1
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev imq0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11
# DOWNLOAD # INBOUND #
tc qdisc add dev imq1 root handle 2:0 htb default 11
tc class add dev imq1 parent 2:0 classid 2:2 htb rate 7000kbit ceil 7000kbit
tc class add dev imq1 parent 2:1 classid 2:10 htb rate 4500kbit ceil 7000kbit prio 0
tc class add dev imq1 parent 2:1 classid 2:11 htb rate 2500kbit ceil 2500kbit prio 1
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 10 fw flowid 2:10
tc filter add dev imq1 parent 2:0 prio 1 protocol ip handle 11 fw flowid 2:11
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 1
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -N IMQ-OUT
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ-OUT
iptables -t mangle -A IMQ-OUT -p tcp -m length --length :64 -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p tcp -m length --length :64 -j RETURN
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j RETURN
iptables -t mangle -A IMQ-OUT -m owner --uid-owner test1 -j MARK --set-mark 11
iptables -t mangle -A IMQ-OUT -m owner --uid-owner test1 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ --todev 0
Класс и фильтр после выполнения конфига:
tc class show dev imq0
class htb 1:11 parent 1:1 prio 1 rate 250000bit ceil 700000bit burst 1599b cburst 1599b
class htb 1:10 parent 1:1 prio 0 rate 450000bit ceil 700000bit burst 1600b cburst 1599b
class htb 1:1 root rate 700Kbit ceil 700Kbit burst 1600b cburst 1600b
tc filter show dev imq0
filter parent 1: protocol ip pref 1 fw
filter parent 1: protocol ip pref 1 fw handle 0xb classid 1:11
filter parent 1: protocol ip pref 49152 fw
filter parent 1: protocol ip pref 49152 fw handle 0xa classid 1:10
Пытался добавить qdisc с таким sfq
# tc qdisc add dev imq0 parent 1:10 handle 10:0 sfq perturb 10
# tc qdisc add dev imq0 parent 1:11 handle 11:0 sfq perturb 10
# tc qdisc add dev imq1 parent 2:10 handle 10:0 sfq perturb 10
# tc qdisc add dev imq1 parent 2:11 handle 11:0 sfq perturb 10
но он замораживает мой компьютер (требуется перезагрузка).
Я новичок в этой теме, любая помощь приветствуется.
Вы можете использовать опцию connbytes tc. Он посчитает общее количество байтов соединения, загрузки и скачивания.
Например, проблема с scp может быть решена следующим образом:
iptables -t mangle -A IMQ-OUT -p tcp --dport 22 -m connbytes --connbytes 10000000: --connbytes-dir both --connbytes-mode bytes -m owner --uid-owner root -j MARK --set-mark 11
iptables -t mangle -A IMQ-OUT -p tcp ! --dport 22 -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p udp -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p icmp -m owner --uid-owner root -j MARK --set-mark 11
Поместите приведенные выше строки вместо этой:
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j MARK --set-mark 10
Хотя вам нужно будет позаботиться о «метке восстановления» и «метке сохранения», вы не хотите, чтобы метка TCP / 22 10 была восстановлена, вы хотите, чтобы connbyte подсчитал и принял решение перед маркировкой.
Затем вы можете изменить эту строку следующим образом:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
Становится:
iptables -t mangle -A PREROUTING -p tcp ! --dport 22 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -p udp -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -p icmp -j CONNMARK --restore-mark
Я копался в проблеме так:
мне пришлось добавить еще один класс tc для загрузки и выгрузки, позвольте называть их интерактивными классами и добавлять фильтры
tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip tos 0x10 0xff flowid 1:12
tc filter add dev imq1 protocol ip parent 2:0 prio 1 u32 match ip tos 0x10 0xff flowid 2:12
и изменен на более низкий приоритет
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 10 fw flowid 2:10
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 11 fw flowid 2:11
Теперь не массовый трафик идет вверх1: 12 вниз2: 12, больше нет проблем с лагами.