Назад | Перейти на главную страницу

Контроль трафика - массовые загрузки с помощью scp заставляют sshd отставать

Моя цель - ограничить пропускную способность для каждого пользователя системы с помощью интерфейсов 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, больше нет проблем с лагами.