pptpd+radius+mysql -aesitatyieshas- 安裝攻略(part3 mysql部分)

火星人 @ 2014-03-04 , reply:0

pptpd+radius+mysql -aesitatyieshas- 安裝攻略(part3 mysql部分)

pptpd+radius+mysql  安裝攻略(part3 mysql部分)

2006.02.10 by i_amok  








cd /usr/local/freeradius-1.1.0/etc/raddb

vi sql.conf


        # Connect info
        server = ""
        login = "radius"
        password = "radius"

        # Database table configuration
        radius_db = "radius"


        # Uncomment simul_count_query to enable simultaneous use checking
         simul_count_query = "SELECT COUNT(*) FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime = 0"


註釋掉 authorize {

註釋掉 preacct {

註釋掉 accounting {

註釋掉 session{

去掉 post-auth {





attribute為 User-Password




# ../../sbin/radiusd -x
Starting - reading configuration files ...
Using deprecated naslist file.  Support for this will go away soon.
Module: Loaded exec
rlm_exec: Wait=yes but no output defined. Did you mean output=none?
Module: Instantiated exec (exec)
Module: Loaded expr
Module: Instantiated expr (expr)
Module: Loaded PAP
Module: Instantiated pap (pap)
Module: Loaded CHAP
Module: Instantiated chap (chap)
Module: Loaded MS-CHAP
Module: Instantiated mschap (mschap)
Module: Loaded eap
rlm_eap: Loaded and initialized type md5
rlm_eap: Loaded and initialized type leap
rlm_eap: Loaded and initialized type gtc
rlm_eap: Loaded and initialized type mschapv2
Module: Instantiated eap (eap)
Module: Loaded preprocess
Module: Instantiated preprocess (preprocess)
Module: Loaded SQL
rlm_sql (sql): Driver rlm_sql_mysql (module rlm_sql_mysql) loaded and linked
rlm_sql (sql): Attempting to connect to radius@
rlm_sql (sql): starting 0
rlm_sql (sql): Attempting to connect rlm_sql_mysql #0
rlm_sql_mysql: Starting connect to MySQL server for #0
rlm_sql (sql): Connected new DB handle, #0
rlm_sql (sql): starting 1
rlm_sql (sql): Attempting to connect rlm_sql_mysql #1
rlm_sql_mysql: Starting connect to MySQL server for #1
rlm_sql (sql): Connected new DB handle, #1
rlm_sql (sql): starting 2
rlm_sql (sql): Attempting to connect rlm_sql_mysql #2
rlm_sql_mysql: Starting connect to MySQL server for #2
rlm_sql (sql): Connected new DB handle, #2
rlm_sql (sql): starting 3
rlm_sql (sql): Attempting to connect rlm_sql_mysql #3
rlm_sql_mysql: Starting connect to MySQL server for #3
rlm_sql (sql): Connected new DB handle, #3
rlm_sql (sql): starting 4
rlm_sql (sql): Attempting to connect rlm_sql_mysql #4
rlm_sql_mysql: Starting connect to MySQL server for #4
rlm_sql (sql): Connected new DB handle, #4
Module: Instantiated sql (sql)
Module: Loaded Acct-Unique-Session-Id
Module: Instantiated acct_unique (acct_unique)
Module: Loaded realm
Module: Instantiated realm (suffix)
Module: Loaded detail
Module: Instantiated detail (detail)
Initializing the thread pool...
Listening on authentication *:1812
Listening on accounting *:1813
Ready to process requests.



rad_recv: Access-Request packet from host, id=222, length=146
        Service-Type = Framed-User
        Framed-Protocol = PPP
        User-Name = "test"
        MS-CHAP-Challenge = 0xb6a9e94b94c3c386875043efd5144e17
        MS-CHAP2-Response = 0x38006d78036bb5e40ddeca0ce96b944619e000000000000000007b887b8762be38eb111a94a4b581925b85e07453a38a070f
        Calling-Station-Id = ""
        NAS-IP-Address =
        NAS-Port = 0
rlm_sql (sql): Reserving sql socket id: 4
rlm_sql (sql): Released sql socket id: 4
rlm_sql (sql): Reserving sql socket id: 3
rlm_sql (sql): Released sql socket id: 3
rlm_sql (sql): Processing sql_postauth
rlm_sql (sql): Reserving sql socket id: 2
rlm_sql (sql): Released sql socket id: 2
Sending Access-Accept of id 222 to port 32768
        MS-CHAP2-Success = 0x38533d33453434464142394232444230413143464539453832444536453534373331383833454238414536
        MS-MPPE-Recv-Key = 0x53a3812a0fd5b6f7b1cf4f6f6796f26b
        MS-MPPE-Send-Key = 0xb8be60559cbc46fd4da277516d6584f3
        MS-MPPE-Encryption-Policy = 0x00000002
        MS-MPPE-Encryption-Types = 0x00000004
rad_recv: Accounting-Request packet from host, id=223, length=110
        Acct-Session-Id = "43EC0822056A00"
        User-Name = "test"
        Acct-Status-Type = Start
        Service-Type = Framed-User
        Framed-Protocol = PPP
        Calling-Station-Id = ""
        Acct-Authentic = RADIUS
        NAS-Port-Type = Async
        Framed-IP-Address =
        NAS-IP-Address =
        NAS-Port = 0
        Acct-Delay-Time = 0
rlm_sql (sql): Reserving sql socket id: 1
rlm_sql (sql): Released sql socket id: 1
Sending Accounting-Response of id 223 to port 32768



rad_recv: Access-Request packet from host, id=225, length=146
        Service-Type = Framed-User
        Framed-Protocol = PPP
        User-Name = "test"
        MS-CHAP-Challenge = 0x2295d4d65913cbc0a7836e986fe4a998
        MS-CHAP2-Response = 0x34001739a3331c1a1a938eed99cda89b691f0000000000000000a8a9e9ae2eadaa6b1acb93e368113dc4ed47dac0a20b1ed8
        Calling-Station-Id = ""
        NAS-IP-Address =
        NAS-Port = 0
rlm_sql (sql): Reserving sql socket id: 4
rlm_sql (sql): Released sql socket id: 4
rlm_sql (sql): Reserving sql socket id: 3
rlm_sql (sql): Released sql socket id: 3
rad_recv: Access-Request packet from host, id=225, length=146
Sending Access-Reject of id 225 to port 32768
        Reply-Message := "\r\nYou are already logged in - access denied\r\n\n"




FreeNIBS is a loadable plugin for the FreeRADIUSradius server. FreeNIBS provides authorization,authentication, and accounting for dial-in(PPP/PPPOE/PPTP) users. It can be used forreal-time prepaid and postpaid billing. FreeNIBScan bill users based on service accuration, time,traffic, and both time and traffic. FreeNIBS hasvery flexible settings for groups, users, andprices. All data is stored in SQL databases suchas MySQl, PgSQL, and Oracle.



回復 1樓 i_amok 的帖子





rh as 4 里居然沒有radius.so,意思是rhel4里的ppp居然不支持radius驗證...


freenibs 一些說明, 關於安裝正在查看

The possibility to send Accounting-Update packets to the RADIUS not only
   on time basis but also depending upon the volume of the received or
   transferred traffic (or both).
   Both "update-limit-in" and "update-limit-out" parameters defaults to 0.
   To set non-zero values one must do it in mpd.conf:

        set radius update-limit-in X
        set radius update-limit-out Y
    (where X, Y - are the traffic in bytes)

   Then, when the moment for the next-in-turn acct-update time comes, it is
   checked whether the limits are exceedeed. If they are not exceeded,
   update is not made (i.e. acct-update packets are not sent to RADIUS).
   The idea of it: not to overload the RADIUS and its logs.

3) Give ppp netgraph node name like "mpd-<name>" instead of "mpd<pid>-<name>".
   As the name length of netgraph node is restricted by 15 symbols, and the
   standard designation ppp node consists of "mpdNNNNN-pptpXX", more than 99
   nodes can not be made. Patch makes it possible to solve this problem.

4) Dropping the connection, if the RADIUS has sent vendor-specific attribute 154.
   When the attribute is 0 it means the continuation of the connection,  when it
   is set to 1 -- the connection should be dropped. The following lines should
   be added to the dictionary.mpd (VENDOR mpd 12341):

5) New function RadiusGetCurrentParams().
   In the patch this function gets the Accounting-Response from the RADIUS
   and marks the moment when connection should be dropped ("Drop-User = Yes"
   attribute arrival).
   Hence, any developer may write additional code to this function to catch
   the reception of attributes she is interested with.
   The function RadiusGetParams() from the original mpd is used during
   the (re-)initialization phase only.

3. Mini - How-To

   1) Update limits
   This option may be interesting for those who use the tarification of the traffic.
   When update limits are non-zero a comparatively little time interval
   for acct-update can be configured and the required "update-limit-|"
   established. Internal statistics in mpd works once a minute in any case.
   That's why, if the line
        set radius acct-update 60
   is added to mdp.conf, mpd gets practically no additional work.
   The concrete limit values are certainly different for eveyone. But the
   initial values from 100000 to 1000000 seem quite reasonable to me.
   After that analyse the results and change the values. Up to individual limits
   per link.
   Hint: update limits work only when acct-update is switched on!

   2) Drop-user
   This option may be useful for those, who:
   - limit clients' traffic, and NAS does not support attribute Session-Octets-Limit;
   - use dynamic restrictions (formed, for example, by billing system):
     one login for several simultaneous sessions with the limitation by
     the time or/and by the traffic; in other cases when it is impossible
     to determine the restrictions at the beginning of the session.
     For mpd to drop the link, RADIUS must send this mere attribute with
     the value "Yes". But, possibly, not the RADIUS itself, but the billing
     system is responsible for the construction of such packet.

     That system processes accounting packets of the three types: Start, Stop,
     Update. "Stop" is of no interest in this context. "Start" employs other
     determination methods to see if mpd may start the session. It is
     reasonable to consider only "Update"-packets.

     When the limits are reached it is quite enough to add to the packet,
     meant to send the response to the RADIUS, the neccessary pair with the
     operator "=". Something like:

        New_Pair = Pair_Create("Drop-User", "Yes", T_OP_EQ);
        Pair_Add(Pairs_To_Reply, New_Pair);

  This technology was tested with freeradius-0.9.3, freenibs-0.0.3-bf3.
  The latter (open-source billing system) can be found at:
  http://nibs.net.ua, http://sourceforge.net/projects/nibs
   The patch, allowing to form the neccessary response to the RADIUS
for the subsequent transmission to mpd daemon. And as the result to
drop the connection:
--- rlm_nibs.c.origMon Apr 12 22:27:58 2004
+++ rlm_nibs.cTue Apr 13 01:01:41 2004
@@ -1139,6 +1139,8 @@
radlog(L_INFO, querystr);
if (nibs_error != NULL) free(nibs_error);
nibs_user_kill(inst, request);
+ pair = pairmake("Drop-User", "Yes", T_OP_EQ);
+ pairadd(&request->reply->vps, pair);


FreeRadius + FreeNIBS + FreeBSD + mpd4(billing traffic freebsd radius)

Поставил Связку FreeRadius 1.0.1+FreeNIBS2.1.6+FreeBSD6.0+mpd4

Вот некоторые моменты, которые не сразу нашел, или вообшще не нашел:

1. mpd.conf очень чувствителен к отсутствию пробелов и табов.

2. set bundle enable compression - было написано, что очень тормозит работу.

3. Вы настроили, все работает - Но как осуществлять запуск скриптов при подключении/отключении?

     set iface up-script "/usr/local/etc/mpd4/link-up"
     set iface down-script /usr/local/etc/mpd4/link-down

При этом надо сделать скрипты исполняемыми!

    chmod 755 /usr/local/etc/mpd4/link-up
    chmod 755 /usr/local/etc/mpd4/link-down

Далее пункты 4,5 из http://wiki.bsdportal.ru/doc:vpn (Я использовал только Их):


    # собственно поддержка netgraph
    options         NETGRAPH       
    options         NETGRAPH_PPP       
    options         NETGRAPH_PPTPGRE
    # включаем поддержку ipfw
    options         IPFIREWALL               
    options         IPFIREWALL_DEFAULT_TO_ACCEPT       
    options         IPDIVERT                       

Это не все конечно...


Открываем radiusd.conf. В нем правим следующие настройки:

    # Логируем атрибут User-Name если он найден в запросе
    # Логируем запросы аутентификации
    # Если пароль неверен - пишем его в Лог
    # верные пароли незачем писать в лог

Проверяем чтобы была раскоментарена строчка:

    $INCLUDE ${confdir}/sql.conf

В секции authorize комментарим files и удаляем комментарий с sql

В секции accounting также снимаем комментарий с sql
Далее смотрим в sql.conf и правим:


6.Что пихать в link-up?

Сначала создаем файлы так:

    touch pr
    touch ip
    touch iptest
    touch iptest1

ЗЫ:Может криво, но работает:

    #tun название тунеля, смотрящего в Инет - на #Сервере, где стоит Нибс,
    #появляется после #подключения Инета
    n=`head -n 1 pr`
    sed 1d pr>pr1
    cat pr1>pr
    n1=`expr $n + 1`
    /sbin/ipfw add $n divert 8668 all from $4 to any via $tun
    /sbin/ipfw  add $n1  divert 8668 all from any to me via $tun
    echo "$1 $4 $n $n1">>ip
    echo "$1 $4 $n $n1">>iptest
    echo $n1>num

В файле pr находится номера для правил, расположеных через 1...Зачем?

Дело в том, что у Меня все правила, если Их указывать без номера -
добавляются за 65000 и там не работают - по крайней мере Я пробовал...

Тоесть файл pr должен содержать, что то типа:


и т.д. - записей 100, для подключившихся 50-т, на всякий случай...

Файл link-down:

    n1=`cat ip|grep "$1"| awk '{print $3"\t"}'`
    n2=`cat ip|grep "$1"| awk '{print $4"\t"}'`
    /sbin/ipfw delete $n1
    /sbin/ipfw delete $n2
    cat ip|grep -v "$1">iptest1
    cat iptest1>ip
    echo "$n1">>pr

Эти скриптыделают вот что:

Достаю из файла pr первое значение, и прописываают правила с номером
<значение> <значение+1>, после того как отключается пользователь - эти
номера возвращаются для использования... - главное, что бы не
перекрывались с уже имеющимися правилами ipfw:

    ipfw show

Как запустить?

1.Подключаемся в инет

2.есть у Меня скриптик:


    #tun название тунеля, смотрящего в Инет - на #Сервере, где стоит Нибс,
    #появляется после #подключения Инета В link-up он же
    apache start&
    mpd4 -b;
    radiusd -f&
    natd -n $tun -p 8668


Можно было бы и без файлов - с помощью ДБ, и без файла pr вообще - но
меня смущает то, что правила в ipfw show показываются так:

    00508    75   11273 divert 8668 ip from to any via tun0

В приннципе можно запросто вытянуть номера имеющихся правил, но Они
будут начинатся с 00 или 0, ну а Мне легше было так написать, чем
смотреть на awk,sed и т.д.

Если кто хочет, то может дополнить :)

FreeBSD + FreeNIBS + Mpd (freebsd billing vpn pptp mpd radius pptp)

Все разработки опробованы на компактном сервере Favourite IS на основе ОС UNIX,
предназначенном для предоставления Интернет-доступа и Интернет-сервисов.
Ссылка в Интернет: http://is.nnz.ru
Взять сервер Favourite IS на тестирование. Mail to: Boginsky@nnz.ru <mailto:Boginsky@nnz.ru.>

   Биллинг для домашней сети, FreeBSD + FreeNIBS + Mpd

Постановка задачи:

      Дано: Имеется локальная сеть и канал в Интернет.


      1. Отдавать людям Интернет за деньги
      2. Иметь несколько тарифов
      3. Обеспечить пристойный уровень безопасности.


      1. Авторизация по MAC/IP.

      Эта система наиболее проста в реализации, но, к сожалению, полностью
      дискредитировала себя, потому что подмена MAC-адреса делается
      сравнительно просто, в частности в моей ДС было зафиксировано
      несколько случаев подмены и MAC и IP.
      К тому же, если удаленный хост находится за роутером, то вместо его
      MAC-адреса отображается MAC роутера, и это еще больше затрудняет
      использование этого метода авторизации.

      2. Авторизация Логин/Пароль на Прокси-сервере
      Неплохой метод авторизации, который удачно работает во многих
      корпоративных сетях, где пользователям разрешены HTTP и FTP, и имеется
      корпоративный почтовый сервер.
      Но, для ДС этот метод мало подходит, потому что людям нужно принимать
      почту, играть в игры и так далее, а ограничивать людей, которые платят
      за трафик - это не наш метод.

      3. Подключение через шифрованный VPN-канал.
      Стандарт, который получил наибольшее распространение в коммерческих ДС
      прежде всего из-за высокого уровня безопасности. Между пользователем и
      сервером организуется шифрованный туннель, внутри которого передается
      информация и считается трафик.
      Моя статья - Именно про последний вариант, и про то, как я реализовал
      его в своей ДС с использованием только open-source софта.

Выбор софта


      У среднего клиента стоит Windows XP/2000/98.
      Выбираем то, что ему (клиенту) проще настраивать - то есть входящее в
      операционную систему стандартное "Подключение к виртуальной частной

      Это означает, что мы будем использовать протокол PPTP с авторизацией
      через MS-CHAP.

      На сервере будет стоять FreeBSD 5.3 - по понятным причинам =)
      Но можно делать и под Linux, используя PoPToP вместо MPD...

      1. VPN-сервер: MPD (Multi-link PPP daemon for FreeBSD) http://www.dellroad.org/mpd/

      Умеет (с официального сайта):
      - Multi-link PPP capability
      - PAP, CHAP, and MS-CHAP authentication - Аутентификация по протоколу MS-CHAP
      - PPP compression and encryption - Поддержка шифрования
      - Point-to-Point Tunnelling Protocol (PPTP) - Поддержка PPTP
      - PPP over Ethernet (PPPoE)
      - RADIUS authentication support - Поддержка RADIUS.

      Обратите внимание на последнюю строчку - RADIUS authentication
      Именно RADIUS мы будем использовать для управления VPN-сервером MPD.

      2. RADIUS-сервер и биллинговая система

      В качестве биллинговой системы выбран FreeNIBS
      (http://nibs.is.kh.ua/), бесплатный биллинг, представляющий из
      себя модуль для RADIUS-сервера FreeRadius (http://www.freeradius.org/).

      Соответственно, сразу решилась проблема выбора RADIUS-сервера =)
      В качестве базы данных FreeNIBS может использоваться MySQL и
      PostgreSQL, я выбрал MySQL по причине лучшего с ней знакомства.

      3. Web-Интерфейс для управления

      Для FreeNIBS есть 3 варианта web-интерфейса: родной, идущий в одном
      архиве с исходниками; Расширенный интерфейс WebNIBS
      (http://webnibs.sourceforge.net/); Проект MaBill (http://www.mabill.ru/).

      Первый слабоват и требует виртуальных доменов, третий излишне накручен
      и сложен, выбираем WebNIBS.

Установка и настройка FreeNIBS

      Ставим FreeRadius из портов, в нашем случае FreeRadius-1.0.1

              # cd /usr/ports/net/freeradius/
              # make patch

      Мы получили распакованные исходники в /usr/ports/net/freeradius/work/freeradius-1.0.1/
      Качаем версию FreeNIBS для Freeredius 1.0.1:
      Распаковываем и получаем 2 каталога: /raddb и /src
      Их содержимое надо скопировать в одноименные подкаталоги в исходниках
      /usr/ports/net/freeradius/work/freeradius-1.0.1/raddb/ и
      После этого компилируем Freeradius:
            # cd /usr/ports/net/freeradius/work/freeradius-1.0.1/
            # ./configure
            # make
            # make install

      Установили. Теперь надо поставить то, что требуется для работы системы
      и все правильно настроить.

      Ставим MySQL из портов:

            # cd /usr/ports/databases/mysql40-server/
            # make install clean

      Меняем пароль root, создаем базу данных freenibs и пользователя
      freenibs@localhost с паролем Pass.

      Для создания структуры базы данных находим в исходниках freenibs в
      подкаталоге /src/modules/rlm_nibs/drivers/rlm_nibs_mysql/ файл
      nibs_mysql.sql и импортируем его в MySQL:

            # cat ./nibs_mysql.sql | mysql -p

Настройка FreeNIBS

      Идем в каталог /usr/local/etc/raddb/ и настраиваем конфигурационные
      файлы Freeradius и FreeNIBS:

clients: secret


      client {
             secret = secret
             shortname = localhost
             nastype = other


      DEFAULT Suffix == ".ppp", Strip-User-Name = Yes
             Hint = "PPP",
             Service-Type = Framed-User,
             Framed-Protocol = PPP
      DEFAULT Suffix == ".slip", Strip-User-Name = Yes
             Hint = "SLIP",
             Service-Type = Framed-User,
             Framed-Protocol = SLIP
      DEFAULT Suffix == ".cslip", Strip-User-Name = Yes
             Hint = "CSLIP",
             Service-Type = Framed-User,
             Framed-Protocol = SLIP,
             Framed-Compression = Van-Jacobson-TCP-IP

naslist               local           other


      DEFAULT         Auth-Type = MS-CHAP

Настройки FreeNIBS находятся в файле nibs.conf. Находим там следующие
параметры и изменяем их.

      driver = "rlm_nibs_mysql"
      server = "localhost"
      port = "3306"
      login = "freenibs"
      password = "Pass"
      nibs_db = "freenibs"

в конце:

      kill_by_alive = yes
      kill_program = "/sbin/ifconfig ng%{NAS-Port} down"

Ставим web-интерфейс WebNibs

      Для начала своим любимым способом ставим apache с поддержкой php.
      Затем качаем архив http://webnibs.sourceforge.net/nibs.tgz, и
      распаковываем его в /usr/local/www/data/nibs или в другое любимое вами

      Затем редактируем файлы:


      $auth_user = "admin";
      $auth_pass = "pass";



Затем, для

      ALTER TABLE `packets` ADD `crypt_method` TINYINT(1) NOT NULL;

Все! Радиус можно стартовать!

Запускаем его:

      # /usr/local/etc/rc.d/radiusd.sh start

    Дмитрий Горохов,
    Ниеншанц-Телеком, Инженер-разработчик.
    <sfh@inbox.ru.>; <sheriff@nnz.ru.>




[火星人 via ] pptpd+radius+mysql -aesitatyieshas- 安裝攻略(part3 mysql部分)已經有396次圍觀