[РЕШЕНО] iproute2 некорректно работает
LinAdmin 1 декабря, 2011 - 13:04
Привет всем!
Недавно поставил и настроил 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Вот вывод результата:
Если ничего не помогает, прочти наконец инструкцию...
LinAdmin написал(а): но вот с
И даже логично почему - по твоим правилам за 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. Тебе осталось всего немного допилить.
Спасибо за помощь! Все
Спасибо за помощь! Все заработало!
Если ничего не помогает, прочти наконец инструкцию...