Конфигурирование модема в DOCSIS

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

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

lanbilling

Рисунок 1

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

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

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

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

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

1. Включаем модем в сеть HFC;

2. Модем находит апстрим, даунстрим, проверяет соотношение сигнал/шум, настраивается и посылает dhcp запрос;

3. Сервер dhcpd получает запрос на получения IP адреса, предает модему IP адрес и специальные строки для модема (опцию tftp, log server, time server);

4. Модем получив ответ, присваивает IP адрес;

5. Модем запрашивает конфигурационный файл - «макадрес.cm» с tftp сервера, который был передан ранее и применяет его;

6. Модем готов к работе.

Ниже приведен код 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, необходимо произвести следующие настройки:

1. В скрипты vg.create, vg.edit вставляем следующий код (в строке, содержащей «DBI->connect» исправляем параметры доступа к серверу БД);

2. Для учетных записей агента Netflow, который будет проводить тарификацию трафика, создаем дополнительное текстовое поле «modem_mac», в котором указываем MAC-адрес клиентского оборудования;

3. В раздел назначенных учетной записи IP-адресов добавляем все адреса, используемые клиентом, с маской 32.

C уважением,
Игорь Алов,
Группа компаний МТС ЗАО «Теликс»,
Заместитель генерального директора по техническим вопросам