[РЕШЕНО] iproute2 некорректно работает

Привет всем!
Недавно поставил и настроил calculate directory server в качестве маршрутизатора. Все было просто замечательно, пока пользователи не начали активно пользоваться торрентами. В связи с этим я решил сделать приотеризацию трафика чтобы торренты не глушили весь канал. Вот настройки:

HOSTROUTER_1 ~ # cat rc.firewall
#!/bin/bash
# Flush rules
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Basic rules
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# New chein
iptables -N USERS2NET
# State all traffic
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Redirect all traffic to new chein
iptables -I FORWARD -s 192.168.1.0/24 -j USERS2NET
# Recover MTU
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# Reject others
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# Class traffic
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 0x100
iptables -t mangle -A PREROUTING -p icmp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x100
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN
iptables -t mangle -A PREROUTING -p udp -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -p udp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 20 -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 20 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 21 -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 21 -j RETURN
iptables -t mangle -A PREROUTING -m ipp2p --bit -j MARK --set-mark 0x900
iptables -t mangle -A PREROUTING -m ipp2p --bit -j RETURN
# Load from database
IFS='\|'
psql -A -t -U billinger -d billingv3 -c "SELECT ip, mac FROM billing;" | while read ip mac
do
    iptables -A USERS2NET -s $ip -m mac --mac-source $mac -j ACCEPT
done
# Save rules
/etc/init.d/iptables save

HOSTROUTER_1 ~ # cat rc.traffic
EXT_IF=eth0
INT_IF=eth1
# Flush all rules
tc qdisc del dev ${EXT_IF} root
# Create shaper
tc qdisc add dev ${EXT_IF} root handle 1: htb default 300
tc class add dev ${EXT_IF} parent 1: classid 1:1 htb rate 100Mbit
tc class add dev ${EXT_IF} parent 1:1 classid 1:100 htb rate 1Mbit ceil 100Mbit burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:200 htb rate 1Mbit ceil 100Mbit burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:300 htb rate 1Mbit ceil 100Mbit burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:900 htb rate 1Mbit ceil 100Mbit burst 131072
tc qdisc add dev ${EXT_IF} parent 1:100 handle 100: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:200 handle 200: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:300 handle 300: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:900 handle 900: sfq perturb 10
tc filter add dev ${EXT_IF} protocol ip parent 1:0 prio 1 handle 0x100 fw classid 1:100
tc filter add dev ${EXT_IF} protocol ip parent 1:0 prio 2 handle 0x200 fw classid 1:200
tc filter add dev ${EXT_IF} protocol ip parent 1:0 prio 3 handle 0x300 fw classid 1:300
tc filter add dev ${EXT_IF} protocol ip parent 1:0 prio 4 handle 0x900 fw classid 1:900

Проблема заключается в том, что весь трафик идет только через класс 300, то есть тот который прописан по умолчанию.
Хотя пакеты маркируются в iptables нормально:

HOSTROUTER_1 ~ # iptables -L -v -n -t mangle
Chain PREROUTING (policy ACCEPT 2371K packets, 1901M bytes)
 pkts bytes target     prot opt in     out     source               destination
 4317  383K MARK       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x100
 4317  383K RETURN     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22 MARK set 0x100
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22
 607K  535M MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK set 0x200
 607K  535M RETURN     udp  --  *      *       0.0.0.0/0            0.0.0.0/0
88218  117M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 MARK set 0x200
88218  117M RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80
  136  5668 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:8080 MARK set 0x200
  136  5668 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:8080
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:20 MARK set 0x200
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:20
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:21 MARK set 0x200
    0     0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:21
 5448  634K MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ipp2p  --bit  MARK set 0x900
 5448  634K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ipp2p  --bit

Вот вывод TC

HOSTROUTER_1 ~ # tc -s class show dev eth0
class htb 1:900 parent 1:1 leaf 900: prio 0 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

class htb 1:1 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 12237202028 bytes 17123493 pkt (dropped 0, overlimits 0 requeues 0)
 rate 14712Kbit 3112pps backlog 0b 0p requeues 0
 lended: 15052490 borrowed: 0 giants: 0
 tokens: -1507 ctokens: -1507

class htb 1:100 parent 1:1 leaf 100: prio 0 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

class htb 1:200 parent 1:1 leaf 200: prio 0 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

class htb 1:300 parent 1:1 leaf 300: prio 0 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 12237202028 bytes 17123493 pkt (dropped 0, overlimits 0 requeues 0)
 rate 14712Kbit 3112pps backlog 0b 0p requeues 0
 lended: 2071003 borrowed: 15052490 giants: 0
 tokens: -106233 ctokens: -1507

В чем может быть проблема? Я уже все перепроверил, ничего не могу понять, почему не работает.

Вынужден заметить что вы

Вынужден заметить что вы просто не понимаете что сделали. По отдельности все правила правильны (ну я тут немного лукавлю). А вот главную мысль откуда и куда идет трафик и почему он не МАРКИРУЕТСЯ увы ты не понял.

eth0 -- смотрит в инет eth1

eth0 -- смотрит в инет
eth1 -- смотрит в локальную сеть
Я фильтрую исходящий трафик от пользователей который идет в интернет. Что то мне подсказывает что security marking в ядре не включен...

Если ничего не помогает, прочти наконец инструкцию...

Вот именно, единственное то

Вот именно, единственное то что ты не учитываешь это то что mark существует только в пространстве ядра. Помечаешь ты цепочке prerouting входящий трафик. А пытаешься фильтровать исходящий трафик у которого mark не ЗАДАН!

Я пробовал вместо цепочек

Я пробовал вместо цепочек PREROUTING ставить FORWARD и POSTROUTING, это не дало никакого результата... В ядре security marking был выключен, я включил, но это тоже не дало результата...

Если ничего не помогает, прочти наконец инструкцию...

Это должно работать если ты

Это должно работать если ты маркируешь исходящий трафик, попробуй перезалить правила TC после перенастройки файервола (хотя мне кажется что это уже из разряда шаманства) ... Можно отловить маркировку через -j LOG, хотя -L кажется достаточным. Давай смотреть и отлавливать ошибки.

Это точно не в iptables

Это точно не в iptables проблема, так как пакеты он нормально маркирует. Я сделал через u32 классификатор пару правил и вот тут начались интересные проблемы. Дело в том что с интерфейсом ifb0 все работает прекрасно, но вот с интерфейсом eth1 не работает...
Вот настройки шейпера:

HOSTROUTER_1 ~ # cat rc.traffic
EXT_IF=ifb0
INT_IF=eth1
# Flush all rules
tc qdisc del dev ${INT_IF} root
tc qdisc del dev ${EXT_IF} root
rmmod ifb
# Create shaper
modprobe ifb
ip link set dev ifb0 up
tc qdisc add dev ${INT_IF} ingress
tc filter add dev ${INT_IF} parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ${EXT_IF}
tc qdisc add dev ${INT_IF} root handle 1: htb default 901
tc class add dev ${INT_IF} parent 1: classid 1:1 htb rate 100Mbit
tc class add dev ${INT_IF} parent 1:1 classid 1:101 htb rate 1Mbit ceil 100Mbit prio 1 burst 131072
tc class add dev ${INT_IF} parent 1:1 classid 1:201 htb rate 1Mbit ceil 100Mbit prio 2 burst 131072
tc class add dev ${INT_IF} parent 1:1 classid 1:301 htb rate 1Mbit ceil 100Mbit prio 3 burst 131072
tc class add dev ${INT_IF} parent 1:1 classid 1:901 htb rate 1Mbit ceil 100Mbit prio 4 burst 131072
tc qdisc add dev ${EXT_IF} root handle 1: htb default 902
tc class add dev ${EXT_IF} parent 1: classid 1:1 htb rate 100Mbit
tc class add dev ${EXT_IF} parent 1:1 classid 1:102 htb rate 1Mbit ceil 100Mbit prio 1 burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:202 htb rate 1Mbit ceil 100Mbit prio 2 burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:302 htb rate 1Mbit ceil 100Mbit prio 3 burst 131072
tc class add dev ${EXT_IF} parent 1:1 classid 1:902 htb rate 1Mbit ceil 100Mbit prio 4 burst 131072
tc qdisc add dev ${INT_IF} parent 1:101 handle 101: sfq perturb 10
tc qdisc add dev ${INT_IF} parent 1:201 handle 201: sfq perturb 10
tc qdisc add dev ${INT_IF} parent 1:301 handle 301: sfq perturb 10
tc qdisc add dev ${INT_IF} parent 1:901 handle 901: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:102 handle 102: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:202 handle 202: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:302 handle 302: sfq perturb 10
tc qdisc add dev ${EXT_IF} parent 1:902 handle 902: sfq perturb 10
tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:102
tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 17 0xff flowid 1:202
tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 6 0xff match ip sport 22 0xffff flowid 1:202
tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:302
#tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 4 u32 flowid 1:902
tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:102
tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 17 0xff flowid 1:202
tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 6 0xff match ip dport 22 0xffff flowid 1:202
tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff match ip dport 80 0xffff flowid 1:302
#tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 4 u32 flowid 1:902

Вот вывод результата:

HOSTROUTER_1 ~ # tc -s class show dev ifb0
class htb 1:202 parent 1:1 leaf 202: prio 2 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 3122545208 bytes 5047327 pkt (dropped 0, overlimits 0 requeues 0)
 rate 8461Kbit 1595pps backlog 0b 0p requeues 0
 lended: 975288 borrowed: 4072039 giants: 0
 tokens: -2743 ctokens: 1922

class htb 1:1 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 8786330899 bytes 16991311 pkt (dropped 0, overlimits 0 requeues 0)
 rate 23063Kbit 5504pps backlog 0b 0p requeues 0
 lended: 12826179 borrowed: 0 giants: 0
 tokens: 1922 ctokens: 1922

class htb 1:302 parent 1:1 leaf 302: prio 3 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 90265452 bytes 891201 pkt (dropped 0, overlimits 0 requeues 0)
 rate 156208bit 188pps backlog 0b 0p requeues 0
 lended: 885427 borrowed: 20 giants: 0
 tokens: 16376000 ctokens: 1922

class htb 1:902 parent 1:1 leaf 902: prio 4 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 5573407806 bytes 11051429 pkt (dropped 0, overlimits 0 requeues 0)
 rate 14446Kbit 3720pps backlog 0b 0p requeues 0
 lended: 1521439 borrowed: 8754120 giants: 0
 tokens: -6748 ctokens: 1922

class htb 1:102 parent 1:1 leaf 102: prio 1 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 112433 bytes 1354 pkt (dropped 0, overlimits 0 requeues 0)
 rate 208bit 0pps backlog 0b 0p requeues 0
 lended: 1354 borrowed: 0 giants: 0
 tokens: 16376000 ctokens: 1922


HOSTROUTER_1 ~ # tc -s class show dev eth1
class htb 1:901 parent 1:1 leaf 901: prio 4 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 25416901675 bytes 20534456 pkt (dropped 250, overlimits 0 requeues 0)
 rate 71226Kbit 7123pps backlog 0b 0p requeues 0
 lended: 393072 borrowed: 20140271 giants: 0
 tokens: -186471 ctokens: -331

class htb 1:101 parent 1:1 leaf 101: prio 1 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

class htb 1:1 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 25415385069 bytes 20533343 pkt (dropped 0, overlimits 0 requeues 0)
 rate 71223Kbit 7123pps backlog 0b 0p requeues 0
 lended: 20140271 borrowed: 0 giants: 0
 tokens: -331 ctokens: -331

class htb 1:301 parent 1:1 leaf 301: prio 3 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

class htb 1:201 parent 1:1 leaf 201: prio 2 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 16384000 ctokens: 2000

Если ничего не помогает, прочти наконец инструкцию...

LinAdmin написал(а): но вот с

LinAdmin написал(а):
но вот с интерфейсом eth1 не работает...

И даже логично почему - по твоим правилам за eth1 находится куча веб-серверов и ssh сервисов! Однако как я понимаю - за ним всего-лишь офис

Не только SSH и WWW сервера,

Не только SSH и WWW сервера, а так же icmp и udp протоколы. Подскажите как организовать правильно шейпинг входящего в офис трафика.

Если ничего не помогает, прочти наконец инструкцию...

Посмотри тогда вот на эти

Посмотри тогда вот на эти ляпы:

tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 6 0xff match ip sport 22 0xffff flowid 1:202
tc filter add dev ${INT_IF} parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:302

Перевожу. Прикрутил Ingress, значит рассматриваем исходящий трафик на eth1. По верхним правилам он вылавливает все то что пришло (sport) с вебсерверов и внешних ssh сервисов ... и идет куда ... если ты говоришь что у тебя за eth1 веб и ssh сервисы то получается что твои веб сервера вдруг начали разговаривать с другими веб серверами которые за ${EXT_IF}. Очень похоже что эти фильтры описывают пользовательский трафик ... трафик с вэб серверов извне. Правила правильно описывают поведение трафика но неправильно помещают "flowid 1:202, flowid 1:302" - эти классы у тебя не заданы! Признаю, был не прав в предыдущем посте, но зато нашел ошибку.

tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 2 u32 match ip protocol 6 0xff match ip dport 22 0xffff flowid 1:202
tc filter add dev ${EXT_IF} parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff match ip dport 80 0xffff flowid 1:302
а вот это явно юзверивский трафик и потому он работает!

Поменял все sport на dport,

Поменял все sport на dport, это ничего не изменило... Если вам не трудно напишите правила для исходящего трафика из офиса в мир.

Если ничего не помогает, прочти наконец инструкцию...

Просто скажи что у тебя за

Просто скажи что у тебя за eth1 (пользователи или веб/ssh сервисы, не нужно описывать топологию нужна информация исходя из QoS: что он видит за eth1). Исправь ляп с ${INT_IF} : фильтры перекидывают трафик на не существующий класс 202,302. Тебе осталось всего немного допилить.

Спасибо за помощь! Все

Спасибо за помощь! Все заработало!

Если ничего не помогает, прочти наконец инструкцию...

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".