Здравствуйте!Проблема такая: есть скрипт, которые устанавливает правила нарезки трафика tc для сети на брандмауэре. При запуске этого скрипта иногда блокируются некоторые хосты в сети (под блокировкой понимается отсутствие доступа в интернет). tcpdump ничего не дает. Видно, что пакет приходит, но дальше теряется где-то в недрах ядра. Вся эта петрушка лечится повторным запуском скрипта (скрипт реагирует на up и down).
Если кто-то может помочь, был бы очень рад. Могу предоставить дополнительную информацию.
Система: Linux wall 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux
Спасибо.
> Проблема такая: есть скрипт, которые
> Если кто-то может помочь, был бы очень рад. Могу предоставить дополнительную информацию.Предоставьте смету в раздел "Предложение работы" форума.
>> Проблема такая: есть скрипт, которые
>> Если кто-то может помочь, был бы очень рад. Могу предоставить дополнительную информацию.
> Предоставьте смету в раздел "Предложение работы" форума.Иногда проблема исчезает после нескольких перезапусков скрипта.
Собственно скрипт:
#!/bin/sh
cmdTC=/sbin/tc
rateLANDl="60mbit"
ceilLANDl="60mbit"
rateLANUl="40mbit"
ceilLANUl="40mbit"
quantLAN="1514"# Nowaday bandwidth limit set to 100mbit.
# We divide it with 60mbit download and 40mbit upload bandthes.rateHiDl="30mbit"
ceilHiDl="60mbit"
rateHiUl="20mbit"
ceilHiUl="40mbit"
quantHi="1514"rateLoDl="30mbit"
ceilLoDl="60mbit"
rateLoUl="20mbit"
ceilLoUl="40mbit"
quantLo="1514"devNIF=eth0
devFIF=ifb0modprobe ifb
ip link set $devFIF up 2>/dev/null#exit 0
################################################################################################
# Remove discuiplines from network and fake interfaces
################################################################################################
$cmdTC qdisc del dev $devNIF root 2>/dev/null
$cmdTC qdisc del dev $devFIF root 2>/dev/null
$cmdTC qdisc del dev $devNIF ingress 2>/dev/nullif [ "$1" = "down" ]; then
exit 0
fi################################################################################################
# Create discuiplines for network interface
################################################################################################
$cmdTC qdisc add dev $devNIF root handle 1:0 htb default 12# Create classes for network interface
$cmdTC class add dev $devNIF parent 1:0 classid 1:1 htb rate ${rateLANDl} ceil ${ceilLANDl} quantum ${quantLAN}
$cmdTC class add dev $devNIF parent 1:1 classid 1:11 htb rate ${rateHiDl} ceil ${ceilHiDl} quantum ${quantHi}
$cmdTC class add dev $devNIF parent 1:1 classid 1:12 htb rate ${rateLoDl} ceil ${ceilLoDl} quantum ${quantLo}$cmdTC qdisc add dev $devNIF parent 1:11 handle 111: sfq perturb 10
$cmdTC qdisc add dev $devNIF parent 1:12 handle 112: sfq perturb 10# Create filters for network interface
$cmdTC filter add dev $devNIF protocol all parent 1:0 u32 match ip dst 10.252.2.0/24 flowid 1:11
$cmdTC filter add dev $devNIF protocol all parent 111: handle 111 flow hash keys dst divisor 1024 baseclass 1:11$cmdTC filter add dev $devNIF protocol all parent 112: handle 112 flow hash keys dst divisor 1024 baseclass 1:12
################################################################################################
# Create discuiplines for fake interface
################################################################################################
$cmdTC qdisc add dev $devFIF root handle 1:0 htb default 12# Create classes for network interface
$cmdTC class add dev $devFIF parent 1:0 classid 1:1 htb rate ${rateLANUl} ceil ${ceilLANUl} quantum ${quantLAN}
$cmdTC class add dev $devFIF parent 1:1 classid 1:11 htb rate ${rateHiUl} ceil ${ceilHiUl} quantum ${quantHi}
$cmdTC class add dev $devFIF parent 1:1 classid 1:12 htb rate ${rateLoUl} ceil ${ceilLoUl} quantum ${quantLo}$cmdTC qdisc add dev $devFIF parent 1:11 handle 111: sfq perturb 10
$cmdTC qdisc add dev $devFIF parent 1:12 handle 112: sfq perturb 10# Create filters for network interface
$cmdTC filter add dev $devFIF protocol all parent 1:0 u32 match ip src 10.252.2.0/24 flowid 1:11
$cmdTC filter add dev $devFIF protocol all parent 111: handle 111 flow hash keys src divisor 1024 baseclass 1:11$cmdTC filter add dev $devFIF protocol all parent 112: handle 112 flow hash keys src divisor 1024 baseclass 1:12
################################################################################################
# Create redirect discuiplines from network to fake interface
################################################################################################
$cmdTC qdisc add dev $devNIF ingress
$cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev $devFIF
>[оверквотинг удален]
> quantHi="1514"
> rateLoDl="30mbit"
> ceilLoDl="60mbit"
> rateLoUl="20mbit"
> ceilLoUl="40mbit"
> quantLo="1514"
> devNIF=eth0
> devFIF=ifb0
> modprobe ifb
> ip link set $devFIF up 2>/dev/nullсдесь нужно поставить как минимум слип, чтобы бытm увереныым что интерфейс поднялся
>[оверквотинг удален]
> ceil ${ceilLoDl} quantum ${quantLo}
> $cmdTC qdisc add dev $devNIF parent 1:11 handle 111: sfq perturb 10
> $cmdTC qdisc add dev $devNIF parent 1:12 handle 112: sfq perturb 10
> # Create filters for network interface
> $cmdTC filter add dev $devNIF protocol all parent 1:0 u32 match ip
> dst 10.252.2.0/24 flowid 1:11
> $cmdTC filter add dev $devNIF protocol all parent 111: handle 111 flow
> hash keys dst divisor 1024 baseclass 1:11
> $cmdTC filter add dev $devNIF protocol all parent 112: handle 112 flow
> hash keys dst divisor 1024 baseclass 1:12сдесь смущает использование сети /24 и делителя в 1024 мне всегда казалось что в такую сеть больше 256 хостов не влезает
>[оверквотинг удален]
> ceil ${ceilLoUl} quantum ${quantLo}
> $cmdTC qdisc add dev $devFIF parent 1:11 handle 111: sfq perturb 10
> $cmdTC qdisc add dev $devFIF parent 1:12 handle 112: sfq perturb 10
> # Create filters for network interface
> $cmdTC filter add dev $devFIF protocol all parent 1:0 u32 match ip
> src 10.252.2.0/24 flowid 1:11
> $cmdTC filter add dev $devFIF protocol all parent 111: handle 111 flow
> hash keys src divisor 1024 baseclass 1:11
> $cmdTC filter add dev $devFIF protocol all parent 112: handle 112 flow
> hash keys src divisor 1024 baseclass 1:12аналогичyо
> ################################################################################################
> # Create redirect discuiplines from network to fake interface
> ################################################################################################
> $cmdTC qdisc add dev $devNIF ingress
> $cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32
> 0 0 action mirred egress redirect dev $devFIFИМХО добавление sleep решит, но нужно-же иногда и ...
>> modprobe ifb
>> ip link set $devFIF up 2>/dev/null
> сдесь нужно поставить как минимум слип, чтобы бытm увереныым что интерфейс поднялсяМежду делом, добавил загрузку ifb в /etc/modules, в /etc/networks/interfaces добавил ifb0 в hotplug... Результат не изменился...
>[оверквотинг удален]
>> $cmdTC qdisc add dev $devNIF parent 1:12 handle 112: sfq perturb 10
>> # Create filters for network interface
>> $cmdTC filter add dev $devNIF protocol all parent 1:0 u32 match ip
>> dst 10.252.2.0/24 flowid 1:11
>> $cmdTC filter add dev $devNIF protocol all parent 111: handle 111 flow
>> hash keys dst divisor 1024 baseclass 1:11
>> $cmdTC filter add dev $devNIF protocol all parent 112: handle 112 flow
>> hash keys dst divisor 1024 baseclass 1:12
> сдесь смущает использование сети /24 и делителя в 1024 мне всегда казалось
> что в такую сеть больше 256 хостов не влезаетПервый фильтр - на сеть из 254 хостов... Остальная сеть - порядка 500 компов... Поэтому такой большой хэш... Это дефолтное правило... Они все в него и попадают...
>> $cmdTC qdisc add dev $devNIF ingress
>> $cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32
>> 0 0 action mirred egress redirect dev $devFIFПробовал переносить ingress в начало... Тогда внутренний интерфейс вообще не доступен... Если перед правилами для ifb, результат не меняется...
> ИМХО добавление sleep решит, но нужно-же иногда и ...
Я об это думал... Похоже, что иногда в ядре происходит не все так быстро, как хотелось бы... Но... Слип - это не камельфо... Это крайняя мера... Не хотелось бы...
>[оверквотинг удален]
> в него и попадают...
>>> $cmdTC qdisc add dev $devNIF ingress
>>> $cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32
>>> 0 0 action mirred egress redirect dev $devFIF
> Пробовал переносить ingress в начало... Тогда внутренний интерфейс вообще не доступен...
> Если перед правилами для ifb, результат не меняется...
>> ИМХО добавление sleep решит, но нужно-же иногда и ...
> Я об это думал... Похоже, что иногда в ядре происходит не все
> так быстро, как хотелось бы... Но... Слип - это не камельфо...
> Это крайняя мера... Не хотелось бы...дык естевственно что слип не есть хорошо , пишем скрипт и полностью проверяем как и что
>[оверквотинг удален]
>>>> $cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32
>>>> 0 0 action mirred egress redirect dev $devFIF
>> Пробовал переносить ingress в начало... Тогда внутренний интерфейс вообще не доступен...
>> Если перед правилами для ifb, результат не меняется...
>>> ИМХО добавление sleep решит, но нужно-же иногда и ...
>> Я об это думал... Похоже, что иногда в ядре происходит не все
>> так быстро, как хотелось бы... Но... Слип - это не камельфо...
>> Это крайняя мера... Не хотелось бы...
> дык естевственно что слип не есть хорошо , пишем скрипт и полностью
> проверяем как и чтоЯ вызываю свой скрипт с параметром "down"... Потом жду секунд 20... Делаю "up"... И... Все тоже самое... Некоторые хосты отваливаются...
я бы для начала убрал бы flow classifier. если пакеты будут по прежнему пропадать,
то есть еще мысли.
> я бы для начала убрал бы flow classifier. если пакеты будут по
> прежнему пропадать,
> то есть еще мысли.Z0termaNN, спасибо за твой ответ...
У меня мысли вот какие... В моих правилах идентификаторы классов, хендлеров и остального пересекаются. Нигде не сказано, что этого делать нельзя, к тому же интерфейсы разные.
Я изменил идентификаторы так, что они не пересекаются. Добавил приоритеты.. После 5 дней все в норме. Перезагрузка правил не приводит к неверной работе. Также я опустил некоторые параметры, которые являются дополнительными - пусть система сама думает, какие идентификаторы выбрать... Плюс - сделал вместо скрипта на up интерфейса, скрипт, который пускается как сервис.
(Собственно, правила в первоначальном варианте и были такими, какие они сейчас... Просто я решил сделать более эстетично или академически, что-ли... :)
/etc/init.d/hi-me-lo
#! /bin/sh
### BEGIN INIT INFO
# Provides: hilo-tc-shaper
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop hilo-tc-shaper
# Description: hilo-tc-shaper
### END INIT INFOPATH=/sbin:/bin
. /lib/init/vars.sh
. /lib/lsb/init-functions# Reads config file (will override defaults above)
[ -r /etc/default/hilo-tc-shaper ] && . /etc/default/hilo-tc-shapercase "$1" in
start|"")
log_daemon_msg "Starting hilo-tc-shaper" "ok"################################################################################################
# Load used modules
################################################################################################
modprobe ifb
modprobe act_mirred
modprobe cls_flow
modprobe cls_u32
modprobe sch_ingress
modprobe sch_sfq
modprobe sch_htbifconfig ifb0 txqueuelen 1000 2>/dev/null
ifconfig ifb0 up 2>/dev/null################################################################################################
# Create discuiplines for network interface
################################################################################################
$cmdTC qdisc add dev $devNIF root handle 1:0 htb default 12# Create classes for network interface
$cmdTC class add dev $devNIF parent 1:0 classid 1:1 htb rate ${rateLANDl} ceil ${ceilLANDl} quantum ${quantLAN}
$cmdTC class add dev $devNIF parent 1:1 classid 1:11 htb prio 1 rate ${rateHiDl} ceil ${ceilHiDl} quantum ${quantHi}
$cmdTC class add dev $devNIF parent 1:1 classid 1:12 htb prio 2 rate ${rateLoDl} ceil ${ceilLoDl} quantum ${quantLo}$cmdTC qdisc add dev $devNIF parent 1:11 sfq perturb 10
$cmdTC qdisc add dev $devNIF parent 1:12 sfq perturb 10# Create filters for network interface
$cmdTC filter add dev $devNIF protocol all prio 1 parent 1:0 u32 match ip dst 10.252.2.0/24 flowid 1:11
$cmdTC filter add dev $devNIF protocol all prio 1 parent 1:11 handle 111 flow hash keys dst divisor 1024$cmdTC filter add dev $devNIF protocol all prio 2 parent 1:0 u32 match ip dst 0/0 flowid 1:12
$cmdTC filter add dev $devNIF protocol all prio 2 parent 1:12 handle 112 flow hash keys dst divisor 1024################################################################################################
# Create discuiplines for fake interface
################################################################################################
$cmdTC qdisc add dev $devFIF root handle 2:0 htb default 22# Create classes for network interface
$cmdTC class add dev $devFIF parent 2:0 classid 2:2 htb rate ${rateLANUl} ceil ${ceilLANUl} quantum ${quantLAN}
$cmdTC class add dev $devFIF parent 2:2 classid 2:21 htb prio 1 rate ${rateHiUl} ceil ${ceilHiUl} quantum ${quantHi}
$cmdTC class add dev $devFIF parent 2:2 classid 2:22 htb prio 2 rate ${rateLoUl} ceil ${ceilLoUl} quantum ${quantLo}$cmdTC qdisc add dev $devFIF parent 2:21 sfq perturb 10
$cmdTC qdisc add dev $devFIF parent 2:22 sfq perturb 10# Create filters for network interface
$cmdTC filter add dev $devFIF protocol all prio 1 parent 2:0 u32 match ip src 10.252.2.0/24 flowid 2:21
$cmdTC filter add dev $devFIF protocol all prio 1 parent 2:21 handle 221 flow hash keys src divisor 1024$cmdTC filter add dev $devFIF protocol all prio 2 parent 2:0 u32 match ip src 0/0 flowid 2:22
$cmdTC filter add dev $devFIF protocol all prio 2 parent 2:22 handle 222 flow hash keys src divisor 1024################################################################################################
# Create redirect discuiplines from network to fake interface
################################################################################################
$cmdTC qdisc add dev $devNIF ingress
$cmdTC filter add dev $devNIF parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev $devFIF
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping hilo-tc-shaper" "ok"################################################################################################
# Remove discuiplines from network and fake interfaces
################################################################################################
$cmdTC qdisc del dev $devNIF root 2>/dev/null
$cmdTC qdisc del dev $devFIF root 2>/dev/null
$cmdTC qdisc del dev $devNIF ingress 2>/dev/null#ifconfig ifb0 down 2>/dev/null
log_end_msg 0
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: hilo-tc-shaper [start|stop|restart|force-reload]" >&2
exit 3
;;
esac:
/etc/default/hi-me-lo
cmdTC=/sbin/tc
rateLANDl="60mbit"
ceilLANDl="60mbit"
rateLANUl="40mbit"
ceilLANUl="40mbit"
quantLAN="1514"# Nowaday bandwidth limit set to 100mbit.
# We divide it with 60mbit download and 40mbit upload bandthes.rateHiDl="30mbit"
ceilHiDl="60mbit"
rateHiUl="20mbit"
ceilHiUl="40mbit"
quantHi="1514"rateLoDl="30mbit"
ceilLoDl="60mbit"
rateLoUl="20mbit"
ceilLoUl="40mbit"
quantLo="1514"devNIF=eth0
devFIF=ifb0P.S. Возможно, из-за одинаковых идентификаторов, пакеты мешались в очередях..
>> я бы для начала убрал бы flow classifier. если пакеты будут по
>> прежнему пропадать,
>> то есть еще мысли.
> Z0termaNN, спасибо за твой ответ...
> У меня мысли вот какие... В моих правилах идентификаторы классов, хендлеров и
> остального пересекаются. Нигде не сказано, что этого делать нельзя, к тому
> же интерфейсы разные.много где сказано, что это делать можно, т.к. все эти идентификаторы и классы локальны
для каждого интерфейса.> Я изменил идентификаторы так, что они не пересекаются. Добавил приоритеты.. После 5
вот скорее всего как раз добавление приоритетов и помогло. с приоритетами есть некоторые
неочевидные нюансы.>[оверквотинг удален]
> ceilHiUl="40mbit"
> quantHi="1514"
> rateLoDl="30mbit"
> ceilLoDl="60mbit"
> rateLoUl="20mbit"
> ceilLoUl="40mbit"
> quantLo="1514"
> devNIF=eth0
> devFIF=ifb0
> P.S. Возможно, из-за одинаковых идентификаторов, пакеты мешались в очередях..несколько несущественных замечаний.
1. я бы делал все одним приемом, примерно так:
tc -batch <<EOF
qdisc add dev $devNIF root handle 1:0 htb default 12
# Create classes for network interface
class add dev $devNIF parent 1:0 classid 1:1 htb rate ${rateLANDl} ceil ${ceilLANDl} quantum ${quantLAN}
class add dev $devNIF parent 1:1 classid 1:11 htb prio 1 rate ${rateHiDl} ceil ${ceilHiDl} quantum ${quantHi}
class add dev $devNIF parent 1:1 classid 1:12 htb prio 2 rate ${rateLoDl} ceil ${ceilLoDl} quantum ${quantLo}
#
qdisc add dev $devNIF parent 1:11 sfq perturb 10
qdisc add dev $devNIF parent 1:12 sfq perturb 10
# Create filters for network interface
filter add dev $devNIF protocol all prio 1 parent 1:0 u32 match ip dst 10.252.2.0/24 flowid 1:11
filter add dev $devNIF protocol all prio 1 parent 1:11 handle 111 flow hash keys dst divisor 1024
#
filter add dev $devNIF protocol all prio 2 parent 1:0 u32 match ip dst 0/0 flowid 1:12
filter add dev $devNIF protocol all prio 2 parent 1:12 handle 112 flow hash keys dst divisor 1024
EOFтак оно как-то спокойнее.
2. я не знаю имеет ли смысл устанавливать с flow классификатором параметр perturb в sfq,
т.к. хэш расчитывается в классификаторе. кстати, если ядро свежее, то perturb можно в
классификаторе установить. Я вообще не уверен, что имеет смысл использовать perturb, если
хэш считается по одному ключу.3. filter add dev $devNIF protocol all prio 1 parent 1:11 handle 111 flow hash keys dst divisor 1024
здесь достаточно divisor 256, т.к. у dst /24
успехов
> много где сказано, что это делать можно, т.к. все эти идентификаторы и
> классы локальны
> для каждого интерфейса.По идее - да... Но спокойнее, когда они разные... К тому же для классов хендлеры начинаются с 8000, а у меня начинались с 200 (как у фильтров)... Я уже сталкивался с тем, что в некоторых системах такие значения принимаются, но грабли вылазят... Поэтому, лучше довериться операционке, если это возможно... К тому же в моей, несмотря на то, что они локальны для интерфейсов, операционка выдает для разных интерфейсов разные индентификаторы, которые идут подряд, т.е. 8000, 8001 и т.д.
>> Я изменил идентификаторы так, что они не пересекаются. Добавил приоритеты.. После 5
> вот скорее всего как раз добавление приоритетов и помогло. с приоритетами есть
> некоторые
> неочевидные нюансы.В фильтрах prio заметен больше всего... :)
> хэш считается по одному ключу.
> 3. filter add dev $devNIF protocol all prio 1 parent 1:11 handle
> 111 flow hash keys dst divisor 1024
> здесь достаточно divisor 256, т.к. у dst /24Согласен, просто раньше там было 4 подсети... Исторически осталось...
> успехов
Спасибо... И Вам успехов... Спасибо за помощь и советы...