Перейти к содержимому
Калькуляторы

sc: скрипт для управления Linux-шейпером

Делается ли на этой же машине NAT?

Да

Ну естественно, что для серых IP шейпинг исходящего трафика работать не будет, т.к. адрес источника подменяется до того, как пакет попадет в очередь tc. Советую перенести NAT на бордер, а машину с шейпером сделать мостом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не обязательно, исход можно безболезненно полисить на игрессе. Попробуйте limit_method = hybrid, должно заработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно ли адаптировать стартап скрипт к CentOS 5.x ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно ли адаптировать стартап скрипт к CentOS 5.x ?

 

Если коротко, то нет http://forum.nag.ru/forum/index.php?showtopic=48301&view=findpost&p=595058

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не обязательно, исход можно безболезненно полисить на игрессе. Попробуйте limit_method = hybrid, должно заработать.

Заработало, но почему-то скорость исходящего в 2 раза меньше установленной скорости

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не обязательно, исход можно безболезненно полисить на игрессе. Попробуйте limit_method = hybrid, должно заработать.

Заработало, но почему-то скорость исходящего в 2 раза меньше установленной скорости

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для увеличения скорости исходящего трафика советую покрутить параметр policer_burst_ratio в сторону увеличения. Кроме того, учтите, что скорость при полисинге достигает равновесного значения намного позже, чем при шейпинге. Тестировать полисинг лучше с помощью передачи больших файлов.

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в принципе у же и сам разобрался, спасибо за инфу :) ещё один вопрос, а как сделать, чтобы скорость на локальные интерфейсы не резалась?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не совсем понял, что значит "на локальные интерфейсы", но подозреваю что это означает трафик от самого шейпера. Проще всего поставить большую скорость соответствующему IP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сервер маршрутизирует ещё несколько интерфейсов, eth0 (инет), eth1(локаль1) eth2(локаль2). Допустим надо чтобы трафик не шейпился между eth1 и eth2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вариант решения для CentOS

http://centos.alt.ru/?p=504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день.

 

Решили перевести бриджи на линукс и, соответственно, использовать tc (с помощью sc).

На данный момент сеть на серых адресах, масок /24 у нас примерно 540. Масок /16 около 40.

 

1. Есть ли более простой способ использовать sc в нашей ситуации, чем писать скрипт для перегруппировки всех IP в более мелкие маски?

 

2. Можно также при этом создать такие правила, чтобы одна скорость делилась на всю маску (возможно не генерируемые автоматически, а прописанные в скрипте/конфиге)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день.

 

Решили перевести бриджи на линукс и, соответственно, использовать tc (с помощью sc).

На данный момент сеть на серых адресах, масок /24 у нас примерно 540. Масок /16 около 40.

Я бы вообще подумал, окупится ли в этом случае миграция на Linux. Не достаточно ли просто переписать правила шейпинга на уже существующих мостах?

 

По-моему, при таких масштабах уже надо задумываться о каких-то фирменных решениях, например, Catalyst 6500 с sup720, если достаточно полисинга, или SCE 8000, если нужен более продвинутый QoS. sc -- это решение для небольшого провайдера, обслуживающего много юзеров, у каждого из которых один IP и одна полоса пропускания.

 

1. Есть ли более простой способ использовать sc в нашей ситуации, чем писать скрипт для перегруппировки всех IP в более мелкие маски?

Если речь идет о конфигурации с несколькими IP на класс, то нужно чтобы такие IP обслуживались одним и тем же шейпером. А каким образом трафик раскидывается по разным мостам и сколько всего должно быть классов обслуживания с гарантированной полосой? Наилучший вариант, когда на каждом шейпере можно создать правила для нескольких подсетей, а не для всех сразу. Нужно учитывать, что число классов и фильтров, одновременно существующих в памяти ядра, ограничено. Т.е. фильтров в каждой цепочке может быть не более 7ff (минус накладные расходы на построение хэшей), а классов -- не более fffe.

 

2. Можно также при этом создать такие правила, чтобы одна скорость делилась на всю маску (возможно не генерируемые автоматически, а прописанные в скрипте/конфиге)?

В сегодняшнем коде это можно реализовать достаточно просто, если маски у всех юзеров одинаковые (например, /28). Если нет, то возникает необходимость хранить эти маски (или списки secondary IP -- primary IP) в базе, что требует переписывания значительной части кода.

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На данный момент сеть на серых адресах, масок /24 у нас примерно 540. Масок /16 около 40.

Немного уточню: смысл в том, что данные маски не полностью забиты абонентами. Т.е. в каждой маске может быть не более 100 IP, например.

 

Насчёт шейпинга масок (одна скорость на всю маску) - у нас таких всего пара человек, т.е. они скорее исключение из правил.

 

Ну и такой вопрос: возможно ли разделить скрипт на 2 части для IN и OUT? Не будут ли тогда пересекаться классы?

Изменено пользователем G@riK

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На данный момент сеть на серых адресах, масок /24 у нас примерно 540. Масок /16 около 40.

Немного уточню: смысл в том, что данные маски не полностью забиты абонентами. Т.е. в каждой маске может быть не более 100 IP, например.

Если пользователи не разбросаны случайным образом во всем диапазоне /16, то проблем нет. В параметре network нужно указать подсети с такими масками, которые охватывают диапазоны занятых IP. Подсети в данном случае используются только для создания правил шейпинга, и к реальной маршрутизации никакого отношения не имеют.

 

Насчёт шейпинга масок (одна скорость на всю маску) - у нас таких всего пара человек, т.е. они скорее исключение из правил.

Тогда для таких юзеров проще сделать загрузку правил из отдельного скрипта.

 

Ну и такой вопрос: возможно ли разделить скрипт на 2 части для IN и OUT? Не будут ли тогда пересекаться классы?

Если это разделение нужно для создания классов с различными скоростями на upload/download, то проще ввести множитель между скоростями. Разделить скрипт довольно просто, т.к. правила для входящего и исходящего трафика создаются двумя отдельными вызовами функций. Номера классов у каждого интерфейса свои, поэтому они не пересекаются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ, будем пробовать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

День добрый.

 

Столкнулся с проблемой.

 

Часть конфига:

# Network interfaces
out_if = bond0
in_if = bond1

filter_method = u32
limit_method = shaping
network = 192.168.1.20/30

 

sc -v 2 -d 1 load

RTNETLINK answers: File exists
/sbin/tc qdisc add dev bond0 root handle 1: htb
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 100: u32 divisor 4
RTNETLINK answers: File exists
/sbin/tc qdisc add dev bond1 root handle 1: htb
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 100: u32 divisor 4

 

sc show
FILTERS:
filter parent 1: protocol ip pref 10 u32 
filter parent 1: protocol ip pref 10 u32 fh 100: ht divisor 4 
filter parent 1: protocol ip pref 10 u32 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 link 100:  (rule hit 3 success 0)
 match IP dst 192.168.1.20/30 (success 0 ) 
   hash mask 00000003 at 16 
filter parent 1: protocol ip pref 10 u32 fh 800::801 order 2049 key ht 800 bkt 0 link 100:  (rule hit 2 success 0)
 match IP dst 192.168.1.20/30 (success 0 ) 
   hash mask 00000003 at 16 
filter parent 1: protocol ip pref 30 u32 
filter parent 1: protocol ip pref 30 u32 fh 801: ht divisor 1 
filter parent 1: protocol ip pref 30 u32 fh 801::800 order 2048 key ht 801 bkt 0 terminal flowid ???  (rule hit 3 success 3) (success 3 ) 
police 0x4a rate 0bit burst 0b mtu 1b action drop overhead 0b 
ref 1 bind 1

Sent 358 bytes 3 pkts (dropped 3, overlimits 3) 
filter parent 1: protocol ip pref 30 u32 fh 801::801 order 2049 key ht 801 bkt 0 terminal flowid ???  (rule hit 0 success 0) (success 0 ) 
police 0x4c rate 0bit burst 0b mtu 1b action drop overhead 0b 
ref 1 bind 1

Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 
filter parent 1: protocol ip pref 10 u32 
filter parent 1: protocol ip pref 10 u32 fh 100: ht divisor 4 
filter parent 1: protocol ip pref 10 u32 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 link 100:  (rule hit 0 success 0)
 match IP src 192.168.1.20/30 (success 0 ) 
   hash mask 00000003 at 12 
filter parent 1: protocol ip pref 10 u32 fh 800::801 order 2049 key ht 800 bkt 0 link 100:  (rule hit 0 success 0)
 match IP src 192.168.1.20/30 (success 0 ) 
   hash mask 00000003 at 12 
filter parent 1: protocol ip pref 30 u32 
filter parent 1: protocol ip pref 30 u32 fh 801: ht divisor 1 
filter parent 1: protocol ip pref 30 u32 fh 801::800 order 2048 key ht 801 bkt 0 terminal flowid ???  (rule hit 0 success 0) (success 0 ) 
police 0x49 rate 0bit burst 0b mtu 1b action drop overhead 0b 
ref 1 bind 1

Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 
filter parent 1: protocol ip pref 30 u32 fh 801::801 order 2049 key ht 801 bkt 0 terminal flowid ???  (rule hit 0 success 0) (success 0 ) 
police 0x4b rate 0bit burst 0b mtu 1b action drop overhead 0b 
ref 1 bind 1

Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 

CLASSES:

QDISCS:
qdisc htb 1: root refcnt 2 r2q 10 default 0 direct_packets_stat 6 ver 3.17
Sent 360 bytes 6 pkt (dropped 3, overlimits 0 requeues 0) 
backlog 0b 0p requeues 0 
qdisc htb 1: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 ver 3.17
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
backlog 0b 0p requeues 0

 

Добавляю IP:

sc dbadd 192.168.1.22 10Mibit

 

Синхронизую:

sc sync
RTNETLINK answers: Invalid argument
We have an error talking to the kernel
Command failed (null):3

 

С выводом ошибок:

sc -v 2 -d 1 load
RTNETLINK answers: File exists
/sbin/tc qdisc add dev bond0 root handle 1: htb
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 100: u32 divisor 4
RTNETLINK answers: File exists
/sbin/tc qdisc add dev bond1 root handle 1: htb
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 100: u32 divisor 4
RTNETLINK answers: Invalid argument
We have an error talking to the kernel
/sbin/tc filter replace dev bond1 parent 1: pref 20 handle 100:16:800 u32 ht 100:16: match ip dst 192.168.1.22 flowid 1:4
RTNETLINK answers: Invalid argument
We have an error talking to the kernel
/sbin/tc filter replace dev bond0 parent 1: pref 20 handle 100:16:800 u32 ht 100:16: match ip src 192.168.1.22 flowid 1:4

 

Не подскажите в чем тут проблема может быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На интерфейсах уже по каким-то причинам была создана корневая дисциплина. Чтобы ее удалить и загрузить правила заново, надо выполнить sc restart.

sc sync нельзя запускать до sc load.

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понятно, попробую

 

На данный момент разбили наши IP по маске /30.

Прописал их в network и filter_network в конфиге.

 

Далее делаю сброс:

sc reset

 

Затем:

sc -v 2 -d 1 load

 

В итоге получаю такие ошибки (сюда привожу маленькую часть):

RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 800: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip src 192.168.6.66/30 hashkey mask 0x00000003 at 12 link 1155:
Illegal filter ID
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 1156: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip src 192.168.6.118/30 hashkey mask 0x00000003 at 12 link 1156:
Illegal filter ID
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 1157: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip src 192.168.6.123/30 hashkey mask 0x00000003 at 12 link 1157:
Illegal filter ID
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 1158: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip src 192.168.6.133/30 hashkey mask 0x00000003 at 12 link 1158:
Illegal filter ID
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 handle 1159: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip src 192.168.9.7/30 hashkey mask 0x00000003 at 12 link 1159:
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond0 parent 1:0 protocol ip pref 30 u32 match u32 0 0 at 0 police mtu 1 action drop
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 800: u32 divisor 4

**************

/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 1155: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip dst 192.168.6.66/30 hashkey mask 0x00000003 at 16 link 1155:
Illegal filter ID
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 1156: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip dst 192.168.6.118/30 hashkey mask 0x00000003 at 16 link 1156:
Illegal filter ID
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 1157: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip dst 192.168.6.123/30 hashkey mask 0x00000003 at 16 link 1157:
Illegal filter ID
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 1158: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip dst 192.168.6.133/30 hashkey mask 0x00000003 at 16 link 1158:
Illegal filter ID
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 handle 1159: u32 divisor 4
Illegal "link"
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 10 u32 ht 800:: match ip dst 192.168.9.7/30 hashkey mask 0x00000003 at 16 link 1159:
RTNETLINK answers: File exists
We have an error talking to the kernel
/sbin/tc filter add dev bond1 parent 1:0 protocol ip pref 30 u32 match u32 0 0 at 0 police mtu 1 action drop

 

Причем этой командой загружается больше масок, чем при выполнении load или reload. Но все так и не загрузились.

Как такие ошибки можно отловить и пофиксить?

 

UPD: почитал в инете, пишут что это ограничение ядра. Буду искать информацию по увеличению данного значения.

Изменено пользователем G@riK

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

G@riK, не хотите попробовать ipfw+dummynet for Linux? Отлично работает и лишен всех этих недостатков.

Работает чуть более чем полностью стабильно. Прокачивает 2 Гбита.

Последние версии здесь http://info.iet.unipi.it/~marta/dummynet/

Документация здесь http://info.iet.unipi.it/~luigi/dummynet/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Уже как-то пробовали :)

Всё таки хотим сделать это на tc.

 

Разбили на более крупные маски /28, всего масок оказалось 1796.

При загрузке их с помощью

sc -v 2 -d 1 load

получаем загруженными все маски

filter parent 1: protocol ip pref 10 u32 fh 800::eff order 3839 key ht 800 bkt 0 link 7ff:  (rule hit 12 success 0)
 match IP dst 192.168.1.240/28 (success 0 ) 
   hash mask 0000000f at 16 
filter parent 1: protocol ip pref 10 u32 fh 800::f00 order 3840 key ht 800 bkt 0 link 800:  (rule hit 12 success 0)
 match IP dst 192.168.2.240/28 (success 0 ) 
   hash mask 0000000f at 16 
filter parent 1: protocol ip pref 10 u32 fh 800::f01 order 3841 key ht 800 bkt 0 link 801:  (rule hit 12 success 0)
 match IP dst 192.168.6.64/28 (success 0 ) 
   hash mask 0000000f at 16 
filter parent 1: protocol ip pref 10 u32 fh 800::f02 order 3842 key ht 800 bkt 0 link 802:  (rule hit 12 success 0)
 match IP dst 192.168.6.112/28 (success 0 ) 
   hash mask 0000000f at 16 
filter parent 1: protocol ip pref 10 u32 fh 800::f03 order 3843 key ht 800 bkt 0 link 803:  (rule hit 12 success 0)
 match IP dst 192.168.9.0/28 (success 0 ) 
   hash mask 0000000f at 16

 

а если так:

sc restart (или sc load)

то последней маской получается:

RTNETLINK answers: File exists
We have an error talking to the kernel
Command failed (null):3587
******
filter parent 1: protocol ip pref 10 u32 fh 800::eff order 3839 key ht 800 bkt 0 link 7ff:  (rule hit 12 success 0)
 match IP dst 192.168.1.240/28 (success 0 ) 
   hash mask 0000000f at 16 

Т.е. последний link 7ff = 2047, остальные записи с link 800,801,802,803 пропали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для фильтров нужно указывать как можно более крупные подсети. Например 10.0.0.0/16 вместо сотен подсетей по /30. 7ff хэш-фильтров -- это безумие какое-то. Зачем вам эти 40 сетей по /16? Сделайте несколько по /24 -- /22, если сети заполнены несколькими сотнями юзеров.

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.