ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архивные статьи в категории ‘Программинг’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

В ряде задач администрирования требуется получать сообщения по какому-либо событию. Например, в мониторинге при падении/поднятии сервера/сервиса, канала и т.п.
Получать письма на e-mail неактуально, т.к. по себе знаю, хоть почта и проверяется раз в 5 минут, но заглядываю туда гораздо реже. Хотелось бы получить, чтото вроде всплывающих сообщений на экран/мобильник, тогда они точно не останутся без внимания, а также, чтоб эти сообщения приходили без задержки (ну или с минимальной задержкой). Таким условиям удовлетворяют 2 способа доставки сообщений:

Способ 1.

SMS и GSM-модем. Плюсы: сообщение получишь, даже если сидишь в сортире)). Недостатки: покупка/выбор мопеда. Не каждый мопед поедет под FreeBSD. Стоимость от 100 вечнозеленых буказоидов, да и за сами смс-ки придется платить. Тут уж как никак а раскошелиться придется.

Способ 2.

Сервис ICQ и ему подобные. Плюсы: минимум затрат, а в случае подключения мобильника — получаешь плюсы от первого способа. Недостатки: для получения смс на мобилу — нужна соответствующая мобила, которая это поддерживает.

Второй способ более привлекательный, как менее затратный. Самый простой в использовании протокол, как оказалось Jabber, вот его то мы и заюзаем.

Практика:

Первое, что необходимо сделать это создать аккаунт в джабере. В моем примере аккаунт регистрируем на jabber.ru

Второе:

Собираем порт /usr/ports/net-im/p5-Net-XMPP

cd /usr/ports/net-im/p5-Net-XMPP
make install clean

Существуют и другие порты для jabber, но будем использовать этот.

Третье:

Собственно сам крипт, отсылающий сообщение:

#! /usr/bin/perl

use Net::XMPP;
my $con=new Net::XMPP::Client();
$con->Connect(hostname=>"jabber.ru");
$con->AuthSend(username=>"user",
                        password=>"password",
                        resource=>"ALARM!");
my $msg=new Net::XMPP::Message();
$msg->SetMessage(to=>"reciver\@jabber.ru",
                 from=>"user\@jabber.ru",
                 body=>"My First Jabber Message From FreeBSD");
$con->Send($msg);
$con->Disconnect();

Логика скрипта проста. Коннектимся к серверу, отсылаем сообщение и дисконнект:

  1. user@jabber.ru — авторизуется на jabber.ru
  2. user (user@jabber.ru) — отсылает сообщение («My First Jabber Message From FreeBSD«) для reciver (reciver@jabber.ru)
  3. user@jabber.ru — отключается от jabber.ru

Для того, чтобы рассылать сообщение нескольким абонентам, можно создать чат-группу, тогда сообщение посланное кому-то одному, будет переслано всем остальным в группе.

Можно прикрутить русский язык, но об этом позже 🙂 если дойдут руки.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: folio
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Очень часто у новичков возникает вопрос:

«Что нужно настроить на Cisco Catalyst с нуля?»

или встречается запрос в google:

«Скачать дефолтовый конфиг для Cisco Catalyst»

или

«catalyst 2960 2950 3560 ip адрес по умолчанию»

или

«как настроить cisco catalyst «

Попробую немного помочь этим людям 🙂

  1. Дефолтовых конфигов не бывает, т.к. у каждого своя сеть и свои «правила»
  2. Нету у Cisco IP-адреса по умолчанию (это же не Dlink), все настраивается ручками и сначала через консоль.

Итак, попробуем разобраться в том, что желательно настроить на нулевом Cisco Catalyst ?

Например, часто встречающиеся:

  • Cisco Catalyst 2950
  • Cisco Catalyst 2960
  • Cisco Catalyst 3550
  • Cisco Catalyst 3560
  • Cisco Catalyst 3560G

Я использовал Cisco Catalyst 3560G

0. Подключаемся к cisco по консольному кабелю через com порт:

FreeBSD через com порт:

cu -l /dev/cuad0

FreeBSD через переходник USB->Com:

  • kldload uplcom.ko
  • kldstat | grep uplcom (убедиться что подгрузился)
  • подключить переходник к USB порту
  • cu -l /dev/cuaU0

в Windows можно использовать Hiper Terminal для подключения к com порту

1. Зададим пароль на enable режим

Switch> enable

Switch# configure terminal

Switch(config)# enable password my-secret-password

2. Установим пароль для входа по telnet

Switch(config)# line vty 0 15

Switch(config-line)#password my-telnet-password

3. Сразу разрешим вход по telnet

Switch(config-line)# login

Switch(config)# exit

4. Зашифруем пароли, чтобы по sh run они не показывались в открытом виде

Switch(config)# service password-encryption

5. Зададим имя девайсу, например будет c3560G

Switch(config)# hostname c3560G

6. повесим / присвоим IP-адрес нашему девайсу

c3560G(config)# interface vlan 1

c3560G(config-if)# ip address 192.168.1.2 255.255.255.0

c3560G(config-if)# exit

7. Если вы ошибетесь при наборе чего либо в консоле, то циска начнет пытаться это отрезолвить, чем заставляет вас ждать, выключим эту фичу

c3560G(config)# no ip domain-lookup

8. Зададим имя домена

c3560G(config)# ip domain-name my-domain.ru

9. Зададим IP-адрес DNS сервера

c3560G(config)# ip name-server 192.168.1.15

10. Зададим время

если у вас есть доступный NTP сервер

c3560G(config)# ntp server 192.168.1.1 version 2 source vlan 1

c3560G(config)# ntp clock-period 36029056

c3560G(config)# ntp max-associations 1

где 192.168.1.1 — это IP-адрес NTP сервера

а используя «добавку» source vlan вы можете четко задать номер vlan с IP которого будет отправляться NTP запрос

если нет NTP сервера, то можно задать время вручную, но для этого придется выйти из режима конфигурирования

c3560G(config)# exit

c3560G# clock set 20:00:50 23 Aug 2008

11. Зададим переход с зимнего на летнее время и наоборот

c3560G# configure terminal

c3560G(config)# clock timezone MSK 3

c3560G(config)# clock summer-time MSD recurring last Sun Mar 2:00 last Sun Oct 2:00

12. Сделаем так, чтобы по команде show logging отображалось нормальное время, а не кол-во дней и т.п.

c3560G(config)# service timestamps log datetime localtime

13. Зададим дефолтовые настройки сразу всем портам на девайсе (у меня catalyst 24 порта + 4 SFP)

c3560G(config)# interface range gi 0/1 — 28

c3560G(config-if-range)# description not_used

c3560G(config-if-range)# shutdown

c3560G(config-if-range)# no cdp enable

c3560G(config-if-range)# switchport nonegotiate

c3560G(config-if-range)# switchport mode access

c3560G(config-if-range)# exit

Рекомендую: все неиспользуемые порты держать выключенными, а ещё лучше создать влан (например 999) и все выключенные порты переместить в него:

c3560G(config)# vlan 999

c3560G(config-vlan)# name unused_ports

c3560G(config-vlan)# shutdown

c3560G(config-vlan)# exit

c3560G(config)# interface range gi 0/1 — 28

c3560G(config-if-range)# description not_used

c3560G(config-if-range)# shutdown

c3560G(config-if-range)# no cdp enable

c3560G(config-if-range)# switchport nonegotiate

c3560G(config-if-range)# switchport access vlan 999

c3560G(config-if-range)# switchport mode access

c3560G(config-if-range)# exit

14. Выключим web-интерфейс, командная строка рулит 😉

c3560G(config)# no ip http server

15. Зададим gateway по умолчанию (допустим это будет 192.168.1.1, т.к. мы присвоили девайсу IP 192.168.1.2/255.255.255.0)

c3560G(config)# ip default-gateway 192.168.1.1

16. Если этот свич будет моддерживать маршрутизацию (будет router`ом), то включим функцию маршрутизации (если это позволяет сам девайс и его прошивка)

3560G прекрасно справляется с функцией маршрутизации

c3560G(config)# ip routing

c3560G(config)# ip classless

c3560G(config)# ip subnet-zero

17. Если вы выолнили пункт 16-ть, то снова необходимо задать gateway по умолчанию, но уже другой командой

c3560G(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.1

18. Настроим access-list для доступа к свичу только с определенных IP-адресов

c3560G(config)# ip access-list standard TELNET

c3560G(config-std-nacl)# permit 192.168.1.1

c3560G(config-std-nacl)# permit 192.168.1.15

c3560G(config-std-nacl)# exit

19. Применим этот access-list

c3560G(config)# line vty 0 15

c3560G(config-line)# access-class TELNET in

20. Зададим timeout неактивности telnet сессии, по истечении указанного времени, если вы в консольке ничего не вводили, то telnet соединение будет автоматически закрываться

c3560G(config-line)# exec-timeout 5 0

c3560G(config-line)# exit

21. Включим SNMP, но только read only (RO) и доступность только с хоста 192.168.1.1

c3560G(config)# snmp-server community RO-MY-COMPANY-NAME RO

c3560G(config)# snmp-server trap-source Vlan1

c3560G(config)# snmp-server source-interface informs Vlan1

c3560G(config)# snmp-server location SWITCH-LOCATION

c3560G(config)# snmp-server contact my-email@my-domain.ru

c3560G(config)# snmp-server host 192.168.1.1 RO-MY-COMPANY-NAME

c3560G(config)# exit

22. Ну и наконец сохраним свои труды

c3560G# copy running-config startup-config

или можно проще и короче 🙂

c3560G# wri

Море документации по catalyst`ам, и не только по ним, вы можете найти, ессно, на сайте производителя: www.cisco.com

23. Если хочется включить на девайсе ssh, чтобы подключаться к cisco по ssh (если это позволяет установленный IOS), то выполним следущее:

а) Обязательно указываем имя домена (необходимо для генерации ключа) см. пункт 8.

б) cisco(config)# crypto key generate rsa

в) cisco(config)# line vty 0 15

г) cisco(config)# transport preferred none

д) cisco(config)# transport input ssh

е) cisco(config)#transport output ssh

Подробнее по настройке ssh: Configuring Secure Shell on Routers and Switches Running Cisco IOS

24. Устранение критической уязвимости в коммутаторах Cisco, которой подвержен Smart Install (работает по TCP порт 4786).
cisco(config)#no vstack
Затем убедиться что сиё зло отключилось, команда:
cisco#show vstack config

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Configuring Secure Shell on Routers and Switches Running Cisco IOS
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 18, среднее: 4,83 из 5)
Загрузка...
Отправить на почту Отправить на почту

Предыстория

Однажды возник вопрос о том, как оперативно получать информацию о состоянии сети, когда находишься не у рабочего места.
Путем нехитрых размышлений был найден единственный выход: отсылка SMS-сообщений системой мониторинга о ключевых событиях.

Для реализации этого проекта были куплены GSM модем Siemens MC35i и 1-портовый асинхронный сервер Moxa NPort-5110, обеспечивающий преобразование интерфейса RS-232 в Ethernet и конечно же сервер под FreeBSD 🙂

Moxa NPort-5110 был приобретен для цели отсылки SMS-сообщений из любого сегмента сети, а не только с машины, к которой подключен GSM-шлюз.

Теория с примерами

Итак, конфигурация схемы следующая:

GSM модем включен в Moxa NPort-5110 кабелем RS-232.

Moxa имеет адрес 10.100.0.2:4001. Для отправки сообщения на латинице нужно выполнить следующую последовательность команд на модеме:

telnet 10.100.0.2 4001
AT+CPIN=7256
OK
AT+CMGF=1
OK
AT+CMGS="+79101234567"
>test,test,testCTRL+Z
+CMGS 

где CTRL+Z — комбинация клавиш, нажатие которой означает конец сообщения.

С отправкой сообщения «Ахтунг!» на кириллице на номер +79101234567 все сильно сложнее, т.к. сообщение должно уходить пакетом в формате PDU в кодировке UCS2 (юникодная кодировка, поддерживающая в том числе кириллицу), а потому рассмотрим этот случай подробнее.

Пример:

telnet 10.100.0.2 4001
AT+CPIN=7256
OK
AT+CMGF=0
OK
AT+CMGS=28
>0011000B919701214365F70018C10E0410044504420443043D04330021CTRL+Z
+CMGS

Разберем поподробнее эту «кашу»:

AT+CMGF=0 - установка модема в PDU-режим
AT+CMGS=28 - длина строки пакета /2 -1
0011000B919701214365F70018C10E0410044504420443043D04330021 - сам PDU пакет

Формат PDU-пакета представляет собой 16-ричную последовательность, передающуюся человекочитаемой строкой (не ASCII-представления самих 16-ричных чисел). Оригинал описания (сохраненная копия) формата PDU пакета (на английском).

Перевод и коментарии:
00 Длина и номер SMS-центра провайдера. у нас — дефолтный из настроек GSM
11 Сообщение SMS-Submit (сохраненная копия)
0B Длина телефонного номера получателя (количество цифр в нем — в нашем случае 11)
91 Тип телефонного номера получателя (у нас получается «международный тип с планом нумерации Е.164/E.163) (сохраненная копия)
6 байт телефонный номер получателя (кодировка описана ниже)
00 Протокол (00 — SMS) (сохраненная копия)
18 Кодирование данных (08=UCS2,00-latin 7 bit etc. Старший байт — не сохранять в истории получателя) (сохраненная копия)
С1 Доставка актуальна 1 неделю (как рассчитывается) (сохраненная копия)
0E Длина сообщения («байт». длина символов кодированной UCS2-строки/2)
xx байт Кодированное сообщение (текст в UCS2, 16-ричное представление)

по-порядку подробней:

  • первый байт на некоторых телефонах передавать не следует (работа возможна только через SMS-центр провайдера, телефон другого не умеет)
  • номер получателя (алгоритм создавали наркаманы). кодируется «как есть» путем переставления местами соседних цифр, «добивается» до длины в 12 символов символами «F». например номер доблестной советской милиции (02 кто забыл) кодируется как 20FFFFFFFFFF, а номер из нашего примера (+79101234567) — как 9701214365F7. З.Ы. Не забывайте что длина SMS-сообщения ограничена, в кодировке UCS2 70-ю символами, на латинице — 160-ю символами.

Кодирование отправки SMS сообщений на PHP

<?

//Массив с параметрами GSM шлюза
$init=array('ip'=>"10.100.0.2",'port'=>'4001','pin'=>'7256'); 
// Отправка СМС :)
send_sms("Это тест","9101234567");
//Функция отсылки СМС
//$mess - сообщение
//$mob - номер мобильного в формате ХХХУУУУУУУ
//$debug - 1 - выводить отладочную инфу, 0 - нет
function send_sms($mess,$mob,$debug=0){
    global $init; 
    //Если сообщение и номер мобильника не пустые.
    //Проверку правильности формата мобильника возлагается на вас ;-) 
    if ($mess && $mob){
           $len=strlen($mess);
           $mob="7".$mob;
           $ooo="";
           if (preg_match('/^([x0Ax0Dx20-x7F]+)$/',$mess,$tmp)){
                if ($len<=160){
                      $len=0;
                      print "8-bit encoded SMS<br>";
                }else{
                      print "Длина сообщения в 8-битной кодировке [$len] больше 160 символов!<br>n";
                      return -1;
                }
           }else{
                if ($len<=70){
                     $mess=cp1251_2ucs2($mess);
                     $ret.="00";//it is only an indicator of the length of the SMSC information supplied (0)
                     $ret.="11"; //First octet of the SMS-SUBMIT message.
                     $ret.="00"; //TP-Message-Reference. The "00" value here lets the phone set the message reference number itself.
                     $ret.="0B"; // Address-Length. Length of phone number (11)
                     $ret.="91"; //Type-of-Address. (91 indicates international format of the phone number).
                     // Начало кодирования номера мобильного
                     if ((strlen($mob)/2)%2){
                           $mob.="F";
                     }
                     for ($i=0;$i<strlen($mob);$i+=2){
                              $ret.=$mob[$i+1].$mob[$i];
                     }
                     // Закончили взрывать мозг :)
                     $ret.="00"; //TP-PID. Protocol identifier
                     $ret.="18"; //TP-DCS. Data coding scheme. 18 - don't save at history, 08 - save
                     $ret.="C1"; //TP-Validity-Period. C1 means 1 week
                     $ret.=sprintf("%02X",strlen($mess)/2); //TP-User-Data-Length. Length of message.
                     $ret.=$mess; //TP-User-Data $ret.=chr(26); //end of TP-User-Data
                     $len=sprintf ("%s",(strlen($ret)-3)/2);
                     $mess=$ret;
                     print "16-bit encoded SMS<br>";
                }else{
                     print "Длина ссобщения в 16-битной кодировке [$len] больше 70 символов!<br>n";
                     return -1;
                }
           }
           // Создаем сокет
           $socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
           if (!$socket) {
                err($socket);
           }else{
                // Устанавливаем опцию таймаута в 5 секунд для сокета.
                // Проверка на удачную установку лежит на вас :)
                socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>5,"usec"=>0));
                // Устанавливаем соединение на сокет
                $result = @socket_connect($socket, $init['ip'], $init['port']);
                if (!$result) {
                     err($socket);
                } else {
                     // Инициализируем GSM шлюз
                     $out=sms_init($socket,$len,$debug);
                     if ($len){
                          // Сообщение на кириллице
                          $out.=raw($socket,"AT+CMGS=$len",">");
                     }else{
                          // Сообщение на латинице
                          $out.=raw($socket,sprintf("AT+CMGS="+%s"",$mob),">");
                          $mess.=chr(26);
                     }
                     $out.=raw($socket,$mess,"CMGS",$debug);
                     if ($debug){
                          printf ("<pre>[ %s ]</pre>",$out);
                     }
                }
                @socket_close($socket);
           }
     }
     return $out;
} 
// Функция начальной инициализации модема
// $socket - ресурс сокета
// $type - 0 - сообщение на латинице, 1 - на кириллице
// $debug - 1 - выводить отладочную инфу, 0 - нет
function sms_init($socket,$type,$debug=0){
    global $init;
    $out=raw($socket,"AT","OK",$debug);
    $out.=raw($socket,sprintf("AT+CPIN=%s",$init['pin']),'(ERROR)|(OK)',$debug);
    $out.=raw($socket,sprintf("AT+CMGF=%d",$type?0:1),"OK$",$debug);
    if ($debug){
         print "<pre><font color="green">$out</font></pre><br>";
    }
    return $out;
}

// Функция посылки комманды на GSM шлюз
// $socket - ресурс сокета
// $write - команда, передаваемая GSM шлюзу
// $delim - последовательность, означающая окончание чтения ответа с GSM шлюза
// $debug - 1 - выводить отладочную инфу, 0 - нет
function raw($socket,$write,$delim,$debug=0){
    $ooo='';
    $write.="\r\n";
    if (@socket_write($socket,$write,strlen($write))===false){
        err($socket);
    }else{
        while ($out = @socket_read($socket, 2, PHP_NORMAL_READ)) {
           if ($out===false){
               err($socket);
           }else{
               if ($debug){
                   print $out;
                   flush();
               }
               $ooo=sprintf("%s%s",$ooo,$out);
           }
           if (preg_match("/".$delim."/i",$ooo,$tmp)){
               if ($debug){
                   print_r($tmp);
                   flush();
               }
               break;
           }
        }
     }
     usleep(100000);
     return $ooo;
} 
// Функция вывода ошибки при работе с сокетом
// $soc - ресурс сокета
function err($soc){
    printf ("<script>alert ('Ошибка: %s');</script><font color=red><b>%s: [%s]</b></font><br>",
    socket_strerror(socket_last_error($soc)),"Ошибка",socket_strerror(socket_last_error($soc)));
} 
// Функция кодирования кириллицы из CP1251 в UCS2
// $str - строка для перекодирования
function cp1251_2ucs2($str){
    for ($i=0;$i<strlen($str);$i++){
        if (ord($str[$i]) < 127){
            $results = sprintf("%04X",ord($str[$i]));
        }elseif (ord($str[$i])==184){ //ё
            $results="0451";
        }elseif (ord($str[$i])==168){ //Ё
            $results="0401";
        }else{
            $results = sprintf("%04X",(ord($str[$i])-192+1040));
        }
        $ucs2 .= $results;
    }
    return $ucs2;
}
// Функция вывода отладочной инфы
function debug($array){
    ob_start("get_vars");
    print_r($array);
    ob_end_flush();
} 
// Функция output_callback для функции debug()
function get_vars($buffer){
    return sprintf ("<div style="padding: 3px; border: 2px #88bbbb solid; color: #00dd00; background-color: #bbffbb; font-weight: bold; text-align: left;"><pre>%s</pre></div>",
    htmlspecialchars($buffer));
}

?>

Декодирование принятых SMS сообщений на PHP

 Отлично, с отсылкой СМС разобрались, осталось чтение сообщений (как обычно, с 8-битной кодировкой проблем нет, есть только с нашей кириллицей).

Команды для чтения SMS с GSM модемов:

at+cmgf=1 — выводить сообщения в неупакованном (читабельном) виде
at+cmgl=»all» — вывести сообщения
at+cmgr=n — прочитать отдельное сообщение
at+cmgd=n — удалить сообщение с SIM-карты
Сам прием СМС сообщений с GSM шлюза не сильно отличается от передачи (на основе вышеприведенной отправки предлагается вам самостоятельно реализовать это. Опишу только функцию для преобразования сообщения с «тарабарского» на русский:
<?
function ucs2_2cp1251($str){
    for ($i=0;$i<strlen($str);$i+=4){
        $char=hexdec($str[$i].$str[$i+1].$str[$i+2].$str[$i+3]);
        if ($char>126){
            if ($char==1105){
                $char=184; //ё
            }elseif($char==1025){
                $char=168; //Ё
            }elseif ($char>=848){
                $char-=848;
            }
        }elseif(!$char){
            $char=32;
        }
        $ret.=chr($char);
    }
    return $ret;
}
?>
Источники:
1. О виджетах и гаджетах
2. SMS and PDU format
3. IXBT.ru
4. Связывание мобильника и FreeBSD через bluetooth (c п.1 по п.6 включительно)

Ссылки:
З.Ы. Этот материал можно использовать и при отсылке СМС через обычный мобильник. Разница в том,
что вместо сетевого сокета нужно использовать устройство FreeBSD /dev/ttyU0 (при подключении через USB
кабель) либо /dev/ttypf (выполнив перед этим команду rfcomm_sppd -a MAC_адрес_телефона -t /dev/ttypf &).
О связывании мобильника и FreeBSD через bluetooth смотри выше "Источники".

З.З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 10, среднее: 4,60 из 5)
Загрузка...
Отправить на почту Отправить на почту

Trafd — демон учета трафика в FreeBSD.

Вопрос:

Я обнаружил, что у меня trafd сбрасывает инфу в /usr/local/var/trafd.
При попытке посмотреть traflog -i xl0 пишется :

traflog: WARNING: table too big to fit into memory

Подскажите как довести до ума работу trafd ?

Ответ:

По умолчанию сохраняется в /usr/local/var/trafd.

Для traflog нужны файлы которые получаются после того как отрабатывает:

trafdump IFACE_NAME
trafsave IFACE_NAME

После выполнения этих команд файлы и сохраняются в /usr/local/var/trafd

Например:

bge1 — название интерфейса на котором trafd собирает трафик (IFACE_NAME)
/usr/local/var/trafd/trafd.bge1 — полученный бинарный файл с трафиком
extnew — секция конфига /usr/local/etc/traflog.format в которой описан шаблон вывода бинарных данных в текстовый вид, например:

extnew {
    from:"%-18.18s " sport:"%-6.6s "        to:"%-18.18s " dport:"%-6.6s "
    proto:"%-4.4s " bytes:"%9ld " psize:"%10ld" ftime:" %Y-%m-%d %T" ltime:" %Y-%m-%d %T\n"
};

/usr/local/bin/traflog -o extnew -i /usr/local/var/trafd/trafd.bge1 -a -n > /usr/local/var/trafd/trafd.bge1.log

Таким образом разобранный трафик окажется в файле /usr/local/var/trafd/trafd.bge1.log

Команды trafdump и trafsave необходимо выполнять довольно часто, особенно при большом кол-ве трафика проходящего через этот интерфейс, чтобы избежать потом ошибки traflog: WARNING: table too big to fit into memory при обработке трафика.

Выход:

В файл /etc/crontab дописать:

*/5 * * * * * * root /usr/local/bin/trafdump IFACE_NAME; sleep 2; /usr/local/bin/trafsave IFACE_NAME

заменив IFACE_NAME на имя интерфейса на котором слушает trafd

Потом использовать небольшой скриптик на PERL:

/usr/local/sbin/scripts/trafd_move.pl

#!/usr/bin/perl

$srclogdir="/usr/local/var/trafd";
$dstdir="/usr/local/var/trafd/log";
$passeddir="/usr/local/var/trafd/passed";
$filemask=".IFACE_NAME";
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());

opendir DIR,$srclogdir or die "Can't open logdir\n";
my @sorted=grep /$filemask/, readdir DIR;# or print "Trafd's logdir is empty\n";
closedir DIR or print "Can't close logdir\n";
@sorted=sort @sorted;
if ($#sorted >= 0){
   for($loop=0;$loop<=$#sorted;$loop++){
     #В этом месте мы можем делать с бинарным файлом все что угодно,
     #например натравить на него traflog, а затем переместить его в другую директорию
     $newname=sprintf("trafd_%02d%02d%02d_%02d%02d%02d_%02d.log",$year+1900,$mon+1,$day,$hour,$min,$sec,$loop);
     $cmd=sprintf("/usr/local/bin/traflog -o extnew -i %s/%s -a -n > %s/%s.passed",$srclogdir,$sorted[$loop],$passeddir,$newname);
     print "$cmd\n";
     system($cmd);
     $cmd=sprintf("/bin/mv %s/%s %s/%s",$srclogdir,$sorted[$loop],$dstdir,$newname);
     print "$cmd\n";
     system($cmd);
  }
}

Не забываем делать perl скрипт исполняемым:

chmod a+x perl_script_name.pl

Данный скрипт считает все файлы с маской $filemask в директории $srclogdir, затем он выполнит traflog и результат положит в $passeddir, а затем переместит бинарный файл с логами в $dstdir

Имена итоговых файлов будут такими:

  1. trafd_годмесяцдень_часыминутысукунды_номерфайла.log
  2. trafd_годмесяцдень_часыминутысукунды_номерфайла.log.passed

Пример: trafd_20080530_100830_02.log

Теперь можно поправить /ect/crontab:

*/5 * * * * * * root /usr/local/bin/trafdump IFACE_NAME; sleep 2; /usr/local/bin/trafsave IFACE_NAME sleep 2; /usr/local/sbin/scripts/trafd_move.pl

Не забыв поменять IFACE_NAME на имя своего интерфейса, а так же это должно быть написано одной строкой, без переносов на новую строчку конфига /ect/crontab.

З.Ы. Если кому-нить интересно, то можем привести пример с сохранением трафика в БД Mysql и код на PHP для просмотра статистики.

Вопрос:

trafd выдает bytes и psize. psize всегда больше. Что такое bytes в trafd ? Как считает провайдер ?

Ответ:

Смотрим в /usr/local/etc/traflog.format

# bytes number of data bytes
# psize number of all bytes

Итак bytes — это счетчик только данных, а psize это все переданные данные, включая технические (установка сессии и т.п.).

Провайдеры всегда берут psize, т.к. это включает в себя весь трафик переданный от или к пользователю.

Авторы:
Николаев Дмитрий (virus (at) subnets.ru)
Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Многие ищут/спрашивают функции для проверок IP-адресов на вхождение в подсеть, итак:

Perl

#!/usr/bin/perl
# Пример вызова и проверки IP-адреса 192.168.0.4
# на принадлежность к сети 192.168.0.0 с маской 255.255.255.248
#
if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
    print "Адрес принадлежит сети\n";
}else{
    print "Адрес не входит в подсеть\n";
}
#Подпрограмма перевода IP в число
sub aton{
    my $addr=shift;
    (my $a0, my $a1, my $a2, my $a3)=split('\.',$addr);
    return $a3+($a2<<8)+($a1<<16)+($a0<<24);
}
#Подпрограмма перевода числа в IP
sub ntoa{
    my $ip=shift;
    return sprintf("%d.%d.%d.%d",
    (($ip&0xFF000000)>>24),(($ip&0xFF0000)>>16),(($ip&0xFF00)>>8),($ip&0xFF));
}
#Подпрограмма проверки вхождения IP в подсеть
sub ip_vs_net{
    my $ip=shift;
    my $network=shift;
    my $mask=shift;
    if((aton($ip)&aton($mask))==aton($network)){
        return 1;
    }else{
        return 0;
    }
}

PHP

<?
// Пример вызова и проверки IP-адреса 192.168.0.4
// на принадлежность к сети 192.168.0.0 с маской 255.255.255.248
if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
    print "Адрес принадлежит сети<BR>";
}else{
    print "Адрес не входит в подсеть<BR>";
}
function ip_vs_net($ip,$network,$mask){
   if (((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
       return 1;
   }else{
       return 0;
   }
}
?>

Функции которые переводят из CIDR в обычную маску и наоборот
<?
function cidr_2_mask($mask){
    return long2ip(pow(2,32) - pow(2, (32-$mask)));
}

function mask_2_cidr($mask){
    $a=strpos(decbin(ip2long($mask)),"0");
    if (!$a){$a=32;}
    return $a;
}
?>
Пример:
<?
     printf("%s",cidr_2_mask("24"));
     //Напечает 255.255.255.0

      printf("%s",mask_2_cidr("255.255.255.0"));
     //Напечает 24
?>

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту