ALT Linux sysadmins discussion
 help / color / mirror / Atom feed
* [Sysadmins] tc
@ 2007-08-21 20:28 Anton Gorlov
  2007-08-22  5:00 ` Denis Klimov
  0 siblings, 1 reply; 6+ messages in thread
From: Anton Gorlov @ 2007-08-21 20:28 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

Ммм..как бы средстьвами tc+iptables организовать такую вещь:
Здача сделать шейпер.
Что нужно от него - есть улиенты которых нужно пускать в инет на 
скорости 64К скажем а во внутренюю сеть со скоростью 128К (всего 
получается 192К) и клиенты которых нужно  пускать как 128/128 (256 всего).

Сейчас это сделано на базе bsd...но хочется избавиться от...
Сейчас оно сделано так - приходит на 1 интерфейс, найтится шейпится из 
сети скажем 10.10.65.xx в 10.10.165.xx (ipnat+ipfw+pipe)
Ъотя от ната вообще было бы интересно избавиться..то ест ьскажем у 
клиента шлюзомстоит  ип 1 интерфейса шейпера..а шейпер уже отдлаёт 
пакетики дальше только зашейпив.


Как бы такое сделать средствами tc?

-- 
   np: silence


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Sysadmins] tc
  2007-08-21 20:28 [Sysadmins] tc Anton Gorlov
@ 2007-08-22  5:00 ` Denis Klimov
  2007-08-22  5:41   ` Anton Gorlov
  0 siblings, 1 reply; 6+ messages in thread
From: Denis Klimov @ 2007-08-22  5:00 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

Если я правильно понял и ip клиентов 10.10.65.xx, внутреняя сеть
10.10.165.xx то применяя htb можно сделать так:

tc qdisc add dev eth0 root handle 1: htb;
# Задаем общую скорость
tc class add dev eth0 parent 1: classid 1:1 htb rate 100M;

#Даем 128К из внутренней сети, нужно повторить для каждого клиента, 
#увеличивая classid 1:x в первой строке и соответственно flowid 1:х во второй. IP клиента в данном примере 10.10.65.123
tc class add dev eth0 parent 1:1 classid 1:1 htb rate 128kbit;
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.10.65.123 match ip src 10.10.165.0/24 flowid 1:1;


#Повторяем для каждого клиента, которому надо дать 64К инета, продолжая увеличивать classid и flowid
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 64kbit;
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.10.65.123 flowid 1:10;

Аналогично для клиентов, которым надо дать инет 128К

Для того чтобы избавиться от ната (который для взаимодействия с
внутренней сетью), необходимо чтобы и у машин в этой внутренней сети
были прописаны правильные маршруты.

On Wed, 22 Aug 2007 00:28:42 +0400 Anton Gorlov wrote:

> Ммм..как бы средстьвами tc+iptables организовать такую вещь:
> Здача сделать шейпер.
> Что нужно от него - есть улиенты которых нужно пускать в инет на 
> скорости 64К скажем а во внутренюю сеть со скоростью 128К (всего 
> получается 192К) и клиенты которых нужно  пускать как 128/128 (256 всего).
> 
> Сейчас это сделано на базе bsd...но хочется избавиться от...
> Сейчас оно сделано так - приходит на 1 интерфейс, найтится шейпится из 
> сети скажем 10.10.65.xx в 10.10.165.xx (ipnat+ipfw+pipe)
> Ъотя от ната вообще было бы интересно избавиться..то ест ьскажем у 
> клиента шлюзомстоит  ип 1 интерфейса шейпера..а шейпер уже отдлаёт 
> пакетики дальше только зашейпив.
> 
> 
> Как бы такое сделать средствами tc?
> 
> -- 
>    np: silence
> _______________________________________________
> Sysadmins mailing list
> Sysadmins@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/sysadmins

--
Denis Klimov 
zver


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Sysadmins] tc
  2007-08-22  5:00 ` Denis Klimov
@ 2007-08-22  5:41   ` Anton Gorlov
  2007-08-23  6:11     ` Anton Gorlov
  0 siblings, 1 reply; 6+ messages in thread
From: Anton Gorlov @ 2007-08-22  5:41 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

Denis Klimov пишет:
> Если я правильно понял и ip клиентов 10.10.65.xx, внутреняя сеть
> 10.10.165.xx то применяя htb можно сделать так:
Не..внутренняя сеть имеет реальные IP-адресса.. а клиенты и реальные и 
серые.
Для чего чесно говоря они  сейчас натятся из 1 серого ипишника в другой 
и потмо ещё раз натятся на циске я чесно говоря не совсем понимаю..всё 
было украдено до нас..



> tc qdisc add dev eth0 root handle 1: htb;
> # Задаем общую скорость
> tc class add dev eth0 parent 1: classid 1:1 htb rate 100M;
> 
> #Даем 128К из внутренней сети, нужно повторить для каждого клиента, 
> #увеличивая classid 1:x в первой строке и соответственно flowid 1:х во второй. IP клиента в данном примере 10.10.65.123
> tc class add dev eth0 parent 1:1 classid 1:1 htb rate 128kbit;
> tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.10.65.123 match ip src 10.10.165.0/24 flowid 1:1;
Ммм..а если клиентов от 1К и более? писать тысячу правил представляется 
не совсем масштабируемым решением имхо.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Sysadmins] tc
  2007-08-22  5:41   ` Anton Gorlov
@ 2007-08-23  6:11     ` Anton Gorlov
  2007-08-23  6:55       ` Dmytro O. Redchuk
  0 siblings, 1 reply; 6+ messages in thread
From: Anton Gorlov @ 2007-08-23  6:11 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

Anton Gorlov пишет:

>> #Даем 128К из внутренней сети, нужно повторить для каждого клиента, 
>> #увеличивая classid 1:x в первой строке и соответственно flowid 1:х во второй. IP клиента в данном примере 10.10.65.123
>> tc class add dev eth0 parent 1:1 classid 1:1 htb rate 128kbit;
>> tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.10.65.123 match ip src 10.10.165.0/24 flowid 1:1;
> Ммм..а если клиентов от 1К и более? писать тысячу правил представляется 
> не совсем масштабируемым решением имхо.

Как бы всё таки избавиться от того что бы не прпоисывать каждого клиента 
по отдельности.. Нет - забить скриптом конечно не проблема.. но не 
аккуратненько всё же.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Sysadmins] tc
  2007-08-23  6:11     ` Anton Gorlov
@ 2007-08-23  6:55       ` Dmytro O. Redchuk
  2007-08-23  8:46         ` Dmytro O. Redchuk
  0 siblings, 1 reply; 6+ messages in thread
From: Dmytro O. Redchuk @ 2007-08-23  6:55 UTC (permalink / raw)
  To: Anton Gorlov; +Cc: ALT Linux sysadmin discuss

On Thu, Aug 23, 2007 at 10:11:12AM +0400, Anton Gorlov wrote:
> Anton Gorlov пишет:
> 
> >> #Даем 128К из внутренней сети, нужно повторить для каждого клиента, 
> >> #увеличивая classid 1:x в первой строке и соответственно flowid 1:х во второй. IP клиента в данном примере 10.10.65.123
> >> tc class add dev eth0 parent 1:1 classid 1:1 htb rate 128kbit;
> >> tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.10.65.123 match ip src 10.10.165.0/24 flowid 1:1;
> > Ммм..а если клиентов от 1К и более? писать тысячу правил представляется 
> > не совсем масштабируемым решением имхо.
> 
> Как бы всё таки избавиться от того что бы не прпоисывать каждого клиента 
> по отдельности.. Нет - забить скриптом конечно не проблема.. но не 
> аккуратненько всё же.

Я бы "забил скриптом" хэш и в каждую ячейку tc filter на класс... Это
тоже, конечно, ручная работа, но такое скриптуется приятнее и работает
быстрее. Особенно "если клиентов от 1К и более".

Но это не то, о чём вы говорите/спрашиваете.

-- 
  _,-=._              /|_/|
  `-.}   `=._,.-=-._.,  @ @._,
     `._ _,-.   )      _,.-'
        `    G.m-"^m`m'        Dmytro O. Redchuk



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Sysadmins] tc
  2007-08-23  6:55       ` Dmytro O. Redchuk
@ 2007-08-23  8:46         ` Dmytro O. Redchuk
  0 siblings, 0 replies; 6+ messages in thread
From: Dmytro O. Redchuk @ 2007-08-23  8:46 UTC (permalink / raw)
  To: Anton Gorlov; +Cc: ALT Linux sysadmin discuss

On Thu, Aug 23, 2007 at 10:58:09AM +0400, Anton Gorlov wrote:
> Dmytro O. Redchuk пишет:
> 
> >Я бы "забил скриптом" хэш и в каждую 
> >ячейку tc filter на класс... Это
> >тоже, конечно, ручная работа, но такое 
> >скриптуется приятнее и работает
> >быстрее. Особенно "если клиентов от 1К и 
> >более".
> >Но это не то, о чём вы 
> >говорите/спрашиваете.
> то есть скриптмо в цикле генерить 
> ипишники  клиентов и с каждым ипишником 
> увеличивать на шаг
> сlassid 1:x и соответственно flowid 1:х?

Ну примерно, только...

Я имел в виду хеши самого tc (пример тут:
http://lartc.org/howto/lartc.adv-filter.hashing.html)

Я выгрызу кой-чего из своих скриптов, постараюсь покоцать и прокомментировать
"более-менее". Но сначала прочитайте (если ещё не...) по той ссылке, чтобы
было понятнее.

Идея такая -- создаём на интерфейсе таблицу (хэш) фильтров на нужное
количество сетей /24, каждая ячейка таблицы будет содержать "линк"
(перебрасывающий фильтр) на другую таблицу. Эта другая таблица будет
размером 256 ячеек, то есть на всю определённую сеть /24, каждая ячейка
будет содержать фильтр, перебрасывающий на нужный класс (для этого
айпишника/клиента).

##########################################################################

### Сначала создаём корневую дисциплину:

#
#
# root HTB:
echo -e "\n\n#\n# Root qdisc and class:\n#\n"
$tc qdisc add dev $DEV root handle 1: htb default 90
 
# root class:
$tc class add dev $DEV parent 1:0 classid 1:1 htb rate 100Mbit


### создаём хеш на две сети /24 (скажем, 192.168.1.0 и 192.168.2.0):

# root filter:
$tc filter add dev $DEV parent 1:1 prio 10 protocol ip u32

### divisor 2 -- хеш на две ячейки:
$tc filter add dev $DEV parent 1:1 protocol ip prio 10 handle 8: u32 divisor 2

### создаём два хеша -- для каждой сети /24:
## для 192.168.1.0:
$tc filter add dev $DEV parent 1:1 prio 10 handle 1: protocol ip u32 divisor 256
## для 192.168.2.0:
$tc filter add dev $DEV parent 1:1 prio 10 handle 2: protocol ip u32 divisor 256

/***

Для каждого клиента (не обязательно это делать для каждого айпишника,
можно для групп айпишников) нужно создать класс. В каждую ячейку этих двух
хешей нужно вписать фильтр, перебрасывающий в этот класс.

***/

### В конце-концов, нужно в "верхний" хеш на две ячейки записать фильтры,
### перебрасывающие пакет сразу в нужную ячейку нужной сети:

$tc filter add dev $DEV parent 1:1 protocol ip prio 10 \
                u32 ht 8:0: \
                match ip dst 192.168.1.0/24 \
                hashkey mask 0x000000ff at 16 \
                link 1:

$tc filter add dev $DEV parent 1:1 protocol ip prio 10 \
                u32 ht 8:1: \
                match ip dst 192.168.2.0/24 \
                hashkey mask 0x000000ff at 16 \
                link 2:


##########################################################################

:-) Где-то так.

Всё это кажется сложным, возможно.

У меня всё это работает уже для 13-ти сетей /24 -- кучка скриптов, "базка" с
соответствием классов айпишникам, параметры этих классов... Фактически,
нужно где-то указать, в какой класс кидать данный айпишник -- а если
каждому айпишнику давать свой класс, то задача упрощается. Возможно :-)

Да, сложновато, это ж только "направление"  -- но масштабируется
замечательно (в плане быстродействия).



PS. Интересно, кто как иначе крутится с такими вещами...

-- 
  _,-=._              /|_/|
  `-.}   `=._,.-=-._.,  @ @._,
     `._ _,-.   )      _,.-'
        `    G.m-"^m`m'        Dmytro O. Redchuk



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-08-23  8:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-08-21 20:28 [Sysadmins] tc Anton Gorlov
2007-08-22  5:00 ` Denis Klimov
2007-08-22  5:41   ` Anton Gorlov
2007-08-23  6:11     ` Anton Gorlov
2007-08-23  6:55       ` Dmytro O. Redchuk
2007-08-23  8:46         ` Dmytro O. Redchuk

ALT Linux sysadmins discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/sysadmins/0 sysadmins/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 sysadmins sysadmins/ http://lore.altlinux.org/sysadmins \
		sysadmins@lists.altlinux.org sysadmins@lists.altlinux.ru sysadmins@lists.altlinux.com
	public-inbox-index sysadmins

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.sysadmins


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git