Jump to content
Калькуляторы

FreeBSD + mpd5 + ng_car

Как заставить эту связку работать? Много перечитал документации в интернетах, но ничего конкретного не нашел, а то что есть - не работает.

 

Делаю так:

 

1. создаю таблицу и добавляю туда свой адрес. Адреса выдает mpd, при подключении срабатывает скрипт который берет выданный адрес и подставляет его в таблицу

ipfw table 10 add $IP 10

 

2. в ipfw есть правило

${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1

где igb1 внешний фейс

 

3. после этого стартует скрипт,

#!/bin/sh

ng=`awk "BEGIN { printf \"%04s\", substr(\"$1\", 3) }"`

ng=`echo "$ng*1" | bc`;

ng2=`echo "1000+$ng" | bc`;

LOGIN="inet_$2";

shape=`echo "1024*$3" | bc`;

cbsebs=`echo "$shape/8" | bc`;

 

/usr/sbin/ngctl shutdown $LOGIN:

/usr/sbin/ngctl mkpeer ipfw: car $ng upper;

/usr/sbin/ngctl name ipfw:$ng $LOGIN;

/usr/sbin/ngctl connect $LOGIN: ipfw: lower $ng2;

/usr/sbin/ngctl msg $LOGIN: setconf { upstream={ cbs=${cbsebs} ebs=${cbsebs} cir=${shape} greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=${cbsebs} ebs=${cbsebs} cir=${shape} greenAction=1 yellowAction=1 redAction=2 mode=2 } };

 

который должен связать хуки ipfw и ng_car, что в принципе и происходит

Free# ngctl msg inet_krovozhadina: getconf

Rec'd response "getconf" (4) from "[3f2]:":

Args: { upstream={ cbs=8192 ebs=8192 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=8192 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } }

 

но скорость не режется!

 

Подскижате, если кто сталкивался и поборол, как бы и мне тоже побороть?

Share this post


Link to post
Share on other sites

Может проще радиусом отдать параметры?

Или хотя бы скриптом, так тоже делал.

Share this post


Link to post
Share on other sites

Может проще радиусом отдать параметры?

Или хотя бы скриптом, так тоже делал.

Радиусом не то... прикаждом новом тарифе (читай Скорости тарифа) придется в биллинг новое правило вносить, а скриптом было бы самое то, просто брать скорость по текущему тарифу и дело пойдет!

 

Можно примерчик, как сделать скриптом?

Share this post


Link to post
Share on other sites

Проще радиусом.

 

2. в ipfw есть правило

${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1

где igb1 внешний фейс

 

Но если хочется иначе - подумай, для начала, над этим правилом

Share this post


Link to post
Share on other sites

Радиусом конечно проще и все это работает (я пробовал), но цель в том, чтоб задавать скриптом при подключении абонента.

 

Но если хочется иначе - подумай, для начала, над этим правилом

А что тут не так? Просто я никогда не пробовал работать с netgraph`ом и это "первые шаги".

Edited by krovozhadina

Share this post


Link to post
Share on other sites

${fwcmd} add 10 netgraph tablearg all from any to "table(10)" out via igb1

Share this post


Link to post
Share on other sites

Заменил на in, пробовал вообще убрать направление, толку 0. Хотя кое-что определенно изменилось... Сервер стал падать в кору при добавлении в таблицу table(10) адреса

FreeVPN-16# uname -a
FreeBSD FreeVPN-16 7.4-STABLE FreeBSD 7.4-STABLE #0: Tue Sep  6 15:20:34 MSD 2011     root@FreeVPN-16:/usr/src/sys/i386/compile/mykernel  i386

FreeVPN-16# kgdb -q /boot/kernel/kernel.debug /usr/vmcore.3
#0  doadump () at pcpu.h:197
197     pcpu.h: No such file or directory.
       in pcpu.h
(kgdb) bt
#0  doadump () at pcpu.h:197
#1  0xc0388463 in boot (howto=260) at ../../../kern/kern_shutdown.c:421
#2  0xc0388737 in panic (fmt=Variable "fmt" is not available.
) at ../../../kern/kern_shutdown.c:576
#3  0xc058dabc in trap_fatal (frame=0xee3d6bc0, eva=24) at ../../../i386/i386/trap.c:950
#4  0xc058dd50 in trap_pfault (frame=0xee3d6bc0, usermode=0, eva=24) at ../../../i386/i386/trap.c:863
#5  0xc058e72c in trap (frame=0xee3d6bc0) at ../../../i386/i386/trap.c:541
#6  0xc056f53b in calltrap () at ../../../i386/i386/exception.s:166
#7  0xc0464750 in move_pkt (pkt=0xcdf95800, q=0xd098c500, p=0xd0973c00, len=1396)
   at ../../../netinet/ip_dummynet.c:545
#8  0xc0465200 in ready_event (q=0xd098c500, head=0xee3d6c80, tail=0xee3d6c7c)
   at ../../../netinet/ip_dummynet.c:593
#9  0xc0466fb5 in dummynet_task (context=0x0, pending=1) at ../../../netinet/ip_dummynet.c:847
#10 0xc03bfff2 in taskqueue_run_locked (queue=0xcdb25000) at ../../../kern/subr_taskqueue.c:293
#11 0xc03c0197 in taskqueue_thread_loop (arg=0xc0652e48) at ../../../kern/subr_taskqueue.c:428
#12 0xc03600a9 in fork_exit (callout=0xc03c00d0 <taskqueue_thread_loop>, arg=0xc0652e48, frame=0xee3d6d38)
   at ../../../kern/kern_fork.c:798
#13 0xc056f5b0 in fork_trampoline () at ../../../i386/i386/exception.s:271
(kgdb) quit

Share this post


Link to post
Share on other sites

насколько я понял ман, пакет из ng_ipfw должен уйти в хук с именем "10" ...

Share this post


Link to post
Share on other sites

насколько я понял ман, пакет из ng_ipfw должен уйти в хук с именем "10" ...

Там у меня вверху опечатка. Каждому адресу присваиваются номера хуков из ng фейсов.

 

Скажем... я подключаюсь к NAS-серверу и для меня создается фейс ng1. В таком случае запись будет выглядеть так:

ipfw table 10 add $IP 1

Share this post


Link to post
Share on other sites

А почему бы не dummynet?

 

И добавлять IP в таблицу желательно после создания и связи ng_car ноды, а не до

Share this post


Link to post
Share on other sites

А почему бы не dummynet?

 

И добавлять IP в таблицу желательно после создания и связи ng_car ноды, а не до

На dummynet сделано сейчас уже, все это работает как часы. Но! Загрузка процессора при ~600 клиентах почти 100%, что не есть гуд. В интернетах везде хвалятся, что на ng_car работает гораздо лучше и процессор не ест так сильно. Где-то в этом форуме даже было несколько тем, о том что люди умудрялись до 4000 абонентов держать на обном сервере NAS.

Хотя реального подтверждения я невидел...

 

Сегодня сделал следующим образом:

в конфиг mpd дописал

   set radsrv self 127.0.0.1
   set radsrv peer 127.0.0.1 pass
   set radsrv open
   set radsrv enable coa disconnect

и при подключении клиента запускается скрипт

#!/bin/sh
sleep 1;
LOGIN=$1;
cr=`echo "$2*1024" | bc`;       # configured rate
nb=`echo "$cr*3/16" | bc`;      # normal burst
eb=`echo "2*$nb" | bc`;         # extended burst
shape=`echo "$2*1024" | bc`;
#/bin/echo "User-Name =" $LOGIN", mpd-limit += \"in#1=all shape $shape 8000 pass\", mpd-limit += \"out#1=all shape $shape 8000 pass\"" | /usr/local/bin/radclient -x -s 127.0.0.1:3799 coa pass
/bin/echo "User-Name =" $LOGIN", mpd-limit += \"in#1=all rate-limit $cr $nb $eb\", mpd-limit += \"out#1=all rate-limit $cr $nb $eb\"" | /usr/local/bin/radclient -x -s 127.0.0.1:3799 coa pass

где $1 - логин клиента, $2 - скорость по тарифу.

В консоли mpd видно, что значения mpd-limit выставляются нормально, но шейпинг не происходит почему-то... Пробовал два варианта, ни один не сработал. Почему? Опять что-то не так далаю?

Share this post


Link to post
Share on other sites

Проверил

sysctl net.inet.ip.dummynet.io_fast= 0|1

Разницы нет, какое значение, нагрузка на проц не меняется.

Share this post


Link to post
Share on other sites

Где-то в этом форуме даже было несколько тем, о том что люди умудрялись до 4000 абонентов держать на обном сервере NAS.

Хотя реального подтверждения я невидел...

Железо то не озвучено, м.б. там 600 юзверей и есть макс.

Share this post


Link to post
Share on other sites

FreeBSD 7.4-STABLE #0: Mon Sep  5 15:52:51 MSD 2011
CPU: Intel(R) Core(TM)2 Quad CPU    Q8300  @ 2.50GHz (2499.73-MHz 686-class CPU)
real memory  = 9328132096 (8896 MB)
igb0: <Intel(R) PRO/1000 Network Connection version - 2.0.7>
igb1: <Intel(R) PRO/1000 Network Connection version - 2.0.7>

из особенностей:

- polling отключен, с ним все виснет и пакеты не ходят

- на каждого клиента создается отдельная труба pipe

- при ~600 клиентах загрузка процессора под 100% (т.е. все 4 ядра)

 

Еще интересно, откуда берется ng_queue, если mpd собрать без ng_car ?

FreeVPN-16# top -IS
last pid: 57162;  load averages:  0.33,  0.33,  0.32                                                                            up 0+19:06:55  09:56:26
117 processes: 6 running, 90 sleeping, 21 waiting
CPU:  1.9% user,  0.0% nice, 10.3% system,  7.3% interrupt, 80.6% idle
Mem: 86M Active, 685M Inact, 254M Wired, 30M Cache, 112M Buf, 6865M Free
Swap: 4096M Total, 4096M Free

 PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  13 root          1 171 ki31     0K     8K CPU1    1  17.2H 92.19% idle: cpu1
  14 root          1 171 ki31     0K     8K CPU0    0  16.7H 91.46% idle: cpu0
  11 root          1 171 ki31     0K     8K RUN     3  17.6H 90.48% idle: cpu3
  12 root          1 171 ki31     0K     8K CPU2    2  17.4H 85.99% idle: cpu2
  39 root          1 -68    -     0K     8K WAIT    3  35:04  4.69% irq264: igb1
  37 root          1 -68    -     0K     8K CPU2    2  35:08  4.49% irq263: igb1
  35 root          1 -68    -     0K     8K WAIT    1  32:33  3.56% irq262: igb1
  24 root          1 -68    -     0K     8K WAIT    0  15:56  3.37% irq256: igb0
   4 root          1 -68    -     0K     8K sleep   2  23:01  3.27% ng_queue2
   3 root          1 -68    -     0K     8K sleep   1  22:59  2.88% ng_queue1
   5 root          1 -68    -     0K     8K sleep   3  22:59  2.69% ng_queue3
  33 root          1 -68    -     0K     8K WAIT    0  34:45  2.59% irq261: igb1
   2 root          1 -68    -     0K     8K sleep   3  23:00  2.59% ng_queue0
  16 root          1 -32    -     0K     8K WAIT    1  24:22  1.56% swi4: clock sio
  30 root          1 -68    -     0K     8K WAIT    3   6:56  0.78% irq259: igb0
  26 root          1 -68    -     0K     8K WAIT    1   7:47  0.29% irq257: igb0

Edited by krovozhadina

Share this post


Link to post
Share on other sites

Весь MPD написан на нетграфе...

 

Я использовал для регистрации в MPD5 пользователя внешний скрипт, MPD ему при вызове скидывает первым параметром логин пользователя, скрипт обращается к базе mysql и выдает либо отказ либо пароль и параметры в радиусовском виде.

Примерно вот так это выглядит:

 

Код

stat# ./mpd5-l.sh fortebool

RESULT:UNDEF

USER_PASSWORD:Hj;tyrjdGjkyjtXvj

FRAMED_IP_ADDRESS:200.10.0.6

MPD_LIMIT:in#6=all rate-limit 262144

MPD_LIMIT:out#6=all rate-limit 262144

 

Сам скрипт надо искать, я его Механику на этом форуме в свой время отправлял.

Сейчас перешел на радиус, с ним лучше, привязал его к mysql туда простым sql скриптом выгружаю с биллинга нужные данные пользователей. Там же реализовал mpd_drop_user. + сделал скриптом на НАСах увеличение скорости ночью без разрыва.

 

IPFW почти пустой (одно правило запрета людей с минусовым балансом, на всякий случай). Нагрузка хорошо распределяется и проблем пока нет. (1300 в он-лайне, 800 мбит/с).

Share this post


Link to post
Share on other sites

Этот скрипт в конфиге должен быть так?

set iface up-script /usr/local/etc/mpd5/up.sh

 

или так?

set auth extauth-script /usr/local/etc/mpd5/up.sh

 

Можно примерчик из вашего конфига?

 

ps. вот пример загрузки на моем сервере, при 340 абонентах. При 600 абонентах будет 100% все 4 ядра

FreeVPN-16# top -IS
last pid: 42860;  load averages:  2.07,  1.91,  1.62                                                                            up 0+21:48:40  12:38:11
115 processes: 17 running, 82 sleeping, 16 waiting
CPU:  0.2% user,  0.0% nice, 43.4% system, 28.9% interrupt, 27.5% idle
Mem: 94M Active, 730M Inact, 270M Wired, 31M Cache, 112M Buf, 6794M Free
Swap: 4096M Total, 4096M Free

 PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  49 root          1 -68    -     0K     8K CPU1    1 120:39 48.29% dummynet
  13 root          1 171 ki31     0K     8K RUN     1  18.6H 38.38% idle: cpu1
  14 root          1 171 ki31     0K     8K RUN     0  18.0H 30.47% idle: cpu0
  11 root          1 171 ki31     0K     8K RUN     3  19.1H 28.37% idle: cpu3
  12 root          1 171 ki31     0K     8K RUN     2  18.9H 27.98% idle: cpu2
   4 root          1 -68    -     0K     8K CPU2    3  48:16 24.17% ng_queue2
   3 root          1 -68    -     0K     8K RUN     2  48:13 24.17% ng_queue1
   5 root          1 -68    -     0K     8K CPU3    0  48:13 22.46% ng_queue3
   2 root          1 -68    -     0K     8K RUN     3  48:14 22.36% ng_queue0
  33 root          1 -68    -     0K     8K WAIT    0  53:37 20.65% irq261: igb1
  35 root          1 -68    -     0K     8K RUN     1  50:03 18.80% irq262: igb1
  37 root          1 -68    -     0K     8K CPU2    2  53:39 18.16% irq263: igb1
  39 root          1 -68    -     0K     8K RUN     3  53:35 17.29% irq264: igb1
  24 root          1 -68    -     0K     8K WAIT    0  30:40 14.26% irq256: igb0
  28 root          1 -68    -     0K     8K RUN     2  16:00 11.18% irq258: igb0
  30 root          1 -68    -     0K     8K RUN     3  14:59  7.67% irq259: igb0
  26 root          1 -68    -     0K     8K RUN     1  16:49  6.49% irq257: igb0
  16 root          1 -32    -     0K     8K WAIT    0  30:38  2.69% swi4: clock sio

Edited by krovozhadina

Share this post


Link to post
Share on other sites

- на каждого клиента создается отдельная труба pipe

Не в этом ли проблема?

 

Оптимально создать N pipes и загонять туда юзверей посредством таблиц.

N=количеству тарифов.

Share this post


Link to post
Share on other sites

Я использовал для регистрации в MPD5 пользователя внешний скрипт, MPD ему при вызове скидывает первым параметром логин пользователя, скрипт обращается к базе mysql и выдает либо отказ либо пароль и параметры в радиусовском виде.

 

Переделал с подобным скриптом. В конфиг mpd добавил

   set auth enable ext-auth
   set auth extauth-script /usr/local/etc/mpd5/up-ext.sh

 

Сам скрипт

FreeVPN-16# cat up-ext.sh
#!/bin/sh -
MYSQL="/usr/local/bin/mysql -h<IP> -u<user> -p<password> billing"
q="ЗАПРОС О СКОРОСТИ ПО ТАРИФУ";
s=`echo $q | $MYSQL | tail -n1`;
s1=`echo $s | awk '{ print $1 }'`;
s2=`echo $s | awk '{ print $2 }'`;
if test $s1 -gt $s2
then
   s2=$s1
fi
s2=`echo "$s2*0.8*1024" | bc`;
echo "MPD_LIMIT:in#6=all rate-limit $s2"
echo "MPD_LIMIT:out#6=all rate-limit $s2"
cat
exit

 

Теперь при подключении клиентам выдется скорость по тарифу, ну и шейпинг происходит через ng_car.

Вот загрузка при 250 клиентах

last pid: 11336;  load averages:  0.73,  0.90,  0.87                                                           up 0+02:07:06  15:46:48
119 processes: 6 running, 92 sleeping, 21 waiting
CPU:  0.2% user,  0.0% nice, 17.3% system, 18.0% interrupt, 64.5% idle
Mem: 72M Active, 137M Inact, 140M Wired, 9556K Cache, 112M Buf, 7562M Free
Swap: 4096M Total, 4096M Free

 PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  12 root          1 171 ki31     0K     8K RUN     2 100:27 69.78% idle: cpu2
  13 root          1 171 ki31     0K     8K RUN     1  97:56 69.48% idle: cpu1
  11 root          1 171 ki31     0K     8K CPU3    3 102:27 67.77% idle: cpu3
  14 root          1 171 ki31     0K     8K RUN     0  90:14 58.69% idle: cpu0
   3 root          1 -68    -     0K     8K sleep   1  11:53 16.46% ng_queue1
   2 root          1 -68    -     0K     8K sleep   1  11:53 16.26% ng_queue0
   5 root          1 -68    -     0K     8K sleep   3  11:52 15.38% ng_queue3
   4 root          1 -68    -     0K     8K sleep   0  11:53 15.09% ng_queue2
  33 root          1 -68    -     0K     8K WAIT    0  10:18 14.99% irq261: igb1
  39 root          1 -68    -     0K     8K WAIT    3  10:46 13.48% irq264: igb1
  35 root          1 -68    -     0K     8K WAIT    1   9:21 10.89% irq262: igb1
  37 root          1 -68    -     0K     8K WAIT    2  10:17 10.35% irq263: igb1
  28 root          1 -68    -     0K     8K CPU2    2   3:18  5.76% irq258: igb0
  24 root          1 -68    -     0K     8K WAIT    0   4:10  5.18% irq256: igb0
  30 root          1 -68    -     0K     8K WAIT    3   3:06  4.20% irq259: igb0
  16 root          1 -32    -     0K     8K WAIT    0   2:54  2.20% swi4: clock sio
  26 root          1 -68    -     0K     8K WAIT    1   2:23  2.10% irq257: igb0
 504 root          1  45    0  2652K  2268K select  1   0:03  0.29% zebra

Пока мне вроде как даже нравится.

 

Позже выложу еще загрузку при большем кол-ве... просто еще не вечер :)

Edited by krovozhadina

Share this post


Link to post
Share on other sites

720 клиентов

FreeVPN-16# top -IS
last pid: 89424;  load averages:  4.46,  3.81,  3.78                                    up 0+07:54:01  21:33:43
120 processes: 11 running, 91 sleeping, 18 waiting
CPU:  1.4% user,  0.0% nice, 47.7% system, 39.5% interrupt, 11.3% idle
Mem: 91M Active, 208M Inact, 170M Wired, 17M Cache, 112M Buf, 7434M Free
Swap: 4096M Total, 4096M Free

 PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   2 root          1 -68    -     0K     8K sleep   2 123:48 39.70% ng_queue0
   5 root          1 -68    -     0K     8K RUN     3 123:44 39.45% ng_queue3
   4 root          1 -68    -     0K     8K sleep   2 123:47 38.77% ng_queue2
   3 root          1 -68    -     0K     8K sleep   3 123:41 37.89% ng_queue1
  33 root          1 -68    -     0K     8K RUN     0  88:09 32.18% irq261: igb1
  39 root          1 -68    -     0K     8K WAIT    3  89:27 28.96% irq264: igb1
  35 root          1 -68    -     0K     8K CPU1    1  87:50 28.76% irq262: igb1
  37 root          1 -68    -     0K     8K WAIT    2  85:38 26.66% irq263: igb1
  12 root          1 171 ki31     0K     8K RUN     2 217:13 12.70% idle: cpu2
  24 root          1 -68    -     0K     8K RUN     0  38:42 11.96% irq256: igb0
  13 root          1 171 ki31     0K     8K RUN     1 208:15 11.57% idle: cpu1
  11 root          1 171 ki31     0K     8K RUN     3 222:07 11.38% idle: cpu3
  30 root          1 -68    -     0K     8K WAIT    3  31:44 10.69% irq259: igb0
  14 root          1 171 ki31     0K     8K RUN     0 188:46 10.60% idle: cpu0
  28 root          1 -68    -     0K     8K WAIT    2  25:40  9.18% irq258: igb0
  26 root          1 -68    -     0K     8K WAIT    1  25:52  8.06% irq257: igb0
  16 root          1 -32    -     0K     8K WAIT    0  17:15  2.20% swi4: clock sio
4848 root          4  46    0 55132K 28200K select  0  11:29  1.76% mpd5
 856 root          1  45    0  9908K  6772K select  3   1:28  0.49% snmpd
 504 root          1  44    0  3008K  2624K select  0   1:01  0.49% zebra

 

FreeVPN-16# netstat -w1 -h -d
           input        (Total)           output
  packets  errs      bytes    packets  errs      bytes colls drops
     117K     0        70M       112K     0        69M     0     0
     117K     0        70M       112K     0        70M     0     0
     119K     0        71M       115K     0        72M     0     0
     118K     0        70M       114K     0        72M     0     0
     121K     0        72M       116K     0        74M     0     0

Edited by krovozhadina

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this