[РЕШЕНО] 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 не работает...
Вот настройки шейпера:
Вот вывод результата:
Если ничего не помогает, прочти наконец инструкцию...
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. Тебе осталось всего немного допилить.
Спасибо за помощь! Все
Спасибо за помощь! Все заработало!
Если ничего не помогает, прочти наконец инструкцию...