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

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

Собственно, а для чего это нужно, спросите вы? Мне это понадобилось для предоставления полных прав для одного устройства локальному администратору. На всех устройствах в сети авторизация происходит по TACACS, соответственно и ограничиваются права на выполнение тех или иных команд. Конфигурацию TACACS менять не хотелось и все надо было сделать быстро. Вот пример первоначального конфига:
aaa new-model
aaa authentication login default group tacacs+ local
aaa authorization exec default group tacacs+ local
aaa authorization commands 15 default group tacacs+ local
aaa accounting exec default start-stop group tacacs+


!
line vty 0 15
access-class 1 in
exec-timeout 60 0

Что требуется? Требуется предоставить полный доступ к одному устройству Cisco с определенного IP адреса для определенного пользователя, причем для остальных ничего не должно измениться.

Добавляем новую aaa группу:

aaa new-model
aaa authentication login default group tacacs+ local
aaa authentication login GROUP1 local
aaa authorization exec default group tacacs+ local
aaa authorization exec GROUP1 local
aaa authorization commands 15 default group tacacs+ local
aaa authorization commands 15 GROUP1 local
aaa accounting exec default start-stop group tacacs+

Добавляем нового пользователя:

username CustomUser password 7 050A0A03281F32

Создаем новый access-list, в котором разрешаем доступ с определенного IP адреса:

access-list 2 permit 111.111.111.111

И применяем все наши настройки например к vty 5

line vty 5
access-class 2 in
authorization commands 15 GROUP1
authorization exec GROUP1
login authentication GROUP1
rotary 5

Теперь человек, для которого собственно все и делалось может попасть на необходимый vty, используя следующую команду:

telnet 11.11.11.11 3005

Вход будет выполнен на vty 5.

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

Поставили как-то раз передомной задачу — установить в локальной сети медиа сервер, на условии, что он будет принимать радио со спутника и вещать его в локальную сеть.

Все бы ничего, т.к. можно поднять это и на стандартном виндовсе, но не в моем случае т.к. я уже заядлый юниксоид и программы, написанные для виндовс работают только с одной картой, а у меня их стояло аж 3.

Хотел сначала поднять на FreeBSD, но узнав, что драйвер для фрихи не существует в природе (который бы работал не только с интернет, но и с мультимедией) — пришлось искать альтернативные решения.

И так железо:

  • DVB-карты TechniSat SkyStar2 rev. 2.8a — 2 штуки
  • TechnoTrend S-1401

ПО сервера:

  • Linux Ubuntu — Server 9.04
  • linux-source
  • linux-headers
  • linux-image
  • libncurses5
  • make
  • dvb-apps
  • разрабатываемые драйвера и программу getstream с сайта linuxtv.org

ПО-клиента:

  • ОС *nix/windows/MacOS
  • проигрыватель vlc или любой другой поддерживающий воспроизведение TS-потока

Я расскажу как настроить 3 dvb-карты на прием каналов с 3х спутников и вещать эти каналы в локальную сеть. Описание будет очень подробным.
Теперь по порядку.

1. Устанавливаем Ubuntu 9.04 (я взял в серверной версии т.к. все равно ничего кроме радио на нем работать не будет, да и работать за ним я не особо собираюсь).

Процесс установки я описывать не буду. По окончании установки устанавливаем программы:

  • linux-source
  • linux-headers
  • linux-image
  • libncurses5
  • make

это основные пакеты, без которых драйвера не установятся.

2. Скачиваем разрабатываемые драйвера с linuxtv.org, распаковываем, далее выполняем:

  • make all
  • make install

процесс долгий, т.к. будут пересобираться все драйвера, для всех карт. По окончании установки драйверов необходимо перезагрузиться.

3. Перезагрузившись проверяем встали ли сами драйвера. Выполняем:

ls /dev/dvb

Если появился список устройств то все хорошо. Если нет, то подкружаем модули ядра.

#depmod -a
затем
#modprobe <имя-модуля>

в нашем случае:

#modprobe b2c2
#modprobe SkyStar2

4. Теперь устанавливаем пакеты dvb-apps и getstream:

sudo apt install get dvb-apps getstream

5. Далее выполним 2 команды, что позволит нам дать доступ к /dev/dvb:

$sudo gpasswd -a audio
$sudo gpasswd -a video

Это если вы не хотите чтобы у вас радио запускалось от рута, а если вас не пугает нарушение идеологии Убунту, то можно и не выполнять это.

6. Создаем файл конфигурации (в любом удобном вам месте) для scan (приложение входит в состав dvb-apps), в котором указываем частоту, поляризацию, символьную скорость и FEC:

S 11671000 H 18200000 5/6

S — является произвольной буквой. Устанавливать её обязательно.

7. Запускаем скрипт с целью проверки параметров настройки:

$ scan -a 0 90

Если все правильно прописано, то должен появиться список программ/сервисов, находящихся на транспондере.

scanning 90
using ‘/dev/dvb/adapter0/frontend0’ and ‘/dev/dvb/adapter0/demux0’
initial transponder 11671000 H 18200000 5
>>> tune to: 11671:h:0:18200
DVB-S IF freq is 1921000
Network Name ‘RuSat Satellite Network’
0x0000 0x0834: pmt_pid 0x0000 SNT — Silver Rain (running)
0x0000 0x0835: pmt_pid 0x0000 SNT — Nashe radio (running)
0x0000 0x0837: pmt_pid 0x0000 SNT — Radio Teos (running)
0x0000 0x0b54: pmt_pid 0x0000 Scopus — SevenSkies (running)
dumping lists (4 services)
Silver Rain:11671:h:0:18200:0:2102:2100
Nashe radio:11671:h:0:18200:0:2104:2101
Radio Teos:11671:h:0:18200:0:2108:2103
SevenSkies:11671:h:0:18200:0:2902:2900
Done.

8. Теперь приступаем к настройке getstream. Данная программа может вещать как по tсp , так и по udp.
Я настраивал для http (8080/tcp). Средняя загруженность канала для одного принимающего ~270 кбит/с.

Настройка довольно гибкая тем, что имея 2 и более dvb-карт их все можно описать в одном файле конфигурации.

Если есть каналы, которые вы не хотели бы вещать по тем или иным причинам, то можно не указывать pid (Packet ID — идентификационный номер пакета на спутнике, пакетом является набор программ находящихся на одной частоте, символьной скорости, поляризации и FEC одновременно) канала в файле конфигурации.

Вот общий шаблон файла конфигурации для getstream:

указываем порт, на который будет происходить вещание:

http{
         port ****;
};

перечисляем настройки карты на спутник и прием:

adapter N {

};

перечисляем параметры потока, который будет вещаться в сеть, описываем входные данные и исходящий адрес url.

stream {

};

На этом собственно все.

Пример конфига на прием каналов с одного транспондера:

http{
       port 8080;
};

adapter 0 {
       packet-buffer 50;
       stat-interval 120;

       dvb-s {
          lnb {
              lof1  9750000; #Нижний предел
              lof2 10600000; #Верхний предел
              slof 11700000; #Частота переключения
          };
          transponder { 			#описываем транспондер
                 frequency 11671000;	#Частота приема
                 polarisation v;	    	#поляризация
                 symbol-rate 18200000; 	#символьная скорость
          };
       };
       #начало описания потока
       stream {
                name "Serebryany Dozhd";	#имя потока

                     #входные данные потока
                     input {
                         pnr 2100;		#pid пакета на спутнике
                     };

                     #выходные данные для потока
                     output-http {
                             url /serebryany_dozhd;		#URL адрес, на который будет вещаение
                     };
       };

       #ниже идет описание оставшихся 3х каналов, вещаемых с этого транспондера.
       stream {
             name "Nashe Radio";
             input {
                     pnr 2101;
             };
             output-http {
                     url /nashe_radio;
             };
       };

       stream {
             name "Radio Teos";
             input {
                   pnr 2103;
             };
             output-http {
                   url /radio_teos;
              };
        };

        stream {
             name "Seven Skies";
             input {
                 pnr 2900;
             };
              output-http {
                  url /seven_skies;
              };
        };
};

Вот конфиг на прием с 2х транспондеров:

http{
      port 8080;
};

adapter 2 {
         packet-buffer 50;
         stat-interval 120;

         dvb-s {
            lnb {
                   lof1  9750000;
                   lof2 10600000;
                   slof 11700000;
            };
            transponder {
                   frequency 11050000;
                   polarisation v;
                   symbol-rate 3300000;
            };
         };

         stream {
             name "BuisnesFM";
             input {
                 pnr 1;
             };
             output-http {
                 url /buisnesfm;
             };
         };

         stream {
             name "HumorFM";
             input {
                 pnr 2;
             };
              output-http {
                  url /humorfm;
              };
         };

         stream {
             name "Pomestnoe radio";
             input {
                 pnr 3;
             };
             output-http {
                 url /pomestnoe;
             };
         };

         stream {
             name "KinoFM";
             input {
                 pnr 4;
             };
             output-http {
                 url /kinofm;
             };
         };

          stream {
               name "Record";
               input {
                   pnr 5;
               };
               output-http {
                   url /record;
               };
          };

           stream {
                name "Miliceyskaya volna";
                input {
                    pnr 6;
                };
                output-http {
                     url /miliceyskaya_volna;
                };
           };
           ##и т.д. по остальным каналам
};

adapter 0 {
         packet-buffer 50;
         stat-interval 120;

         dvb-s {
              lnb {
                      lof1  9750000;
                      lof2 10600000;
                      slof 11700000;
              };
              transponder {
                   frequency 11671000;
                   polarisation v;
                   symbol-rate 18200000;
              };
         };

         stream {
              name "Serebryany Dozhd";
              input {
                  pnr 2100;
              };
              output-http {
                   url /serebryany_dozhd;
              };
         };

         stream {
             name "Nashe Radio";
             input {
                 pnr 2101;
             };
             output-http {
                 url /nashe_radio;
             };
         };

         stream {
             name "Radio Teos";
             input {
                 pnr 2103;
             };
             output-http {
                 url /radio_teos;
             };
         };

         stream {
             name "Seven Skies";
             input {
                pnr 2900;
             };
             output-http {
                 url /seven_skies;
             };
         };
};

Для 3х транспондеров, думаю, не составит труда описать.

9. Далее запускаем getstream. Используем команду:

$getstream -c /path/to/file -d

Ключ -d обозначает режим отладки и следовательно будет выводить всю информацию, и даже тех, кто подключился к серверу и на какую станцию.

Пример:

$ getstream -c getstr -d

 2009-06-17 09:09:42.167 fe: Adapter 2 Setting up frontend tuner
2009-06-17 09:09:42.182 fe: DVB-S tone = 1
2009-06-17 09:09:42.182 fe: DVB-S voltage = 0
2009-06-17 09:09:42.182 fe: DVB-S diseqc = 0
2009-06-17 09:09:42.182 fe: DVB-S freq = 11050000
2009-06-17 09:09:42.182 fe: DVB-S lof1 = 9750000
2009-06-17 09:09:42.182 fe: DVB-S lof2 = 10600000
2009-06-17 09:09:42.182 fe: DVB-S slof = 11700000
2009-06-17 09:09:42.182 fe: DVB-S feparams.frequency = 1300000
2009-06-17 09:09:42.182 fe: DVB-S feparams.inversion = 2
2009-06-17 09:09:42.182 fe: DVB-S feparams.u.qpsk.symbol_rate = 3300000
2009-06-17 09:09:42.183 dmx: Setting filter for pid 8192 pestype 20
2009-06-17 09:09:42.191 fe: Adapter 0 Setting up frontend tuner
2009-06-17 09:09:42.205 fe: DVB-S tone = 1
2009-06-17 09:09:42.205 fe: DVB-S voltage = 0
2009-06-17 09:09:42.205 fe: DVB-S diseqc = 0
2009-06-17 09:09:42.205 fe: DVB-S freq = 11671000
2009-06-17 09:09:42.205 fe: DVB-S lof1 = 9750000
2009-06-17 09:09:42.205 fe: DVB-S lof2 = 10600000
2009-06-17 09:09:42.206 fe: DVB-S slof = 11700000
2009-06-17 09:09:42.206 fe: DVB-S feparams.frequency = 1921000
2009-06-17 09:09:42.206 fe: DVB-S feparams.inversion = 2
2009-06-17 09:09:42.206 fe: DVB-S feparams.u.qpsk.symbol_rate = 18200000
2009-06-17 09:09:42.206 dmx: Setting filter for pid 8192 pestype 20
2009-06-17 09:09:42.255 fe: Adapter 2 Status: 0x01 (HAS_SIGNAL)
2009-06-17 09:09:42.255 fe: Adapter 0 Status: 0x01 (HAS_SIGNAL)
2009-06-17 09:09:42.322 fe: Adapter 2 Status: 0x1f (HAS_SIGNAL HAS_CARRIER HAS_VITERBI

HAS_SYNC HAS_LOCK)
2009-06-17 09:09:42.352 fe: Adapter 0 Status: 0x1f (HAS_SIGNAL HAS_CARRIER HAS_VITERBI

HAS_SYNC HAS_LOCK)
2009-06-17 09:10:04.864 stream_http: connection from 10.10.10.99 for /buisnesfm
2009-06-17 09:11:42.183 dvr: inputstats: 44 pids 2722 pkt/s 511919 byte/s
2009-06-17 09:11:42.209 dvr: inputstats: 41 pids 14461 pkt/s 2718743 byte/s
2009-06-17 09:11:58.691 stream_http: connection from 192.168.1.36 for /buisnesfm
2009-06-17 09:12:04.192 stream_http: dropping connection to 192.168.1.36 for /buisnesfm
2009-06-17 09:12:04.253 stream_http: connection from 192.168.1.36 for /miliceyskaya_volna
...

На этом настройка getstream закончена.

10. Теперь создадим плейлист формата m3u, для удобства приема пользователями вещаемых каналов.

Приведу просто его листинг:

#EXTM3U
#EXTINF:-131,Business FM
http://10.10.254.254:8080/buisnesfm
#EXTINF:-131,Humor FM
http://10.10.254.254:8080/humorfm
#EXTINF:-131,Pomestnoe
http://10.10.254.254:8080/pomestnoe
#EXTINF:-131,Kino FM
http://10.10.254.254:8080/kinofm
#EXTINF:-131,Record
http://10.10.254.254:8080/record
#EXTINF:-131,Miliceyskaya volna
http://10.10.254.254:8080/miliceyskaya_volna
#EXTINF:-131,City FM
http://10.10.254.254:8080/cityfm
#EXTINF:-131,NRJ
http://10.10.254.254:8080/radio_nrj
#EXTINF:-131,Relax FM
http://10.10.254.254:8080/relaxfm
#EXTINF:-131,Radio Alla
http://10.10.254.254:8080/radio_alla
#EXTINF:-131,Metro FM
http://10.10.254.254:8080/metro_fm
#EXTINF:-131,Avtoradio
http://10.10.254.254:8080/avtoradio
#EXTINF:-131,Dorozhnoe
http://10.10.254.254:8080/dorozhnoe_radio
#EXTINF:-131,Radio Vanya
http://10.10.254.254:8080/Radio_Vanya
#EXTINF:-131,Radio Record
http://10.10.254.254:8080/radio_record
#EXTINF:-131,Piter RS
http://10.10.254.254:8080/piterfm
#EXTINF:-131,Shanson
http://10.10.254.254:8080/chanson
#EXTINF:-131,Gardarika
http://10.10.254.254:8080/gardarikafm
#EXTINF:-131,Serebryany dozhd
http://10.10.254.254:8080/serebryany_dozhd
#EXTINF:-131,Nashe radio
http://10.10.254.254:8080/nashe_radio
#EXTINF:-131,Radio Teos
http://10.10.254.254:8080/radio_teos
#EXTINF:-131,Seven Skies
http://10.10.254.254:8080/seven_skies

Теперь для прослушивания радио, клиенту надо запустить vlc и добавить в него плейлист.
В моем случае загрузка канал при вещание на одного клиента составляет около 270 кбит/с.

Теперь я опишу всяческие модернизации данного конфига.
Их может быть огромное множество. Я опишу только 2.

1. Чтобы руками не отделять каждый канал от общего пакета, полученного со спутника, можно пустить в вещание и весь пакет.
Как это сделать? Нужно просто отредактировать параметр потоков до такого вида:

stream {
            name "Full";
            input {
                full;
            };
            output-http {
                url /radio; #ссылка может быть любой
            };
};

Теперь чтобы переключить на нужный канал в vlc необходимо, в главном меню, выбрать Воспроизведение -> Программа и из открывшегося списка выбрать нужную программу.

2. Вещание по UDP. Опять же нужно просто указать адрес на который будет вещание.

stream {
            name "Full";
            input {
               full;
            };
             output-udp {
                   remote-address 10.10.10.99;
                   remote-port 1234;
             sap {
                   scope global;
                   ttl 5;
                   playgroup "Free";
             };
};

Как видно нет ничего сложного.

Заключение

Программа getstream довольно гибкая в настройке и поддерживает работу как с DVB-S, так и с DVB-C и DVB-T.

Файлы примеров настроек присутствеют в папке/usr/share/doc/getstream/examples .

Также getstream поддерживает вещание видео в локальную сеть, достаточно просто указать video-pid.

Ссылки

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

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

Сегодня столкнулся с проблемой на quagga и процессом bgpd.

Перезапуск bgpd нифига не помог, т.к. процесс поднимается и сразу падает…

В логах:

2009/04/30 10:58:09 BGP: Assertion `len < str_size' failed in file bgp_aspath.c, line 619, function aspath_make_str_count
2009/04/30 10:58:09 BGP: No backtrace available on this platform.
2009/04/30 10:59:02 BGP: BGPd 0.99.11 starting: vty@2605, bgp@<all>:179
2009/04/30 10:59:08 BGP: %ADJCHANGE: neighbor ХХХ.ХХХ.ХХХ.150 Up
2009/04/30 10:59:21 BGP: Assertion `len < str_size' failed in file bgp_aspath.c, line 619, function aspath_make_str_count
2009/04/30 10:59:21 BGP: No backtrace available on this platform.

Все до сегодняшнего дня работало на quagga-0.99.11_1

Полазав по инету решил пересобрать quagga, т.к. в портах появилась: quagga-0.99.11_2

Обновился до quagga-0.99.11_2 и проблема исчезла.

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

ng_ipacct — Netgraph IP accounting

Для работы этого примера необходимо иметь подгруженные модули:

  • ng_ipacct.ko
  • ng_ipfw.ko
  • ng_ksocket.ko

Убедиться в их наличии можно командой:

/sbin/kldstat

Id Refs Address Size Name
1 11 0xc0400000 35e5f8 kernel
...
3 1 0xc4ceb000 3000 ng_ipacct.ko
4 1 0xc4cee000 4000 ng_ksocket.ko
5 1 0xc4d6d000 2000 ng_ipfw.ko

Если модули не загружены, то можно пересобрать ядро добавив следующее:

options NETGRAPH
options NETGRAPH_ETHER
options NETGRAPH_SOCKET
options NETGRAPH_TEE

options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=1000

либо загрузить это модулями:

/sbin/kldload /boot/kernel/ng_ipfw.ko

/sbin/kldload /boot/kernel/ng_ipacct.ko

/sbin/kldload /boot/kernel/ng_ksocket.ko

Устанавливаем порт /usr/ports/net-mgmt/ng_ipacct:

cd /usr/ports/net-mgmt/ng_ipacct

make install clean
В /etc/rc.conf добавляем:

ng_ipacct_enable="YES"
ng_ipacct_modules_load="YES"


Для примера будем собирать трафик для подсети 172.16.5.0/24 с интерфейса bge1

Итак сам скрипт на PERL, пусть он находится в папке /scripts и называется ipacctd_ng.pl

#! /usr/bin/perl

$rul=64000;                                                         #номер начального правила в файере
$iface="bge1";                                                     #интерфейс
$threshold=100000;                                              #максимальное количество записей
$verbose="1";                                                      #расширенная статистика
$savetime="1";                                                     #метка юникс тайма в файл статистики
$nodename=sprintf("ipacct_%s",$iface);                   #имя ноды
$hookprefix=$iface;                                               #крючочки (хуки) в нетграф ;-)

if($ARGV[0] ne "start" and $ARGV[0] ne "show" and $ARGV[0] ne "stop"  and $ARGV[0] ne "restart"){
            error();
}else{
          if($ARGV[0] eq "stop"){                          #stop
                   stop_ng_ipacctd($nodename);
          }elsif($ARGV[0] eq "show"){                    #дампим трафик в файл
                   #проверяем загружен ли ipacctd
                   if(check_ipacctd($iface,$rul)==0){
                              stop_ng_ipacctd($nodename);
                              `/bin/sleep 3`;
                              start_ng_ipacctd($nodename,$hookprefix,$rul,$iface,$verbose,$threshold,$savetime);
                   }else{
                              $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s checkpoint",$nodename,$hookprefix);
                              `$cmd`;
                              $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s show",$nodename,$hookprefix);
                              `$cmd`;
                              $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s clear",$nodename,$hookprefix);
                              `$cmd`;
                   }
          }elsif($ARGV[0] eq "start"){
                  start_ng_ipacctd($dbh,$nodename,$hookprefix,$rul,$iface,$verbose,$threshold,$savetime);
          }elsif($ARGV[0] eq "restart"){
                 stop_ng_ipacctd($nodename);
                 `/bin/sleep 3`;
                start_ng_ipacctd($dbh,$nodename,$hookprefix,$rul,$iface,$verbose,$threshold,$savetime);
          }
}

###функция выводящая аргументы запуска==============================
sub error{
      printf "\nUsage: (start|stop|restart|show)";
      exit;
}

###функция start==================================================
sub start_ng_ipacctd{
         $net="172.16.5.0/24";
         #проверяем загруженность модулей
         @modules=("ng_ipacct.ko","ng_ipfw.ko","ng_ksocket.ko");
         foreach(@modules){
             if(chk_mdl($_)==0){
                `/sbin/kldload $_`;
             }
         }
         #формирование ноды нетграфа
         $cmd_ng=sprintf("/usr/sbin/ngctl -f- <<-SEQ
         mkpeer ipacct ctl ctl
         name .:ctl %s
         mkpeer %s: ksocket %s_in inet/raw/divert
         name %s:%s_in %s_in
         msg %s_in: bind inet/0.0.0.0:3021
         mkpeer %s: ksocket %s_out inet/raw/divert
         name %s:%s_out %s_out
         msg %s_out: bind inet/0.0.0.0:3022
         rmhook .:ctl",$nodename,$nodename,$hookprefix,$nodename,$hookprefix,$nodename,$nodename,$nodename,$hookprefix,$nodename,$hookprefix,$nodename,$nodename);

        `$cmd_ng`;
         $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s dlt RAW",$nodename,$hookprefix);
         `$cmd`;
         $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s verbose %s",$nodename,$hookprefix,$verbose);
         `$cmd`;
         $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s threshold %s",$nodename,$hookprefix,$threshold);
         `$cmd`;
          $cmd=sprintf("/usr/local/sbin/ipacctctl %s:%s savetime %s",$nodename,$hookprefix,$savetime);
         `$cmd`;

          #формируем правила в фаирволе IPFW для перенаправления трафика в ноду нетграфа
          $cmd=sprintf("/sbin/ipfw add %s divert 3021 ip from %s to any",$rul,$net);
          `$cmd`;
          $cmd=sprintf("/sbin/ipfw add %s divert 3022 ip from any to %s",$rul,$net);
          `$cmd`;
           print "ipacct has started..\n";
}

###функция stop==================================================
sub stop_ng_ipacctd{
        `sh /etc/rc.firewall`;
         $cmd=sprintf("/usr/sbin/ngctl shutdown %s:",$nodename);
         `$cmd`;
         print "ipacct has stoped..\n";
}

###функция проверки загрузки модулей================================
sub chk_mdl{
       $chk=`/sbin/kldstat | /usr/bin/awk '/$_/ {print 1}'`;
       if(!$chk){
           return 0;
        }else{
          return 1;
        }
}

###функция проверки ipacctd========================================
sub check_ipacctd{
        $ch1=$ch2=$ch3=0;
        $cmd=sprintf("/usr/sbin/ngctl list | grep %s_in",$iface); #проверяем входящий хук нетграфа
        $check=`$cmd`;
        if($check){
              $ch1=1;
        }

        $cmd=sprintf("/usr/sbin/ngctl list | grep %s_out",$iface); #проверяем исходящий хук нетграфа
        $check=`$cmd`;
        if($check){
              $ch2=1;
        }

        $cmd=sprintf("/sbin/ipfw show | grep divert"); #проверяем наличие правил в файерволе
        $check=`$cmd`;
        if($check){
             $ch3=1;
        }

         $all_ch=$ch1+$ch2+$ch3;
         if ($all_ch < 3){
                return 0; #чего-то явно не хватает
         }else{
               return 1; #все ОК!
         }
}

После старта мы можем посмотреть правила в фаирволе:
/sbin/ipfw show 64000
64000 1551459105 504714065010 divert 3021 ip from 172.16.5.0/24 to any
64000 2103320289 2367292643626 divert 3022 ip from any to 172.16.5.0/24

По команде:

/usr/sbin/ngctl list

можем посмотреть ноды и хуки нетграфа:

There are 7 total nodes:
Name: ngctl12701 Type: socket ID: 000c36ff Num hooks: 0
Name: ipacct_bge1_out Type: ksocket ID: 00097d52 Num hooks: 1
Name: ipacct_bge1_in Type: ksocket ID: 00097d51 Num hooks: 1
Name: ipacct_bge1 Type: ipacct ID: 00097d50 Num hooks: 2
Name: ipfw Type: ipfw ID: 0005f4a3 Num hooks: 0
Name: bge1 Type: ether ID: 00000002 Num hooks: 0
Name: bge0 Type: ether ID: 00000001 Num hooks: 0

Сделаем еще один маленький скриптик, который будет нам складывать статистику в файл.

Назовем его trafgen.pl

#!/usr/bin/perl

$tmp="/usr/local/var/trafd/tmp";    #папка для логов
opendir DIR,$tmp or mkdir $tmp;
closedir DIR;
$log=sprintf("%s/ipacctd.log",$tmp);
system("/scripts/ipacctd_ng.pl show >> $log");  #вызываем наш предыдущий скрипт с аргументом show

в /etc/crontab добавляем строчку:
*/5 * * * * root /scripts/trafgen.pl >/dev/null

Формат данны файла статистики при включенных опциях verbose=1 и savetime=1:
src_IP src_Port dst_IP dst_Port Proto packets bytes unixtime

Пример данных в фале:

172.16.5.211 57349 95.132.7.128 19904 6 1069 822400 1239961920
172.16.5.102 2208 217.118.24.17 7777 6 321 14958 1239961920
172.16.5.91 64835 92.100.50.249 59039 6 426 596900 1239961920
172.16.5.209 64829 77.41.95.94 43768 17 1 58 1239961923
172.16.5.76 1425 195.218.181.123 80 6 4 976 1239961924
172.16.5.188 61651 195.50.197.187 63375 6 1 48 1239961925
172.16.5.220 28988 94.179.59.61 20473 6 5 747 1239961929
....
80.252.240.202 11417 172.16.5.108 60682 17 1 47 1239961922
78.37.156.14 1451 172.16.5.220 28988 6 6 685 1239961922
97.84.143.186 17834 172.16.5.209 64829 17 2 134 1239961922
77.234.8.71 36523 172.16.5.220 28988 17 1 95 1239961924
195.189.47.2 2987 172.16.5.220 28988 17 1 131 1239961925
195.230.112.239 63403 172.16.5.220 28988 6 6 801 1239961930
60.220.156.222 27808 172.16.5.157 34613 17 4 504 1239961932
93.186.239.96 80 172.16.5.101 2720 6 3 358 1239961933

Обратите внимание, что сначала идет трафик исходящий и лишь затем входящий!!!
Все, дальше зависит только от полета Вашей фантазии (или извращенности 🙂 )

Вы можете обрабатывать файлы и складировать их в БД (напрмер MySQL) и т.п.

Плюсы от использования ng_ipacct:

  • держит большие объемы трафика
  • меньшая загрузка cpu по сравнению с обычным ipacct (/usr/ports/net-mgmt/ipacctd)

P.S. После пересборки ядра обязательно пересобрать порт /usr/ports/net-mgmt/ng_ipacct (если он был установлен до этого)

Чтиво:

  • man 4 ipacct
  • man 8 ipfw
  • man 4 netgraph
  • man 4 ng_ipfw

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

Автор: Folio
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 3,75 из 5)
Загрузка...
Отправить на почту Отправить на почту
    Не найдено

Заметка

итак, OpenBSD 4.4

user level ppp (т.к. kernel level ppp мне не удалось подружить с chap-ом)

для «автозапуска рррое» достаточно создать файл
/etc/hostname.tun0, в котором написать:

!/usr/sbin/ppp -ddial pppoe

все настройки относительно самого pppoe находятся в файле:
/etc/ppp/ppp.conf

пример содержимого:

default:
Set log Phase Chat LCP IPCP CCP tun command
Disable ipv6cppppoe:
set device "!/usr/sbin/pppoe -i xl0"
set mtu max 1492
set mru max 1492
set speed sync
disable acfcomp protocomp
deny acfcomp
set authname my-pppoe-login
set authkey my-pppoe-password
add default HISADDR

xl0 — «имя» реальной сетевой карточки, через которую цепляемся к pppoe-серверу
логин-пароль необходимо указывать без кавычек

к сожалению, правильно бы было указать пару «логин-пароль» не в конфиге ррр, а в специальном файле /etc/ppp/chap-secrets (а в конфиге оставить только «логин»)
но — при удалении пароля из ppp.conf соединение не поднимается

ну и самое главное — как рестартовать такое pppoe-соединение

# kill -9 `cat /var/run/tun0.pid`
# ifconfig tun0 destroy
# sh /etc/netstart tun0

пара ньюансов:

  1. увы, не факт, что в tun0.pid окажется «правильный» process-id
  2. мне не нравится «sh /etc/netstart tun0«, так что «когда будет время» — расковыряю netstart и сделаю «как надо»
  3. не забываем про sysctl:

net.inet.gre.allow=1
net.inet.ip.forwarding=1

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

Автор: GrayCat
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 3,50 из 5)
Загрузка...
Отправить на почту Отправить на почту
    Не найдено