IPFW3 + pipe + queue + sched

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-21 12:19:02

Всем доброе время суток!
После длительного простоя с разбирательством по данному вопросу возобновляю раскопки
В теме http://forum.lissyara.su/viewtopic.php?f=3&t=12525 я описывал свой конфиг, но после некоторого времени решил облегчить жизнь серваку и себе, переписав правила на более-менее новый уровень.
Из

Код: Выделить всё

# ipfw -at list
00100   0     0                         allow ip from any to any via lo0
00200 105  9849 Sat Nov 15 16:03:02 2008 count ip from 10.0.0.0/24 to any
00300   0     0                         deny ip from any to 127.0.0.0/8
00400   0     0                         deny ip from 127.0.0.0/8 to any
00500   0     0                         deny ip from 10.0.0.0/24 to any in via rl0
00600   0     0                         deny ip from 192.168.1.0/24 to any in via nfe0
00700   0     0                         deny ip from any to 10.0.0.0/8 in via rl0
00800   0     0                         deny ip from any to 172.16.0.0/12 in via rl0
00900   0     0                         deny ip from any to 0.0.0.0/8 in via rl0
01000   0     0                         deny ip from any to 169.254.0.0/16 in via rl0
01100   4   112 Sat Nov 15 16:01:30 2008 deny ip from any to 224.0.0.0/4 in via rl0
01200   0     0                         deny ip from any to 240.0.0.0/4 in via rl0
01300   0     0                         deny icmp from any to any frag
01400   0     0                         deny log icmp from any to 255.255.255.255 in via rl0
01500   0     0                         deny log icmp from any to 255.255.255.255 out via rl0
01600  30  1384 Sat Nov 15 16:02:34 2008 divert 8668 ip from 10.0.0.0/24 to any out via rl0
01700  22  2408 Sat Nov 15 16:02:33 2008 divert 8668 ip from any to 192.168.1.18 in via rl0
01800   0     0                         deny ip from 10.0.0.0/8 to any out via rl0
01900   0     0                         deny ip from 172.16.0.0/12 to any out via rl0
02000   0     0                         deny ip from 0.0.0.0/8 to any out via rl0
02100   0     0                         deny ip from 169.254.0.0/16 to any out via rl0
02200   0     0                         deny ip from 224.0.0.0/4 to any out via rl0
02300   0     0                         deny ip from 240.0.0.0/4 to any out via rl0
02400   0     0                         allow icmp from any to any icmptypes 0,8,11
02500   0     0                         pipe 100 ip from 91.192.153.82 20,21 to 10.0.0.0/24
02600   0     0                         pipe 1000 ip from 10.0.0.0/24 to 91.192.153.82 dst-port 20,21
02700  22  2408 Sat Nov 15 16:02:33 2008 pipe 1 ip from not 10.0.0.0/24 to table(1) out
02800  39  2485 Sat Nov 15 16:03:01 2008 pipe 2 ip from table(1) to not me in
02900   0     0                         pipe 3 ip from not 10.0.0.0/24 to table(2)
03000   0     0                         pipe 4 ip from table(2) to not me
03100   0     0                         pipe 5 ip from not 10.0.0.0/24 to table(3)
03200   0     0                         pipe 6 ip from table(3) to not me
03300   0     0                         pipe 7 ip from not 10.0.0.0/24 to table(4)
03400   0     0                         pipe 8 ip from table(4) to not me
03500   0     0                         pipe 9 ip from not 10.0.0.0/24 to table(5)
03600   0     0                         pipe 10 ip from table(5) to not me
03700 140 13564 Sat Nov 15 16:03:02 2008 allow tcp from any to any established
03800   0     0                         allow udp from any to 192.168.1.18 dst-port 53 in via rl0
03900   0     0                         allow udp from 192.168.1.18 53 to any out via rl0
04000   0     0                         allow udp from any 53 to 192.168.1.18 in via rl0
04100   0     0                         allow udp from 192.168.1.18 to any dst-port 53 out via rl0
04200   0     0                         allow udp from any to any dst-port 123 via rl0
04300   0     0                         allow tcp from any to 192.168.1.18 dst-port 53 in via rl0 setup
04400   0     0                         allow tcp from any to 192.168.1.18 dst-port 80 via rl0
04500   0     0                         allow tcp from any to 192.168.1.18 dst-port 22 in via rl0 setup
04600   0     0                         allow tcp from any to 192.168.1.18 dst-port 110,25 via rl0
04700   0     0                         allow tcp from any to 192.168.1.18 dst-port 49152-65535 via rl0
04800   0     0                         allow udp from any 27000-27025 to 10.0.0.0/24 in via rl0
04900   0     0                         allow udp from any 27000-27025 to 10.0.0.0/24 out via nfe0
05000   0     0                         allow udp from 10.0.0.0/24 to any dst-port 27000-27025 in via nfe0
05100   0     0                         allow udp from 192.168.1.18 to any dst-port 27000-27025 out via rl0
05200   0     0                         deny log tcp from any to 192.168.1.18 in via rl0 setup
05300   9  1101 Sat Nov 15 16:03:01 2008 allow ip from 10.0.0.0/24 to 10.0.0.0/24 in via nfe0
05400   0     0                         allow ip from 10.0.0.0/24 to 10.0.0.0/24 out via nfe0
05500   0     0                         allow ip from 192.168.1.18 to any out xmit rl0
05600   0     0                         allow tcp from table(0) to not 10.0.0.0/24 in via nfe0 setup
05700   0     0                         deny log ip from any to any
65535   0     0                         deny ip from any to any
Превратилось в лебедя

Код: Выделить всё

#ipfw show
00001   3347837  2352255511 reass ip from any to any in
00002     11491      949435 allow ip from any to any via lo0
00003        68        7601 deny ip from any to not 10.60.77.51 in via vr0
00011         0           0 allow tcp from any to 10.10.10.10 dst-port 9750 in via vr0 setup
00100         0           0 deny ip from any to 127.0.0.0/8
00101         0           0 deny ip from 127.0.0.0/8 to any
00102       167       17454 deny ip from table(99) to any in via vr0
00103         0           0 deny tcp from 10.0.0.8 to not me dst-port 25 in via em0
00104         0           0 deny log logamount 100 tcp from any to not me dst-port 25 in via em0
00105         0           0 deny ip from table(66) to any in via em0
00150         0           0 deny ip from table(71) to any in
00151         0           0 fwd 10.0.0.1,80 tcp from not table(100) to not me dst-port 80,443 in via em0 setup limit src-addr 1
00152        23         736 deny ip from not table(100) to not me in via em0
00153         0           0 deny icmp from any to any frag
00154         0           0 deny icmp from any to any in icmptypes 5,9,13,14,15,16,17
00155         0           0 reject tcp from any to any tcpflags syn,fin,ack,psh,rst,urg
00156         0           0 reject tcp from any to any tcpflags !syn,!fin,!ack,!psh,!rst,!urg
00157         0           0 reject tcp from any to any not established tcpflags fin
00158         0           0 reject log logamount 100 ip from any to any not verrevpath in
00159         0           0 deny icmp from any to 255.255.255.255 via vr0
00300   1321286   185609157 nat 1 ip from 10.0.0.0/24 to any out via vr0
00301   1968685  2140289466 nat 1 ip from any to 10.60.77.51 in via vr0
00400         0           0 deny ip from not 10.60.77.51 to any out via vr0
00402     23133     1959586 allow icmp from any to any icmptypes 0,3,4,8,10,11,30
00700   5938084  4453861894 allow tcp from any to any established
03000        28        2127 allow udp from any to 10.60.77.51 dst-port 53 in via vr0
03001      4986     1270266 allow udp from any 53 to 10.60.77.51 in via vr0
03002         6         240 allow tcp from any to 10.60.77.51 dst-port 53 in via vr0 setup
03300      3596      177496 allow tcp from any to 10.60.77.51 dst-port 20,21,50000-60000,25,465,110,995,143,993,80,443,8000,10011,30033 in via vr0 setup
03301     10764      472837 allow udp from any to 10.60.77.51 dst-port 123,6277,9987 in via vr0
03600         1          48 allow log logamount 100 tcp from any to 10.60.77.51 dst-port 22 in via vr0 setup
06000         0           0 deny ip from any to me ipoptions ssrr,lsrr,rr,ts in via vr0
06001     12269      615028 deny tcp from any to 10.60.77.51 in via vr0
08000    197837   108794044 allow ip from 10.60.77.51 to any out xmit vr0
09000         0           0 deny log logamount 100 tcp from not 80.78.32.0/19,86.111.65.5 to 10.0.0.65 dst-port 3389
65535 128030905 92895767734 allow ip from any to any
Остался вот только очень важный момент в новой версии IPFW - scheduller!
Что с ним делать и куда лепить эти самые sched не понятно вообще!!! :st:

На сколько я понял из мана

Код: Выделить всё

     In practice, pipes can be used to set hard limits to the bandwidth that a
     flow can use, whereas queues can be used to determine how different flows
     share the available bandwidth.

     A graphical representation of the binding of queues, flows, schedulers
     and links is below.

                            (flow_mask|sched_mask)  sched_mask
                    +---------+   weight Wx  +-------------+
                    |         |->-[flow]-->--|             |-+
               -->--| QUEUE x |   ...        |             | |
                    |         |->-[flow]-->--| SCHEDuler N | |
                    +---------+              |             | |
                        ...                  |             +--[LINK N]-->--
                    +---------+   weight Wy  |             | +--[LINK N]-->--
                    |         |->-[flow]-->--|             | |
               -->--| QUEUE y |   ...        |             | |
                    |         |->-[flow]-->--|             | |
                    +---------+              +-------------+ |
                                               +-------------+
Здесь LINK N и есть PIPE N и в него добавляются SCHED N в которые в свою очередь добавляются QUEUE N.
Из текста понятно что PIPE используют для жесткого ограничения скорости, а QUEUE - для разделения имеющейся скорости между клиентами.
А как и где использовать SCHED вообще не понятно!!! :st:
Если кто разобрался - поделитесь знаниями, буду очень признателен!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-21 12:28:33

Забыл сами трубы выложить)

Код: Выделить всё

00201         0           0 set 1 pipe 1 ip from any to any dst-ip table(100,32) out
00202         0           0 set 1 pipe 2 ip from any to any src-ip table(100,32) in
00203         0           0 set 1 pipe 3 ip from any to any dst-ip table(100,64) out
00204         0           0 set 1 pipe 4 ip from any to any src-ip table(100,64) in
00205         0           0 set 1 pipe 5 ip from any to any dst-ip table(100,128) out
00206         0           0 set 1 pipe 6 ip from any to any src-ip table(100,128) in
00207         0           0 set 1 pipe 7 ip from any to any dst-ip table(100,256) out
00208         0           0 set 1 pipe 8 ip from any to any src-ip table(100,256) in
00209         0           0 set 1 pipe 9 ip from any to any dst-ip table(100,320) out
00210         0           0 set 1 pipe 10 ip from any to any src-ip table(100,320) in
00211         0           0 set 1 pipe 11 ip from any to any dst-ip table(100,512) out
00212         0           0 set 1 pipe 12 ip from any to any src-ip table(100,512) in
00213         0           0 set 1 pipe 13 ip from any to any dst-ip table(100,640) out
00214         0           0 set 1 pipe 14 ip from any to any src-ip table(100,640) in
00215         0           0 set 1 pipe 15 ip from any to any dst-ip table(100,1024) out
00216         0           0 set 1 pipe 16 ip from any to any src-ip table(100,1024) in
00217        49        7839 set 1 pipe 17 ip from any to any dst-ip table(100,2048) out
00218        55       16304 set 1 pipe 18 ip from any to any src-ip table(100,2048) in
00219         0           0 set 1 pipe 19 ip from any to any dst-ip table(100,4096) out
00220         0           0 set 1 pipe 20 ip from any to any src-ip table(100,4096) in
00221      8611     9378012 set 1 pipe 21 ip from any to any dst-ip table(100,5120) out
00222      8303     4770352 set 1 pipe 22 ip from any to any src-ip table(100,5120) in
00223         0           0 set 1 pipe 23 ip from any to any dst-ip table(100,10240) out
00224         0           0 set 1 pipe 24 ip from any to any src-ip table(100,10240) in
00225         0           0 set 1 pipe 25 ip from any to any dst-ip table(100,20480) out
00226         0           0 set 1 pipe 26 ip from any to any src-ip table(100,20480) in
00227     21022    20947230 set 1 pipe 27 ip from any to any dst-ip table(100,30720) out
00228     16882     1562437 set 1 pipe 28 ip from any to any src-ip table(100,30720) in
00229         0           0 set 1 pipe 29 ip from any to any dst-ip table(100,40960) out
00230         0           0 set 1 pipe 30 ip from any to any src-ip table(100,40960) in
00231         0           0 set 1 pipe 21 ip from any to any dst-ip table(100,51200) out
00232         0           0 set 1 pipe 32 ip from any to any src-ip table(100,51200) in
00233      1267     1479790 set 1 pipe 33 ip from any to any dst-ip table(100,102400) out
00234       819       74589 set 1 pipe 34 ip from any to any src-ip table(100,102400) in

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-21 13:58:11

Буду рассуждать сам вслух раз уж никто не знает, может подтолкну себе и остальных к правильным мыслям!)
При настройке данной связки, имелось в виду что каждому клиенту из таблицы(table(100)) дается скорость в соответствии с аргументом в таблице

Код: Выделить всё

#ipfw table 100 list
10.0.0.6/32 10240
10.0.0.8/32 30720
10.0.0.11/32 5120
10.0.0.17/32 2048
10.0.0.40/32 5120
10.0.0.62/32 5120
10.0.0.115/32 10240
То есть трубы строились таким образом

Код: Выделить всё

############### USERS 5Mbit/s ###############
${FwPipe} 21 config bw 5M queue 40 weight 100 delay 3ms gred 0.002/10/20/0.1 ${DST_MASK}
${FwPipe} 22 config bw 5M queue 40 weight 100 delay 3ms gred 0.002/10/20/0.1 ${SRC_MASK}

${FwCMD} add 221 set 1 pipe 21 dst-ip table\(100\),5120 out
${FwCMD} add 222 set 1 pipe 22 src-ip table\(100\),5120 in
И при таком подходе появляются дефолтные sched'ы

Код: Выделить всё

00021:   5.000 Mbit/s    3 ms burst 0
 sched 21 type WF2Q+ flags 0x0 0 buckets 0 active
00022:   5.000 Mbit/s    3 ms burst 0
 sched 22 type WF2Q+ flags 0x0 0 buckets 0 active
Ну так вот вопрос:
Зачем они нужны и что с ними можно делать(в плане улучшения шейпинга и т.д и т.п.)?

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-23 23:19:40

Спустя некоторое время, я так и не понял зачем нужны эти шедуллеры, что с ними делать и куда прикручивать!
Но это еще не конец!
Продолжение следует...

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-23 23:37:17

Вот продолжаю играться

Код: Выделить всё

ipfw pipe 27 config bw 30M queue 60 weight 10 mask dst-ip 0xffffffff sched 27 type QFQ gred 0.002/10/30/0.1
ipfw pipe 28 config bw 30M queue 60 weight 10 mask src-ip 0xffffffff sched 28 type QFQ gred 0.002/10/30/0.1
ipfw sched 27 config type QFQ
ipfw sched 28 config type QFQ

ipfw add pipe 27 dst-ip table\(100\),30720 out
ipfw add pipe 28 src-ip table\(100\),30720 in

Код: Выделить всё

#ipfw pipe list 27-28
00027:  30.000 Mbit/s    0 ms burst 0
q131099  60 sl. 1 flows (1 buckets) sched 27 weight 10 lmax 1500 pri 0
         GRED w_q 0.001999 min_th 10 max_th 30 max_p 0.099991
 sched 65563 type FIFO flags 0x1 1024 buckets 0 active
    mask:  0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
00028:  30.000 Mbit/s    0 ms burst 0
q131100  60 sl. 0 flows (1 buckets) sched 28 weight 10 lmax 1500 pri 0
         GRED w_q 0.001999 min_th 10 max_th 30 max_p 0.099991
 sched 65564 type FIFO flags 0x1 1024 buckets 0 active
    mask:  0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp

Код: Выделить всё

#ipfw sched list 27-28
00027:  30.000 Mbit/s    0 ms burst 0
 sched 27 type QFQ flags 0x0 0 buckets 1 active
  0 ip           0.0.0.0/0             0.0.0.0/0       55    68467  0    0   0
00028:  30.000 Mbit/s    0 ms burst 0
 sched 28 type QFQ flags 0x0 0 buckets 1 active
  0 ip           0.0.0.0/0             0.0.0.0/0       71     7213  0    0   0
Выходя из схемы в мане получилось так
есть труба(канал) 30М и весь трафик рулит 1 шедуллер (на вход и выход отдельные соответственно) и при этом труба настраивалась с маской - на каждого клиента по трубе в 30М, а шедуллер 1 на всех
Чет я не въеду нафига эти шедуллеры вообще!? :st:

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение hizel » 2011-10-24 8:24:03

прослушайте презентацию Луиджи http://www.youtube.com/watch?v=r8vBmybeKlE , там есть субтитры
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

harmless
лейтенант
Сообщения: 719
Зарегистрирован: 2007-08-23 10:56:51
Откуда: Украина, г. Киев, г. Белая Церковь
Контактная информация:

Re: IPFW3 + pipe + queue + sched

Непрочитанное сообщение harmless » 2011-10-24 15:10:47

hizel писал(а):прослушайте презентацию Луиджи http://www.youtube.com/watch?v=r8vBmybeKlE , там есть субтитры
Исходя из рассказа Луиджи:
Шедуллеры - это планировщики очередей(queue) в трубах(линках они же pipe).
Что я понял - так это то что если раздавать клиентам каналы по 1мб, а не 1мб на всех, то шедуллеры явно указывать не нужно, так как если явно указать

Код: Выделить всё

ipfw pipe 1 config bw 1Mbit/s weight 100 sched 1 type QFQ mask dst-ip 0xffffffff
то мы получим 1 трубу в 1мб на всех потому как вся обработка происходит в шедуллере, в трубу падает уже готовый трафик и маскировке уже почему-то не поддается, а в шедуллере маска не играет роль на скорость.
То есть
Если нарезать жесткую скорость то шедуллеры вообще не нужны
но
Если делать приоритезацию потоков(очередей), то шедуллеры очень помогают разобрать приорететы очередей и в правильном порядке их пропускать
Если в чем-то ошибся - поправьте!

P.S. В документе Луиджи так же описывается использование профилей для труб, которые эмулируют мак-уровень.
Но как не пытался я что-то смастерить - ничего не вышло

Код: Выделить всё

ipfw pipe 1 config bw 1000Mbit/s weight 100 mask dst-ip 0xffffffff profile profile_1024M
ipfw pipe 2 config bw 1000Mbit/s weight 100 mask src-ip 0xffffffff profile profile_1024M
ipfw add pipe 1 ip from any to any dst-ip 172.16.17.0/24 out
ipfw add pipe 2 ip from any to any src-ip 172.16.17.0/24 in

Код: Выделить всё

# cat profile_1024M
name            profile_1024M

samples         6

loss-level      0.99

prob            delay
0.10            100
0.25            100
0.50            200
0.75            300
0.90            500
0.98            2000
Ожидалось что будет картинка примерно такая:
при старте закачки
первые 100мс клиент получит 10% канала
последующие 100мс - 25%
еще 200мс - 50%
300мс - 75%
500мс - 90%
и свыше 2000мс 98%
и при загрузке канала с 99% и выше будут дропаться пакеты.
Но в реальности клиент получил максимум до 20К :st: :st: :st:
Или я совсем все неправильно понял :st: