LINUX.ORG.RU

Ответ на: комментарий от tazhate

Привет всем! Недавно поставил и настроил 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
В чем может быть проблема? Я уже все перепроверил, ничего не могу понять, почему не работает.

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

пробовали значит?
-----
$head 555.sh

tc qdisc del dev eth0 root 2>/dev/null

tc q a dev eth0 root handle 1: htb
tc c a dev eth0 parent 1: classid 1:1 htb rate 100Mbit
--------

---------
$tc -s c s dev eth0 | head -20

class htb 1:cd10 parent 1:1 prio 0 rate 9000Kbit ceil 10000Kbit burst 1598b cburst 1600b
Sent 1756687908 bytes 4670962 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 4521837 borrowed: 149125 giants: 0
tokens: 21000 ctokens: 18907

class htb 1:cd11 parent 1:1 prio 0 rate 9000Kbit ceil 10000Kbit burst 1598b cburst 1600b
Sent 4530359586 bytes 8728440 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 8295534 borrowed: 432906 giants: 0
tokens: 21000 ctokens: 18907

class htb 1:cd12 parent 1:1 prio 0 rate 9000Kbit ceil 10000Kbit burst 1598b cburst 1600b
Sent 8304410643 bytes 11767465 pkt (dropped 0, overlimits 0 requeues 0)
rate 94000bit 214pps backlog 0b 0p requeues 0
lended: 11187397 borrowed: 580068 giants: 0
tokens: 21453 ctokens: 19313

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

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

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

Вы марки делаете в netfilter, а tc шейпит на EXT_IF, то есть трафик сначала проходит через очереди на интерфейсах, где работает шейпинг, а только потом попадает в нетфильтр где вы маркируете его. Совершенно логично что шейпер никаких марков не видит.

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

Переписал правила с использованием классификатора u32, без использования iptables MARK, вот что получилось:

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 dport 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 dport 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 eth1
class htb 1:901 parent 1:1 leaf 901: prio 4 rate 1000Kbit ceil 100000Kbit burst 128Kb cburst 1600b
 Sent 1246939626 bytes 1283325 pkt (dropped 0, overlimits 0 requeues 0)
 rate 21517Kbit 2765pps backlog 0b 2p requeues 0
 lended: 61357 borrowed: 1221966 giants: 0
 tokens: -110307 ctokens: -494

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 1246936614 bytes 1283323 pkt (dropped 0, overlimits 0 requeues 0)
 rate 21517Kbit 2765pps backlog 0b 0p requeues 0
 lended: 1221966 borrowed: 0 giants: 0
 tokens: -494 ctokens: -494

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

class sfq 901:1a0 parent 901:
 (dropped 0, overlimits 0 requeues 0)
 backlog 1506b 1p requeues 0
 allot 1520

class sfq 901:1be parent 901:
 (dropped 0, overlimits 0 requeues 0)
 backlog 1506b 1p requeues 0
 allot 8
Как можно заметить на виртуальном интерфейсе ifb0 работает нормально, но вот на физическом интерфейсе eth1 не работает. Кто что подскажет по этому поводу?

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

Буков много, вникать лень. Однако если вы хотите шейпить трафик входящий на eth1(ingress), то это не выйдет - тут в самом деле нужно редиректить ingress eth1 на ifb и шейпить на ifb. Как и ранее я говорил, netfilter mark в таком случае тоже работать будет после шейпинга.

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

то есть tc позволяет шейпить только на egress очередях интерефейсов. Если нужно шейпить то что прилетело на интерфейс - заворачиваете ingress реального интерфейса на ifb и там шейпите его как egress

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

Если вас не затруднит, можете привезти пример для шейпинга входящего и исходящего трафика. Например: eth1 — смотрит в офисную сеть eth0 — смотрит в интернет

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

Лень очень:

Например, если у вас нету ната, тогда все можно делать на аплинк интерфейсе:

tc qdisc del dev eth0 root &> /dev/null
tc qdisc del dev eth0 ingress &> /dev/null
tc qdisc del dev ifb0 root &> /dev/null
tc qdisc del dev ifb0 ingress &> /dev/null

echo "filter add dev ${UP_DEV} parent 1:0 prio 1 protocol ip u32" >> ${rules}
echo "filter add dev ${DOWN_DEV} parent 1:0 prio 1 protocol ip u32" >> ${rules}

echo "qdisc add dev ${UP_DEV} ingress" >> ${rules}
echo "filter add dev ${UP_DEV} parent ffff: protocol ip prio 10 u32  match u32 0 0 flowid 1:${FI}01 action mirred egress redirect dev ${DOWN_DEV}" >> ${rules}
UP_DEV - eth0, DOWN_DEV - ifb0

После этих строк можно вешать на eth0/ifb0 классы/фильтры как обычно. на eth0 - аплоад, на ifb0-доунлоад. Если у вас два eth интерфейса и нет ната, то никаких ifb не нужно(action mirred egress redirect тоже не нужно), просто создаете на каждом фильтры/классы и шейпите на каждом свое направление.

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