Rambler's Top100


Вы

посетитель









Пример генерации конфигурационного файла модема в DOCSIS сети

В данной статье приводится пример кода perl скрипта, который генерирует конфигурационный файл для модема в DOCSIS сети. Аббревиатурой DOCSIS (Data Over Cable Service Interface Specifications) обозначается стандарт передачи данных по телевизионному кабелю, который был принят в 98 году. Стандарт в оригинале предполагает передачу данных до 42/38 Мбит/с в даунстриме (к пользователю) и до 10/9 Мбит/с в апстриме (от пользователя).

Типичная схема DOCSIS сети приведена на рис. 1.


Рис.1

Рассмотрим работу скрипта по шагам:

1. Подготавливаем базовый шаблон (код в скрипте выделен красным цветом), с занесением в него параметров частот апстрима, даунстрима, со стандартными параметрами файрвола (запрет в сети DOCSIS: бродкасты, мультикасты и т.д., разрешаем только самое необходимое). Этот конфигурационный файл создается администратором сети и сохраняется.

2. В цикле, в конфигурацию модема добавляем адреса клиентов, которые будут находиться за модемом (код в скрипте выделен синим цветом). За модемом можно поставить не более пяти IP устройств. Собственно добавив IP адреса, с которых все разрешено, мы фактически обеспечиваем безопасность (не хуже чем ACL PCF) и все это средствами модема, там же генерируем гарантированную и не гарантированную скорость. Имя файла конфигурации должно быть всегда - "макадрес.cm".

3. После генерации записываем конфигурационный файл на TFTP сервер.

Инициализация модема в сети DOCSIS:

  • Включаем модем в сеть HFC
  • Модем находит апстрим, даунстрим, проверяет соотношение сигнал/шум, настраивается и посылает dhcp запрос
  • Сервер dhcpd получает запрос на получения IP адреса, предает модему IP адрес и специальные строки для модема (опцию tftp, log server, time server)
  • Модем получив ответ, присваивает IP адрес
  • Модем запрашивает конфигурационный файл - "макадрес.cm" с tftp сервера, который был передан ранее и применяет его
  • Модем готов к работе

  • Для повышения надежности системы, необходимо использовать два dhcp сервера в режиме failover, которые выдают разные опции tftp сервера (в этом случае необходимо использовать два tftp сервера).

    Ниже приведен код perl скрипта:



    #!/usr/bin/perl -w

    use DBI;

    $prefix="/chroot/rsyncd";

    `/usr/bin/mkdir -p ${prefix}/var/cm`;

    $dbh=DBI->connect("DBI:mysql:dbname=billing;host=127.0.0.1","billing", "billing") or die "Couldn't connect to database: ".DBI->errstr;

    if (defined $ARGV[0]) {
       $sth=$dbh->prepare("SELECT vg_id, str_value from vgroups_addons_vals join vgroups using(vg_id) where login = '$ARGV[0]' and name = 'modem_mac'");
    }
      else { die "LOGIN IS NOT VALID\n";
    }
    $sth->execute() or die "Cannot execute: ".$sth->errstr();

    #$s = int(rand 10000) + 1;
    #$config=`mktemp ${prefix}/var/tmp/docsis-$s-XXXX`;
    $config=`/usr/bin/mktemp`;
    chomp $config;

    while(@row=$sth->fetchrow_array) {
        $speed = 2048000;
        $string = "
    Main {
        NetworkAccess 1;

        ClassOfService {
            ClassID         1;
            MaxRateDown     $speed;
            MaxRateUp       $speed;
            PriorityUp      3 ;
            GuaranteedUp    3000;
            PrivacyEnable   0;
        }
    ";

        $string = $string . "

        SnmpMibObject enterprises.1166.1.19.3.1.25.0            Integer 2;

        SnmpMibObject docsDevFilterIpControl.1                       Integer 2;
        SnmpMibObject docsDevFilterIpProtocol.1                     Integer 1;
        SnmpMibObject docsDevFilterIpStatus.1                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.2                       Integer 2;
        SnmpMibObject docsDevFilterIpProtocol.2                     Integer 47;
        SnmpMibObject docsDevFilterIpStatus.2                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.3                       Integer 2;
        SnmpMibObject docsDevFilterIpProtocol.3                     Integer 50;
        SnmpMibObject docsDevFilterIpStatus.3                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.4                       Integer 2 ;
        SnmpMibObject docsDevFilterIpDaddr.4                         IPAddress 255.255.255.255 ;
        SnmpMibObject docsDevFilterIpDmask.4                        IPAddress 255.255.255.255 ;
        SnmpMibObject docsDevFilterIpProtocol.4                     Integer 17 ;
        SnmpMibObject docsDevFilterIpDestPortLow.4             Integer 67 ;
        SnmpMibObject docsDevFilterIpDestPortHigh.4             Integer 68 ;
        SnmpMibObject docsDevFilterIpStatus.4                        Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.5                       Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.5             Integer 445;
        SnmpMibObject docsDevFilterIpDestPortHigh.5              Integer 445;
        SnmpMibObject docsDevFilterIpStatus.5                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.6                       Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.6              Integer 135;
        SnmpMibObject docsDevFilterIpDestPortHigh.6              Integer 139;
        SnmpMibObject docsDevFilterIpStatus.6                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.7                       Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.7             Integer 2745;
        SnmpMibObject docsDevFilterIpDestPortHigh.7             Integer 2745;
        SnmpMibObject docsDevFilterIpStatus.7                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.8                       Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.8             Integer 3127;
        SnmpMibObject docsDevFilterIpDestPortHigh.8              Integer 3127;
        SnmpMibObject docsDevFilterIpStatus.8                        Integer 4;
        SnmpMibObject docsDevFilterIpControl.9                       Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.9              Integer 1439;
        SnmpMibObject docsDevFilterIpDestPortHigh.9               Integer 1439;
        SnmpMibObject docsDevFilterIpStatus.9                         Integer 4;
        SnmpMibObject docsDevFilterIpControl.10                      Integer 1;
        SnmpMibObject docsDevFilterIpDestPortLow.10            Integer 6129;
        SnmpMibObject docsDevFilterIpDestPortHigh.10            Integer 6129;
        SnmpMibObject docsDevFilterIpStatus.10                      Integer 4;
        SnmpMibObject docsDevFilterIpControl.11                     Integer 1;
        SnmpMibObject docsDevFilterIpDaddr.11                       IPAddress 239.255.255.250 ;
        SnmpMibObject docsDevFilterIpDmask.11                      IPAddress 239.255.255.250 ;
        SnmpMibObject docsDevFilterIpProtocol.11                    Integer 17 ;
        SnmpMibObject docsDevFilterIpDestPortLow.11            Integer 1900;
        SnmpMibObject docsDevFilterIpDestPortHigh.11            Integer 1900;
        SnmpMibObject docsDevFilterIpStatus.11                       Integer 4;
        SnmpMibObject docsDevFilterIpControl.12                      Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.12                        IPAddress 255.255.255.255 ;
        SnmpMibObject docsDevFilterIpDmask.12                       IPAddress 255.255.255.255 ;
        SnmpMibObject docsDevFilterIpStatus.12                       Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.13                      Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.13                        IPAddress 192.168.0.0 ;
        SnmpMibObject docsDevFilterIpDmask.13                       IPAddress 255.255.0.0 ;
        SnmpMibObject docsDevFilterIpStatus.13                       Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.14                      Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.14                        IPAddress 192.0.2.0 ;
        SnmpMibObject docsDevFilterIpDmask.14                       IPAddress 255.255.255.0 ;
        SnmpMibObject docsDevFilterIpStatus.14                       Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.15                      Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.15                       IPAddress 192.0.2.0 ;
        SnmpMibObject docsDevFilterIpDmask.15                      IPAddress 255.255.255.0 ;
        SnmpMibObject docsDevFilterIpStatus.15                      Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.16                     Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.16                       IPAddress 127.0.0.0 ;
        SnmpMibObject docsDevFilterIpDmask.16                      IPAddress 255.0.0.0 ;
        SnmpMibObject docsDevFilterIpStatus.16                      Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.17                     Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.17                       IPAddress 1.0.0.0 ;
        SnmpMibObject docsDevFilterIpDmask.17                      IPAddress 255.0.0.0 ;
        SnmpMibObject docsDevFilterIpStatus.17                      Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.18                     Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.18                       IPAddress 169.254.0.0 ;
        SnmpMibObject docsDevFilterIpDmask.18                      IPAddress 255.255.0.0 ;
        SnmpMibObject docsDevFilterIpStatus.18                      Integer 4 ;
        SnmpMibObject docsDevFilterIpControl.19                     Integer 1 ;
        SnmpMibObject docsDevFilterIpDaddr.19                       IPAddress 204.152.64.0 ;
        SnmpMibObject docsDevFilterIpDmask.19                      IPAddress 255.255.254.0 ;
        SnmpMibObject docsDevFilterIpStatus.19                      Integer 4 ;    
    ";

    $sth1=$dbh->prepare("select inet_ntoa(segment) from staff where vg_id=$row[0]");
        $sth1->execute() or die "Cannot execute: ".$sth1->errstr();

        $cpe = "    SnmpMibObject mib-2.69.1.7.1.0                   Integer 1 ;          /* doscDevCpeEnroll */";
        $n=0;
        while(@row1=$sth1->fetchrow_array) {

            $cpe = $cpe . "
        SnmpMibObject mib-2.69.1.7.3.1.3.$row1[0]         Integer 4;           /* docsDevCpeStatus */
    ";
            $n++;
        }
        $cpe = "SnmpMibObject mib-2.69.1.7.2.0                   Integer $n ;          /* docsDevCpeIpMax */
    " . $cpe;
        $string=$string.$cpe."}";

        open(F,">$config") or die "Can not open file:".$config;
        print F $string;

        $row[1] =~ s/://g;


        `/usr/local/bin/docsis -e $config /var/tmp/keyfile ${prefix}/var/cm/$row[1].cm`;

        close(F);

        print "$row[1] **\n";

    }

    #`rm ${prefix}/var/tmp/docsis-$s*`;
    `rm /tmp/tmp.*`;

    $sth->finish();

    $dbh->disconnect;



    Для корректной работы скрипта с АСР LANBilling 1.9, необходимо произвести следующие настройки:

    В скрипты vg.create, vg.edit вставляем следующий код (в строке, содержащей "DBI->connect" исправляем параметры доступа к серверу БД).
    Для учетных записей агента Netflow, который будет проводить тарификацию трафика, создаем дополнительное текстовое поле 'modem_mac', в котором указываем MAC-адрес клиентского оборудования.
    В раздел назначенных учетной записи IP-адресов добавляем все адреса, используемые клиентом, с маской 32.

    С уважением, Игорь Алов

    Заместитель генерального директора
    по техническим вопросам
    Группа компаний МТС
    ЗАО "Теликс"






    В начало страницы