URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93861
[ Назад ]

Исходное сообщение
"Правила tc блокируют доступ некоторых хостов"

Отправлено boot0user , 02-Окт-12 16:36 
Здравствуйте!

Проблема такая: есть скрипт, которые устанавливает правила нарезки трафика 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

Спасибо.


Содержание

Сообщения в этом обсуждении
"Правила tc блокируют доступ некоторых хостов"
Отправлено Andrey Mitrofanov , 02-Окт-12 17:18 
> Проблема такая: есть скрипт, которые
> Если кто-то может помочь, был бы очень рад. Могу предоставить дополнительную информацию.

Предоставьте смету в раздел "Предложение работы" форума.


"Правила tc блокируют доступ некоторых хостов"
Отправлено boot0user , 02-Окт-12 18:14 
>> Проблема такая: есть скрипт, которые
>> Если кто-то может помочь, был бы очень рад. Могу предоставить дополнительную информацию.
> Предоставьте смету в раздел "Предложение работы" форума.

Иногда проблема исчезает после нескольких перезапусков скрипта.

Собственно скрипт:

#!/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=ifb0

modprobe 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/null

if [ "$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


"Правила tc блокируют доступ некоторых хостов"
Отправлено pavel_simple , 03-Окт-12 09:08 
>[оверквотинг удален]
> 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 решит, но нужно-же иногда и ...


"Правила tc блокируют доступ некоторых хостов"
Отправлено boot0user , 03-Окт-12 09:46 
>> 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 решит, но нужно-же иногда и ...

Я об это думал... Похоже, что иногда в ядре происходит не все так быстро, как хотелось бы... Но... Слип - это не камельфо... Это крайняя мера... Не хотелось бы...


"Правила tc блокируют доступ некоторых хостов"
Отправлено pavel_simple , 03-Окт-12 09:52 
>[оверквотинг удален]
> в него и попадают...
>>> $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 решит, но нужно-же иногда и ...
> Я об это думал... Похоже, что иногда в ядре происходит не все
> так быстро, как хотелось бы... Но... Слип - это не камельфо...
> Это крайняя мера... Не хотелось бы...

дык естевственно что слип не есть хорошо , пишем скрипт и полностью проверяем как и что


"Правила tc блокируют доступ некоторых хостов"
Отправлено boot0user , 03-Окт-12 10:32 
>[оверквотинг удален]
>>>> $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"... И... Все тоже самое... Некоторые хосты отваливаются...


"Правила tc блокируют доступ некоторых хостов"
Отправлено Z0termaNN , 09-Окт-12 16:55 
я бы для начала убрал бы flow classifier. если пакеты будут по прежнему пропадать,
то есть еще мысли.



"Правила tc блокируют доступ некоторых хостов"
Отправлено boot0user , 09-Окт-12 17:45 
> я бы для начала убрал бы 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 INFO

PATH=/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-shaper

case "$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_htb

  ifconfig 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=ifb0

P.S. Возможно, из-за одинаковых идентификаторов, пакеты мешались в очередях..


"Правила tc блокируют доступ некоторых хостов"
Отправлено Z0termaNN , 09-Окт-12 18:16 
>> я бы для начала убрал бы 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


успехов


"Правила tc блокируют доступ некоторых хостов"
Отправлено boot0user , 10-Окт-12 09:40 
> много где сказано, что это делать можно, т.к. все эти идентификаторы и
> классы локальны
> для каждого интерфейса.

По идее - да... Но спокойнее, когда они разные... К тому же для классов хендлеры начинаются с 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 подсети... Исторически осталось...

> успехов

Спасибо... И Вам успехов... Спасибо за помощь и советы...