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

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

В продолжении статьи Настройка Cisco AS5350 в качестве VoIP-шлюза.

Имеем:

  • Cisco AS5350 (VoIP-шлюз)
  • Сервер FreeBSD с установленным freeradius

Прикручиваем RADIUS к AS5350 для сохранения информации о совершаемых VoIP-звонках. log voip calls, log ip voip calls

Основная задача это обеспечение возможности однозначного сопоставления IP-шной и TDM-ной частей (legs) VoIP-звонка, а также логирование IP-адресов, с которых производятся звонки через наш VoIP-шлюз, что по умолчанию не делается.

Я не буду подробно на этом останавливаться и просто приведу настройки Cisco в части акаутинга и radius:

aaa new-model
aaa authorization exec h323 group radius local
aaa authorization exec sip group radius local
aaa authorization network default group radius local
aaa authorization network h323 group radius local
aaa accounting delay-start
aaa accounting exec default start-stop group radius
aaa accounting exec h323 start-stop group radius
aaa accounting exec sip start-stop group radius
aaa accounting network default start-stop group radius
aaa accounting network h323 start-stop group radius
aaa accounting network sip start-stop group radius
aaa accounting connection h323 start-stop group radius
aaa accounting connection sip start-stop group radius
aaa nas port extended
aaa session-id common
gw-accounting aaa

ip radius source-interface FastEthernet0/0
radius-server host 1.1.1.2 auth-port 1812 acct-port 1813
radius-server timeout 30
radius-server key 7 10491D54261E210823493A2A373B
radius-server vsa send accounting

Обратите внимание на команду на VoIP-шлюзе Cisco:

radius-server vsa send accounting

Благодаря ей VoIP-шлюз будет передавать нужные нам атрибуты, определенные производителем (так называемые Vendor-Specific Attributes), а именно:

  • h323-incoming-conf-id — ID звонка
  • h323-remote-address — IP, с которого/на который был звонок
  • iphop — этот атрибут заполняется при исходящих из IP-сетей звонках количеством хопов до IP-адреса звонящего и их IP-адресами.

Увидеть что Cisco отдает Radius`у можно выполнив в её консоли команды:

terminal monitor
debug radius

Вот пример вывода:

RADIUS(000B0086): Send Accounting-Request to 1.1.1.2:1813 id 1646/229, len 1084
RADIUS:  authenticator 44 55 FD 7F DC D2 19 C3 - 3D 1B D2 B1 82 E6 C4 52
RADIUS:  Acct-Session-Id     [44]  10  "001069EA"
RADIUS:  Calling-Station-Id  [31]  9   "3332211"
RADIUS:  Called-Station-Id   [30]  13  "89259998877"
RADIUS:  Vendor, Cisco       [26]  66
RADIUS:   Cisco AVpair       [1]   60  "call-id=93FA01A7-1FD111E0-B101EAE7-244362EB@1.1.1.194"
RADIUS:  Vendor, Cisco       [26]  21
RADIUS:   Cisco AVpair       [1]   15  "iphop=count:1"
RADIUS:  Vendor, Cisco       [26]  33
RADIUS:   Cisco AVpair       [1]   27  "iphop=hop1:1.1.1.194"
RADIUS:  Vendor, Cisco       [26]  56
RADIUS:   h323-setup-time    [25]  50  "h323-setup-time=14:29:41.703 MSK Sat Jan 15 2011"
RADIUS:  Vendor, Cisco       [26]  28
RADIUS:   h323-gw-id         [33]  22  "h323-gw-id=as5350."
RADIUS:  Vendor, Cisco       [26]  56
RADIUS:   Conf-Id            [24]  50  "h323-conf-id=93F51D6D 1FD111E0 99AD0014 F26ABCA0"
RADIUS:  Vendor, Cisco       [26]  31
RADIUS:   h323-call-origin   [26]  25  "h323-call-origin=answer"
RADIUS:  Vendor, Cisco       [26]  27
RADIUS:   h323-call-type     [27]  21  "h323-call-type=VoIP"
RADIUS:  Vendor, Cisco       [26]  65
RADIUS:   Cisco AVpair       [1]   59  "h323-incoming-conf-id=93F51D6D 1FD111E0 99AD0014 F26ABCA0"
RADIUS:  Vendor, Cisco       [26]  26
RADIUS:   Cisco AVpair       [1]   20  "subscriber=Unknown"
RADIUS:  Vendor, Cisco       [26]  30
RADIUS:   Cisco AVpair       [1]   24  "session-protocol=sipv2"
RADIUS:  Vendor, Cisco       [26]  44
RADIUS:   Cisco AVpair       [1]   38  "gw-rxd-cdn=ton:0,npi:0,#:89259998877"
RADIUS:  Vendor, Cisco       [26]  148
RADIUS:   Cisco AVpair       [1]   142 "feature-vsa=fn:TWC,ft:01/15/2011 14:29:41.703,cgn:3803234,cdn:89259998877,frs:0,fid:730309,fcid:93F51D6D1FD111E099AD0014F26ABCA0,legID:B3920"
RADIUS:  Vendor, Cisco       [26]  58
RADIUS:   h323-connect-time  [28]  52  "h323-connect-time=14:29:52.352 MSK Sat Jan 15 2011"
RADIUS:  Acct-Input-Octets   [42]  6   144960
RADIUS:  Acct-Output-Octets  [43]  6   167360
RADIUS:  Acct-Input-Packets  [47]  6   906
RADIUS:  Acct-Output-Packets [48]  6   1046
RADIUS:  Acct-Session-Time   [46]  6   18
RADIUS:  Vendor, Cisco       [26]  61
RADIUS:   h323-disconnect-tim[29]  55  "h323-disconnect-time=14:30:10.517 MSK Sat Jan 15 2011"
RADIUS:  Vendor, Cisco       [26]  32
RADIUS:   h323-disconnect-cau[30]  26  "h323-disconnect-cause=10"
RADIUS:  Vendor, Cisco       [26]  42
RADIUS:   h323-remote-address[23]  36  "h323-remote-address=1.1.1.194"
RADIUS:  Vendor, Cisco       [26]  24
RADIUS:   Cisco AVpair       [1]   18  "release-source=3"
RADIUS:  Vendor, Cisco       [26]  28
RADIUS:   h323-voice-quality [31]  22  "h323-voice-quality=0"
RADIUS:  Vendor, Cisco       [26]  43
RADIUS:   Cisco AVpair       [1]   37  "remote-media-address=1.1.1.194"
RADIUS:  Vendor, Cisco       [26]  50
RADIUS:   Cisco AVpair       [1]   44  "gw-rxd-cgn=ton:0,npi:0,pi:0,si:0,#:3332211"
RADIUS:  User-Name           [1]   9   "3332211"
RADIUS:  Acct-Status-Type    [40]  6   Stop                      [2]
RADIUS:  Service-Type        [6]   6   Login                     [1]
RADIUS:  NAS-IP-Address      [4]   6   1.1.1.3
RADIUS:  Acct-Delay-Time     [41]  6   0
RADIUS: Received from id 1646/229 1.1.1.2:1813, Accounting-response, len 20

Что ж, для решения основной поставленной перед нами задачи достаточно выполнить следующее:
в /usr/local/etc/raddb/radiusd.conf в секции preprocess указать, что нам нужно преобразовывать VSA :

preprocess {
       with_cisco_vsa_hack = yes
}

Radius разбирает Vendor-Specific Attributes благодаря словарям, которые расположены в папке /usr/local/share/freeradius, в частности файл-словарь по cisco.

dictionary.cisco:

VENDOR          Cisco                           9

#
#       Standard attribute
#
BEGIN-VENDOR    Cisco

ATTRIBUTE       Cisco-AVPair                            1       string
ATTRIBUTE       Cisco-NAS-Port                          2       string

#
#  T.37 Store-and-Forward attributes.
#
ATTRIBUTE       Cisco-Fax-Account-Id-Origin             3       string
ATTRIBUTE       Cisco-Fax-Msg-Id                        4       string
ATTRIBUTE       Cisco-Fax-Pages                         5       string
ATTRIBUTE       Cisco-Fax-Coverpage-Flag                6       string
ATTRIBUTE       Cisco-Fax-Modem-Time                    7       string
ATTRIBUTE       Cisco-Fax-Connect-Speed                 8       string
ATTRIBUTE       Cisco-Fax-Recipient-Count               9       string
ATTRIBUTE       Cisco-Fax-Process-Abort-Flag            10      string
ATTRIBUTE       Cisco-Fax-Dsn-Address                   11      string
ATTRIBUTE       Cisco-Fax-Dsn-Flag                      12      string
ATTRIBUTE       Cisco-Fax-Mdn-Address                   13      string
ATTRIBUTE       Cisco-Fax-Mdn-Flag                      14      string
ATTRIBUTE       Cisco-Fax-Auth-Status                   15      string
ATTRIBUTE       Cisco-Email-Server-Address              16      string
ATTRIBUTE       Cisco-Email-Server-Ack-Flag             17      string
ATTRIBUTE       Cisco-Gateway-Id                        18      string
ATTRIBUTE       Cisco-Call-Type                         19      string
ATTRIBUTE       Cisco-Port-Used                         20      string
ATTRIBUTE       Cisco-Abort-Cause                       21      string

#
#  Voice over IP attributes.
#
ATTRIBUTE       h323-remote-address                     23      string
ATTRIBUTE       h323-conf-id                            24      string
ATTRIBUTE       h323-setup-time                         25      string
ATTRIBUTE       h323-call-origin                        26      string
ATTRIBUTE       h323-call-type                          27      string
ATTRIBUTE       h323-connect-time                       28      string
ATTRIBUTE       h323-disconnect-time                    29      string
ATTRIBUTE       h323-disconnect-cause                   30      string
ATTRIBUTE       h323-voice-quality                      31      string
ATTRIBUTE       h323-gw-id                              33      string
ATTRIBUTE       h323-incoming-conf-id                   35      string

ATTRIBUTE       h323-credit-amount                      101     string
ATTRIBUTE       h323-credit-time                        102     string
ATTRIBUTE       h323-return-code                        103     string
ATTRIBUTE       h323-prompt-id                          104     string
ATTRIBUTE       h323-time-and-day                       105     string
ATTRIBUTE       h323-redirect-number                    106     string
ATTRIBUTE       h323-preferred-lang                     107     string
ATTRIBUTE       h323-redirect-ip-address                108     string
ATTRIBUTE       h323-billing-model                      109     string
ATTRIBUTE       h323-currency                           110     string
ATTRIBUTE       subscriber                              111     string
ATTRIBUTE       gw-rxd-cdn                              112     string
ATTRIBUTE       gw-final-xlated-cdn                     113     string
ATTRIBUTE       remote-media-address                    114     string
ATTRIBUTE       release-source                          115     string
ATTRIBUTE       gw-rxd-cgn                              116     string
ATTRIBUTE       gw-final-xlated-cgn                     117     string
ATTRIBUTE       iphop                                   118     string

# SIP Attributes
ATTRIBUTE       call-id                                 141     string
ATTRIBUTE       session-protocol                        142     string
ATTRIBUTE       method                                  143     string
ATTRIBUTE       prev-hop-via                            144     string
ATTRIBUTE       prev-hop-ip                             145     string
ATTRIBUTE       incoming-req-uri                        146     string
ATTRIBUTE       outgoing-req-uri                        147     string
ATTRIBUTE       next-hop-ip                             148     string
ATTRIBUTE       next-hop-dn                             149     string
ATTRIBUTE       sip-hdr                                 150     string

#
#       Extra attributes sent by the Cisco, if you configure
#       "radius-server vsa accounting" (requires IOS11.2+).
#
ATTRIBUTE       Cisco-Multilink-ID                      187     integer
ATTRIBUTE       Cisco-Num-In-Multilink                  188     integer
ATTRIBUTE       Cisco-Pre-Input-Octets                  190     integer
ATTRIBUTE       Cisco-Pre-Output-Octets                 191     integer
ATTRIBUTE       Cisco-Pre-Input-Packets                 192     integer
ATTRIBUTE       Cisco-Pre-Output-Packets                193     integer
ATTRIBUTE       Cisco-Maximum-Time                      194     integer
ATTRIBUTE       Cisco-Disconnect-Cause                  195     integer
ATTRIBUTE       Cisco-Data-Rate                         197     integer
ATTRIBUTE       Cisco-PreSession-Time                   198     integer
ATTRIBUTE       Cisco-PW-Lifetime                       208     integer
ATTRIBUTE       Cisco-IP-Direct                         209     integer
ATTRIBUTE       Cisco-PPP-VJ-Slot-Comp                  210     integer
ATTRIBUTE       Cisco-PPP-Async-Map                     212     integer
ATTRIBUTE       Cisco-IP-Pool-Definition                217     string
ATTRIBUTE       Cisco-Assign-IP-Pool                    218     integer
ATTRIBUTE       Cisco-Route-IP                          228     integer
ATTRIBUTE       Cisco-Link-Compression                  233     integer
ATTRIBUTE       Cisco-Target-Util                       234     integer
ATTRIBUTE       Cisco-Maximum-Channels                  235     integer
ATTRIBUTE       Cisco-Data-Filter                       242     integer
ATTRIBUTE       Cisco-Call-Filter                       243     integer
ATTRIBUTE       Cisco-Idle-Limit                        244     integer
ATTRIBUTE       Cisco-Account-Info                      250     string
ATTRIBUTE       Cisco-Service-Info                      251     string
ATTRIBUTE       Cisco-Command-Code                      252     string
ATTRIBUTE       Cisco-Control-Info                      253     string
ATTRIBUTE       Cisco-Xmit-Rate                         255     integer

VALUE   Cisco-Disconnect-Cause          Unknown                 2
VALUE   Cisco-Disconnect-Cause          CLID-Authentication-Failure 4
VALUE   Cisco-Disconnect-Cause          No-Carrier              10
VALUE   Cisco-Disconnect-Cause          Lost-Carrier            11
VALUE   Cisco-Disconnect-Cause          No-Detected-Result-Codes 12
VALUE   Cisco-Disconnect-Cause          User-Ends-Session       20
VALUE   Cisco-Disconnect-Cause          Idle-Timeout            21
VALUE   Cisco-Disconnect-Cause          Exit-Telnet-Session     22
VALUE   Cisco-Disconnect-Cause          No-Remote-IP-Addr       23
VALUE   Cisco-Disconnect-Cause          Exit-Raw-TCP            24
VALUE   Cisco-Disconnect-Cause          Password-Fail           25
VALUE   Cisco-Disconnect-Cause          Raw-TCP-Disabled        26
VALUE   Cisco-Disconnect-Cause          Control-C-Detected      27
VALUE   Cisco-Disconnect-Cause          EXEC-Program-Destroyed  28
VALUE   Cisco-Disconnect-Cause          Timeout-PPP-LCP         40
VALUE   Cisco-Disconnect-Cause          Failed-PPP-LCP-Negotiation 41
VALUE   Cisco-Disconnect-Cause          Failed-PPP-PAP-Auth-Fail 42
VALUE   Cisco-Disconnect-Cause          Failed-PPP-CHAP-Auth    43
VALUE   Cisco-Disconnect-Cause          Failed-PPP-Remote-Auth  44
VALUE   Cisco-Disconnect-Cause          PPP-Remote-Terminate    45
VALUE   Cisco-Disconnect-Cause          PPP-Closed-Event        46
VALUE   Cisco-Disconnect-Cause          Session-Timeout         100
VALUE   Cisco-Disconnect-Cause          Session-Failed-Security 101
VALUE   Cisco-Disconnect-Cause          Session-End-Callback    102
VALUE   Cisco-Disconnect-Cause          Invalid-Protocol        120

END-VENDOR      Cisco

Далее, будем формировать уникальный ID звнока в виде MD5 хэша на основании атрибута h323-incoming-conf-id:

acct_unique {
       key = "h323-incoming-conf-id"
}

Однозначние сопоставление IP-шной и TDM-ной частей (legs) VoIP-звонка возможно по полю AcctUniqueId таблицы radacct — оно будет у них одинаковым.

Далее, указываем, что перед аккаунтингом следует данные преобразовать (с использованием словарей):

preacct {
     preprocess
     acct_unique
}

Теперь в /usr/local/etc/raddb/sql.conf мы можем использовать полученные нами данные, которые содержатся в переменных, которые, в свою очередь, определяются в словаре (/usr/local/share/freeradius/dictionary.cisco):

%{h323-remote-address} — в этой переменной содержится IP, с которого/на который был звонок.

Все бы хорошо, но у атрибута iphop есть одна тонкость — он может содержать множественные значения, например:

iphop=count:2
iphop=hop1:192.168.68.4
iphop=hop2:10.10.255.7

и если в sql.conf использовать переменную %{iphop}, то в нее будет попадать только первая строка iphop=count.

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

В нашем примере:

  • %{iphop[0]} — будет содержать значение «count:2»
  • %{iphop[1]} — будет содержаться «hop1:192.168.68.4»
  • %{iphop[2]} — будет «iphop=hop2:10.10.255.7»

Добавив в таблицу radacct поля:

  • remote-address
  • hopcount
  • hop1
  • hop2

можно добавить их в SQL запрос в sql.conf:

accounting_stop_query = "UPDATE ${acct_table2} SET AcctStopTime = '%S', \
AcctSessionTime = '%{Acct-Session-Time}', \
AcctInputOctets = '%{Acct-Input-Octets}', \
AcctOutputOctets = '%{Acct-Output-Octets}', \
AcctTerminateCause = '%{h323-disconnect-cause}', \
AcctStopDelay = '%{Acct-Delay-Time}', \
ConnectInfo_stop ='%{Connect-Info}', \
`remote-address`='%{h323-remote-address}', \
`hopcount`='%{iphop[0]}', \
`hop1`='%{iphop[1]}', \
`hop2`='%{iphop[2]}' \
WHERE AcctSessionId = '%{Acct-Session-Id}' \
AND UserName = '%{SQL-User-Name}' \
AND NASIPAddress = '%{NAS-IP-Address}'"

По итогу таблица radacct выглядит так:

CREATE TABLE IF NOT EXISTS `radacct` (
  `RadAcctId` bigint(21) NOT NULL auto_increment,
  `AcctSessionId` varchar(32) NOT NULL default '',
  `AcctUniqueId` varchar(32) NOT NULL default '',
  `UserName` varchar(64) NOT NULL default '',
  `Realm` varchar(64) default '',
  `NASIPAddress` varchar(15) NOT NULL default '',
  `NASPortId` varchar(15) default NULL,
  `NASPortType` varchar(32) default NULL,
  `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctSessionTime` int(12) default NULL,
  `AcctAuthentic` varchar(32) default NULL,
  `ConnectInfo_start` varchar(50) default NULL,
  `ConnectInfo_stop` varchar(50) default NULL,
  `AcctInputOctets` bigint(12) default NULL,
  `AcctOutputOctets` bigint(12) default NULL,
  `CalledStationId` varchar(50) NOT NULL default '',
  `CallingStationId` varchar(50) NOT NULL default '',
  `AcctTerminateCause` varchar(32) NOT NULL default '',
  `ServiceType` varchar(32) default NULL,
  `FramedProtocol` varchar(32) default NULL,
  `FramedIPAddress` varchar(15) NOT NULL default '',
  `AcctStartDelay` int(12) default NULL,
  `AcctStopDelay` int(12) default NULL,
  `proc` smallint(1) NOT NULL default '0',
  `remote-address` varchar(15) NOT NULL default '',
  `hopcount` varchar(16) default NULL,
  `hop1` varchar(20) default NULL,
  `hop2` varchar(20) default NULL,
  PRIMARY KEY  (`RadAcctId`),
  KEY `UserName` (`UserName`),
  KEY `FramedIPAddress` (`FramedIPAddress`),
  KEY `AcctSessionId` (`AcctSessionId`),
  KEY `AcctUniqueId` (`AcctUniqueId`),
  KEY `AcctStartTime` (`AcctStartTime`),
  KEY `AcctStopTime` (`AcctStopTime`),
  KEY `NASIPAddress` (`NASIPAddress`),
  KEY `import` (`NASPortType`,`AcctSessionTime`,`AcctStartTime`),
  KEY `proc` (`NASPortType`,`proc`,`AcctSessionTime`)
) TYPE=MyISAM;

Таким образом мы получаем, что в sql складывается информация о совершенных VoIP звонках и с каких IP-адресов они совершены.

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

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

Возможности создаваемой системы:

  • Отправка факсов с windows машин в локальных доверенных сетях
  • Отправка факсов с почты
  • Отправка факсов с web-интерфейса
  • Уведомление о состоянии отправленных факсов по почте/сообщения по сети индивидуальному/групповому пользователю
  • Прием факсов и распечатка на принтере
  • Доступность списка полученных факсов через сетевую директорию (в нашем случае samba)
  • Доступность с писка полученных факсов через web-интерфейс
  • Здесь сильно нехвататет:

  • dialup доступ к системе на случай аварии
  • Использования голосовых функций модема при отправке и приеме, т.к. у меня просто нет такого модема
  • Установлена Freebsd 7.3-stable, hylafax-6.0.4_1.
    Для работы с почтой:

    • Любой MTA (я буду использовать exim)

    Для работы в виндовой сетке

    • samba
    • cups/lpr
    • /usr/ports/print/hplip — драйвера для моего HP принтера

    Для работы через веб интерфейс:

    • apache22-itk
    • php5
    • mysql
    • phpmyadmin
    • cd /usr/ports/databases/pear-MDB2_Driver_mysql
    • pear-1.9.0
    • PHP PEAR 5 including MDB2_driver_mysql, Mail and Mail_Mime
    • PECL FileInfo
    • PHP mbstring — for improved UTF-8 sorting support (optional)
    • PHP MySQL 5
    • MySQL server 4.1.12 or better (see Important Notes below)
    • ImageMagick
    • ghostscript
    • libtiff
    • netpbm-devel
    • libungif
    • sudo

    Характеристики железа, на котором все это работает:

    1. pentium3-1Ghz/512Mb/40Gb hdd
    2. 4 модема courier
    3. МУльтикарта mosChip nm9835

    У меня установлена мультикарта для работы 2 модемов и можно подгрузить puc модуль, но модемы у меня упорно не виделись, так что тем, кто использует мультикарты, надо собрать ядро с device puc.

    Все поставлено, можно начинать настройку.

    Настройка hylafax
    Команды:

    • faxsetup — сделает общие настройки факс- сервера.
    • faxaddmodem — позволит добавить модем

    Файлы (все конфиги находятся в /var/spool/hylafax/etc):

  • FaxDispatch
    • FILETYPE=tif;
      SENDTO=mail@your-server.ru;
  • FaxNotify
    • NOTIFY_FAXMASTER=yes;
      RETURNFILETYPE=tif
  • В файл конфига модема:
    • FaxrcvdCmd: «bin/faxrcvd.php»
      DynamicConfig: «bin/dynconf.php»
      NotifyCmd: «bin/notify.php «
  • В файл /etc/ttys
    • cuad0  «/usr/local/sbin/faxgetty»  unknown on insecure
      ln -s /var/spool/hylafax/bin/ps2fax /var/spool/hylafax/bin/ps2fax.gs
      ln -s /var/spool/hylafax/bin/pdf2fax /var/spool/hylafax/bin/pdf2fax.gs

    —————————————————————————————————————
    Настроим веб сервер.

    Т.к. сервер будет исполнять системные команды, я предпочел использовать apache22 с патчем itk. Это позволит мне ограничить работу виртуального хоста в системе действиями от непривелигированного пользователя uucp, например. Для активации патча необходимо сделать:
    # sudo make WITH_MPM=itk -C /usr/ports/www/apache22/

    Этот рецепт можно также использовать на собственном виртуальном хостинге, но следует учитывать, что apache22-itk работает примерно в 5 раз медленнее простого апача, так что может это кому-то пойдет только во вред. Мне нет, у меня нет больших нагрузок и я решил попробовать что-то необычное

    ServerAdmin it@your-server.ru
    DocumentRoot «/usr/local/www/avantfax»
    ServerName fax.your-server.ru
    ErrorLog «/var/log/fax-error_log»
    CustomLog «/var/log/fax-access_log» common
    # Включилась паранойя, и я изменил все запросы с http на https
    RewriteEngine on
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
    # Настроим от чьего имени будет работать этот виратуальный хост

    AssignUserId uucp uucp

    # Тут настроим работу php
    php_admin_value upload_tmp_dir /usr/local/www/avantfax/tmp
    php_admin_flag safe_mode off # Обязательно, иначе не будет работать avantfax, указываю не в глобальной конфигурации, чтобы остальные вируальные хосты работали в сейвмоде
    php_admin_flag display_errors on # Посмотрим будут ли ошибки, потом можно отключить
    php_admin_value doc_root /usr/local/www/avantfax
    php_admin_value user_dir «www»
    php_admin_value open_basedir «/usr/local/www/avantfax:/usr/local/share/pear:/var/spool/hylafax:/usr/local/bin» # Разрешим этому вируальному хосту испольнять код-пхп в определенных директориях.
    php_admin_value session.save_path /usr/local/www/avantfax/tmp
    php_admin_value memory_limit «64M»
    php_flag max_execution_time 60

    —————————————————————————————————————
    Делаем веб морду

    0. Качаем архив с скриптами http://downloads.sourceforge.net/project/avantfax/avantfax-3.2.2.tgz?use_mirror=ignum

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

    Я предпочитаю сменить пути в файлах:
    avantfax/includes/faxrcvd.php, notify.php, remold.php, faxcover.php, phb.php

    Создадим базу вебморды нашей факс машины
    # mysql -uroot -p < create_user.sql
    # mysql -uavantfax -ppassword avantfax < create_tables.sql

    2. Приведем avantfax/includes/local_config.php в соответстви с нашей системой:
    cp /usr/local/www/avantfax/avantfax/includes/local_config-example.php /usr/local/www/avantfax/avantfax/includes/local_config.php

    Опишу необходимые настройки в local_config.php:

  • Ищем $BINARYDIR = ‘/usr/bin’;, меняем на $BINARYDIR = ‘/usr/local/bin’;
  • $dft_config_lang поставим ru вместо en
  • $HYLAFAX_PREFIX
  • 3. # sudo chmod -R 777 tmp faxes templates/admin_theme/templates_c и templates/main_theme/templates_c

    4. Сделаем символическую ссылки на наши скрипты:

  • # ln -s /usr/local/www/avantfax/includes/faxrcvd.php /var/spool/hylafax/bin/faxrcvd.php
  • # ln -s /usr/local/www/avantfax/includes/dynconf.php /var/spool/hylafax/bin/dynconf.php
  • # ln -s /usr/local/www/avantfax/includes/notify.php /var/spool/hylafax/bin/notify.php
  • 5. Отредактируем конфигурацию модема (первый модем в моей системе /dev/cuad0):
    # vi /var/spool/hylafax/etc/config.cuad0

      FaxrcvdCmd: bin/faxrcvd.php
      DynamicConfig: bin/dynconf.php
      UseJobTSI: true

    6. # vi /var/spool/hylafax/etc/config

      NotifyCmd: bin/notify.php

    7. Заменим стандарный faxcover на авантфаксовый:

      # mv /usr/bin/faxcover /usr/bin/faxcover.old
      # ln -s /usr/local/www/avantfax/avantfax/includes/faxcover.php /usr/local/bin/faxcover

    8. Настроим управление очередью факса от имени нашего веб сервера (добавим аккаунт в фаил hosts.faxd uucp). Именно поэтому я использую апач c патчем itk, с ним легко можно ограничить действия виртуального хоста в системе. Это нужно для того, чтобы администратор системы был юзер hylafax, от имени которого работает вся наша система:

      # /usr/sbin/faxadduser -a my_password apache
      # /usr/sbin/faxdeluser localhost
      # /usr/sbin/faxdeluser 127.0.0.1
      # echo 127.0.0.1 >> /var/spool/hylafax/etc/hosts.hfaxd

    Помните , что указанный пароль используется в файле local_config.php as $FAXRMPWD.

    9. Добавим два скрипта от рута в крон (/etc/crontab). Один нужен для создания адресной книги, а второй удаляет все временные файлы, которые остают после заливки файлов юезрами в факс-машину через веб морду:

      0 * * * * /var/www/avantfax/includes/phb.php
      0 0 * * * /var/www/avantfax/includes/avantfaxcron.php -t 2

    10. Настроим возможность выполнения некоторых команд в системе от имени root, но с правами юзера hylafax (/usr/local/etc/sudoers):
    hylafax ALL = NOPASSWD: /sbin/reboot, /sbin/halt, /usr/local/sbin/faxdeluser, /usr/local/sbin/faxadduser -u * -p * *

    11. Теперь можно перезапустить машину для проверки, что все само стартует в случае перегрузки и пробовать войти в вебинтерфейс avantfax:

    http://fax.your-server.ru/admin/

    Если все в порядке, то появится запрос на ввод логина/пароля.

    ПО-умолчанию: admin/password. При первом входе будет предложено сменить пароль на что-то иное.

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

    Например:

    • device: cuad0
    • alias: dep1
    • contact: faxdep1@your-server.ru

    Теперь каждый факс, пришедший на факс cuad0, будет отправлен в pdf на адрес faxdep1@your-server.ru.

    Настроить как будет рассылать MTA эти письма, вы сами решайте. У нас пересылается на секретаря. Остальные модемы настраиваются аналогично.

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

      # cd /var/spool/hylafax; for i in `ls recvq/*`; do bin/faxrcvd.php $i ttyS0; done

    Для импорта отправленных:

      # cd /var/spool/hylafax; for i in `ls doneq/q*`; do bin/notify.php $i done :30; done

    —————————————————————————————————————
    Настройка самба для расшаривания папки с принятыми факсами:

    [Fax_Rec]
    comment = Incoming Faxes
    browseable = yes
    writable = yes
    path = /var/spool/hylafax/recvq
    public = yes

    Зная умения пользователей, подстрахуемся сетевой корзиной:
    vfs objects = recycle full_audit
    recycle:repository = /usr/home/data/fax/.killed
    recycle:keeptree = yes
    recycle:versions = yes

    —————————————————————————————————————
    Автоматическое распечатывание cups принятых факсов.

    Установим и настроим cups.
    Я поставил вот такие пакеты: cups-base-1.4.2_4, cups-client-1.4.2_4, cups-image-1.4.2_4, cups-pstoraster-8.15.4_5, cups-samba-6.0_3, cups-smb-backend-1.0_3.
    Последние 2 нужны были для публикации притеров посредством самбы. Некоторые из отправляющих факсы с клиента программ работают через самба-принтер. Так что возможно многим оно и не понадобится. Далее установим hplip-2.8.2_7 — это драйвера для принтеров HP.

    Установка закончена, теперь настраиваем:

    В файле /usr/local/etc/cups/cupsd.conf делаем следующие изменения:

      Listen 127.0.0.1:631
      Listen :631

    Остальное я не правил, меня устроил дефолтный конфиг. Теперь добавим принтер:

      1. http://local_address:631/
      2. Нажимаем на Printers.
      3. Add Printer. Вводим имя root и его пароль.
      4. Name: имя вашего принтера (название может быть любое). Все остальное не заполняем. Continue.
      6. Не забудьте сделать печать тестовой страницы. Если увидели картинку, то все в порядке.
      7. Далее я долго мучался, почему мой принтер не печататет и нашел ответ. Надо сделать симлинки от старого lpr:
      # cd /usr/bin
      # mv lp lp.bak
      # mv lpq lpq.bak
      # mv lpr lpr.bak
      # mv lprm lprm.bak
      # ln -s /usr/local/bin/lp /usr/bin/lp
      # ln -s /usr/local/bin/lpq /usr/bin/lpq
      # ln -s /usr/local/bin/lpr /usr/bin/lpr
      # ln -s /usr/local/bin/lprm /usr/bin/lprm
      У меня возникла проблема с принтером принтером HP 2055dn, его драйверов не было, поэтому я воспользовался драйвером входящим в состав порта hplip-2.8.2_7 и положил его в /usr/local/etc/cups/ppd/HP_2055.ppd. Больше проблем не было,я и не настраивал больше ничего тут. Таким образом идем далее..

      Для автоматического распечатывания пришедших факсов используйте код в файле

      # /usr/local/bin/tiff2ps -1 $1 | /usr/bin/lpr

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

      # /usr/bin/tiff2ps -1 -h 11.1082 -w 7.8543 $1 | /usr/bin/lpr

    Мы используем для получения аванфаксовый файл faxrcvd.php поэтому в конфиге надо выставить

      $PRINTFAXRCVD = true;
      $PRINTFAX2PS  = ‘/usr//local/bin/fax2ps’;

    —————————————————————————————————————
    Рассмотрим работу с несколькими модемами и принтерами.

    Тут все очень просто. Т.к. наша система плотно связана с avantfax, то и настройки мы должны проводить в неё.Идем в админку http://fax.your-server.ru/admin/. Тут Заходим в пункт «параметры модемов» и заполняем: название модем, на какой принтер печатать, какой номер. Собственно после этого у вас должно заработать как надо.
    —————————————————————————————————————
    Что делать тем, кто не хочет установить avantfax?

    Вполне законное желание, во многих компания к этому уже пришли. Пропустите все изменения, которые связаны с avantfax.
    Далее вам необходимо поместить примерно такой код в FaxDispatch:

      case «$DEVICE» in cuad0)
      SENDTO=name@your-server.ru
      PRINTER=lj2015
      ;;
      esac

    —————————————————————————————————————
    Отправка факсов с рабочих мест:
    Скачаем вот это http://prdownloads.sourceforge.net/winprinthylafax/WinprintHylaFAX-1.2.9.exe?download, и несколько автоматизируем процесс настройки клиентов таким reg-файлом:

      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v Username /t reg_sz /d %username% /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v Password /t reg_sz /d PassWord /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v DefaultEmail /t reg_sz /d %username%@your-server.ru /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v AddressBookPath /t reg_sz /d %userprofile% /f

    Этот кусок реестра форточек позволяет настроить параметры winprint, для настройки уведомлений и авторизированного доступа к системе. Теперь пользователь может отправить факс простым распечатыванием на специальный факсовый принтер. Впрочем, можно обойти все машины и настроить факсовый притер вручную.
    —————————————————————————————————————
    Работа с почтовым сервером

    Мозга до sendmail мне никогда не хватало, поэтому в /etc/mail/mailer.conf:

      sendmail /usr/local/sbin/exim
      send-mail /usr/local/sbin/exim
      mailq /usr/local/sbin/exim -bp
      newaliases /usr/local/sbin/exim -bi
      hoststat /usr/local/sbin/exim
      purgestat /usr/local/sbin/exim

    Транспорт
    faxmail:
    driver = accept
    condition = ${if eq{$local_part}{fax}{yes}{no}}
    transport = faxmail
    no_more

    faxmail:
    driver = pipe
    command =»/usr/local/bin/faxmail -n -t done -d $h_subject $sender_address»

    Теперь при посылке почты на fax@your-server.ru ексим выполнит отправку факса. Соответвенно, если у вас почтовый сервер и сервер с факсами разные, то на основном сервере надо настроить пересылку почты на смтп нашей факсмашины.

    Дальше больше и интереснее.
    Теперь рассмотрим работу hylafax с asterisk и iaxmodem. Как настраивать астреиск, тема другой статьи, поэтому я предполагаю, что он уже настроен у вас.
    Итак, устанавливаем /usr/ports/net/iaxmodem. Создаем конфиг программного модема /usr/local/etc/iaxmodem/ttyIAX0:
    mode 660
    port 4570
    refresh 300
    server 127.0.0.1
    peername iaxmodem0
    secret parolka
    cidname subnets.ru
    cidnumber 203
    codec alaw

    В /etc/rc.conf для автостарта:
    iaxmodem_enable=»YES»

    Командой faxaddmodex ttyIAX0 добавим новый модем и настроим его. В итоге получим конфиг модема IAX0 для hylafax.

    Настроим iax.conf для астериска:
    [general]
    bindport=4569
    bindaddr=127.0.0.1
    bandwidth=low
    disallow=lpc10
    jitterbuffer=no
    forcejitterbuffer=no
    autokill=yes

    [iaxmodem0]
    type=friend
    username=iaxmodem0
    context=office
    secret=parolka
    host=127.0.0.1
    port=4570
    qualify=yes
    disallow=all
    allow=ulaw
    trunk=no

    Ну и sip.conf:
    exten => 203,1,Set(LANGUAGE()=ru)
    exten => 203,n,Dial(IAX2/iaxmodem0/${EXTEN},10,r)

    Несколько советов по управлению факс-машиной:

      Очистка факс машины:
      # cd /var/spool/hylafax/
      # rm archive/* docq/* log/* recvq/* sendq/* tmp/*

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

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

    Кто то уже знает, кто-то нет и спит спокойно, точнее пока что спит спокойно.

    Как давно вы читали логи своего Asterisk сервера ?

    Некоторые из вас или уже видели или ещё увидят в логах строчки:

    • Registration from ‘»100″<sip:100@sip.mydomain.ru>’ failed for ‘188.165.215.79’ — No matching peer found
    • Registration from ‘»111″ <sip:111@sip.mydomain.ru>’ failed for ‘188.165.215.79’ — Wrong password

    Догадываетесь к чему они ведут ? К тому что вас сканят и пытаются подобрать пароль к вашим SIP аккаунтам.

    Большинство пользователей безалаберно относятся к своим паролям, это факт, а раз так то проверте что на ваших SIP номерах не стоят пароли аля 123 или 1234.

    Если пароль таки подберут, то вы (или ваш клиент) попадете на деньги, т.к. через вас пустят звонки забугор, например на Кубу или Северную Корею.

    Давайте разберемся как они это делают и попробуем усложнить им жизнь помимо смены паролей к своим SIP аккаунтам.

    В сети есть набор утилит sipvicious:

    The 4 tools that you should be looking at are:svmapsvwarsvcracksvreportsvcrash

    The tools: svmap — this is a sip scanner. When launched against ranges of ip address space, it will identify any SIP servers which it finds on the way. Also has the option to scan hosts on ranges of ports.

    svwar — identifies working extension lines on a PBX. A working extension is one that can be registered. Also tells you if the extension line requires authentication or not.

    svcrack — a password cracker making use of digest authentication. It is able to crack passwords on both registrar servers and proxy servers. Current cracking modes are either numeric ranges or words from dictionary files.

    svreport — able to manage sessions created by the rest of the tools and export to pdf, xml, csv and plain text.

    svlearnfp — allows you to generate new fingerprints by simply running the tool against a host. It will attempt to guess most values and allow you to save the information to the local fingerprint db. Then you can choose to upload it to the author so that it can be added to the database.

    svcrash — responds to svwar and svcrack SIP messages with a message that causes old versions to crash.

    Так вот с их помощью нас и сканят.  Эти же утилиты помогут нам просканить самих себя и  усложнить жизнь уродам жаждущих халявы.

    Начнем с того что скачаем этот набор утилит (сохраненная у нас копия).

    Распакуйте архив в какую нить папку и можно приступать к скану.

    Будет считать что IP-адрес нашего Asterisk сервера это 192.168.1.1  и запустим сканер:

    cd /home/virus/sipvicious

    ./svmap.py -p5060 192.168.1.1 -m INVITE

    Получаем результат:

    | SIP Device        | User Agent   | Fingerprint |
    --------------------------------------------------
    | 192.168.1.1:5060 | Asterisk PBX | disabled    |

    Идем далее, посканим теперь на аккаунты:

    ./svwar.py —force -e100-999 192.168.1.1

    Ответ может быть таким:

    | Extension | Authentication |
    ------------------------------
    | 210       | reqauth        |
    | 300       | reqauth        |
    | 666       | reqauth        |
    | 241       | reqauth        |
    | 242       | reqauth        |
    | 222       | reqauth        |

    Можно ли как то обломать их ? Можно. Для этого отредактируем /usr/local/etc/asterisk/sip.conf и добавим или раскоментируем строчку в секции [general]:

    alwaysauthreject = yes

    Описание:

    When an incoming INVITE or REGISTER is to be rejected, for any reason, always reject with ‘401 Unauthorized’ instead of letting the requester know whether there was a matching user or peer for their request.

    Т.е. наш сервер будет всегда при любых ошибках авторизации будет отвечать «401 Unauthorized» и не сообщать подробностей.

    После изменения sip.conf зайдите в консоль Asterisk`а:

    asterisk -r

    и примените изменения:

    asterisk*CLI> sip reload

    Теперь посканим снова:

    ./svwar.py —force -e100-999 192.168.1.1

    Ответ от сканера изменился и выглядит примерно так:

    WARNING:TakeASip:Bad user = SIP/2.0 401  - svwar will probably not work!
    WARNING:TakeASip:We got an unknown response
    ERROR:TakeASip:Response: 'SIP/2.0 401 Unauthorized\r\n
    Via: SIP/2.0/UDP 192.168.1.1:5061;branch=z9hG4bK-3613016185;received=192.168.1.1;rport=5061\r\n
    From: "100"; tag=31303001333430333334313736\r\n
    To: "100";tag=as47e73e29\r\nCall-ID: 2008271273\r\n
    CSeq: 1 REGISTER\r\n
    User-Agent: Asterisk PBX\r\n
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO\r\n
    Supported: replaces\r\n
    WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="3b652f8d"\r\n
    Content-Length: 0\r\n\r\n'

    Как видите списка с номерами более не выдается, то что нам и надо.

    Что ещё мы можем сделать ?

    A. Например закрыть в диал-плане забугорные направления (коды стран), по которым не вы ни ваши пользователи не звонят или вообще перекрыть выход на международку.

    Добавим в  /usr/local/etc/asterisk/extensions.conf в секцию где у вас происходит выход в город:

    exten => _810X.,1,playback(pbx-invalid)

    exten => _810X.,n,Hangup()

    B. Так же мы можем скриптом анализировать логи Asterisk сервера и всех уродов, подбирающих пароль, банить фаирволом (ipfw) сервера.

    Нашу версию подобного скрипта можно увидеть пройдя по ссылке: http://subnets.ru/files/protect_aster.txt

    Инсталляция скрипта:

    1. Сохраните код скрипта на своем сервере

    2. Переименуйте файл в protect_aster.sh

    3. Сделайте скрипт исполняемым:

    chmod a+x protect_aster.sh

    4. Добавте в ваш firewall ipfw правило:

    ipfw add XXX reject ip from «table(56)» to me

    где ХХХ это номер правила.

    Будьте внимательны размещая данное правило, не забаньте сами себя ! Обеспечьте allow правила для своих IP-адресов выше этого правила, чтобы избежать неожиданностей.

    5. Добавте скрипт на исполнение по crontab, отредактируйте /etc/crontab:

    */5    *       *       *       *       root    /full/path/to/script/protect_aster.sh

    Забаненый IP-адрес попадает в таблицу ровно на сутки, через сутки он автоматически будет удален из таблицы.

    C. В /usr/local/etc/asterisk/sip.conf, описывая секции пользователей (их номера) указывайте:

    type=user

    Пароли ставте минимум из 6-ти знаков с использованием букв и цифр.

    Если известно с каких адресов будет авторизовываться пользователь, то будет совсем не лишним указать ACL с перечислением IP-адресов/подсетей из которых разрешено подключение, например:

    [111]
    type=user
    context=users
    disallow=all
    allow = alaw
    reinvite=no
    canreinvite=no
    callerid=User 111
    language=ru
    secret=Xm32rQ
    mailbox=111
    host=dynamic
    deny=0.0.0.0/0
    permit=217.172.16.74/30
    nat=yes

    В данном примере пользователю разрешено подключаться только из подсети 217.172.16.74/30 и запрещено из всех остальных. Не забудьте прописать пароль (secret=Xm32rQ) и в /usr/local/etc/asterisk/users.conf.

    D. Измените план набора номеров для исходящих звонков. Добавте к номеру какой нибудь префикс, например 004 и «отрезайте» его (в моем примере это получается 3 цифры) перед тем как отправить своему провайдеру:
    exten => _0048X.,1,Dial(SIP/${EXTEN:3}@sip-provider,60,rT)

    Т.е. что бы набрать городской номер, пользователь должен набрать 00484951234567, халявщик этого точно знать не может, потому обломится, а мы ему поможем, дописав:
    exten => _8X.,1,playback(pbx-invalid)

    Тут же вы можете оставить свое «доброе» голосовое пожелание для таких уродов. Я так и сделал. высказал все что я о них думаю.

    Надеемся, что эти не хитрые приемы помогут вам остаться при деньгах и сэкономить ваши нервы.

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

    З.Ы.Ы. Ваши комментарии и дополнения к статье приветствуются.

    Авторы: Панфилов Алексей (lehis (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)

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

    Автообзвон

    Есть задачи реализация которых возможна через автоматический обзвон. Например ?

    Например вы сис.админ, у вас есть локальная сеть и куча оборудования в ней, но вы же не 24/7 на работе, а раз так, то в сети может что то произойти, например событие в системе мониторинга, а вас нет на рабочем месте. Конечно можно отправлять себе SMS, если такая вожможность есть, а имея сервер Asterisk можно и позвонить и самому себе рассказать что же случилось 😉

    Или вам необходима система callback, что бы позвонив на номер заведенный на Asterisk, вы могли получить с него обратный звонок и набрать другой номер.

    Итак, считаем что у вас у уже есть установленный и настроенный сервер Asterisk, который имеет выход в город.

    Что бы совершить автоматический звонок нам потребуется следующие вещи:

    • сформировать call файл
    • иметь в диалплане (dialplan (определяется в /usr/local/etc/asterisk/extensions.conf)) контекст (context) со списком действий

    Начнем с call файла, его основной синтаксис:

    • Channel: <channel> — Какой канал использовать для звонка
    • CallerID: «name» <number> — Установить Caller ID, проще сказать тут мы можем выставить АОН (номер с которого мы звоним).
    • MaxRetries: <number> — Максимальное кол-во попыток дозвониться, по умолчанию 0, что является одной попыткой.
    • RetryTime: <number> — Время в секундах между попытками дозвона, по умолчанию 300 (5 минут).
    • WaitTime: <number> — Сколько секунд ожидаем поднятия трубки, по умолчанию 45.
    • Context: <context-name> — Какой контекст используем из extensions.conf
    • Extension: <ext> — Какой экстеншн используем в выбранном контексте (так же в extensions.conf).
    • Priority: <priority> — С какого приоритета начинаем.

    Я привел не полный список, полный список доступен тут. Лично я, для каждого номера, создаю свой контекст в extensions.conf.

    Соответственно зная синтаксис мы теперь сможем сформировать call файл, на примере звонка через SIP канал:

    Channel: SIP/89161112233@sip-provider
    Callerid: 9998877
    MaxRetries: 2
    RetryTime: 20
    WaitTime: 60
    Context: outgoing_to_89161112233
    Extension: s
    Priority: 1

    Для тех кто в танке 🙂 разберем call файл построчно:

    • позвонить на SIP номер 89161112233 через провайдера sip-provider (имя из /usr/local/etc/asterisk/sip.conf для выхода в город)
    • использовать АОН 9998877
    • Максимальное кол-во попыток дозвона 2
    • Пауза между попытками 20 секунд
    • Ожидать поднятия трубки 60 секунд
    • Использовать контекст (context) с именем outgoing_to_89161112233
    • Начинать с экстеншена (ext) s
    • И начинать с приоритета 1 в экстеншене s

    Сформировав call файл, его необходимо положить в папку:  /var/spool/asterisk/outgoing/ сервер Asterisk обнаружив в этой папке файл сразу же попытается отработать его.

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

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

    Как это сделать ? Очень просто, для этого воспользуемся командой touch, которая есть во всех unix системах.

    После того как создали сам call файл берем и меняем дату его создания, шаблон даты такой:

    ГОДМЕСЯЦДЕНЬЧАСЫМИНУТЫ.СЕКУНДЫ (внимание: перед секундами стоит символ точки, это так и нужно, а не опечатка).

    Для примера выставим дату в будущем, скажем это 09.07.2010 19:18:55:

    /usr/bin/touch -t 1007091918.55 /path/to/call/file.call

    Дата создания call файла изменится и если переместить файл в /var/spool/asterisk/outgoing/, то соответственно Asterisk его не обработает до тех пор пока не наступит выставленная дата.

    Совет: генерить call файл лучше в какой то tmp директории, выполнять над ними все необходимые и действия и затем мувить (переносить) в /var/spool/asterisk/outgoing/.

    Теперь посмотрим на сам контекст (context), для системы мониторинга он может быть таким:

    [outgoing_to_89161112233]
    exten => s,1,Answer
    exten => s,n,Wait(1)
    exten => s,n,Background(/usr/local/share/asterisk/sounds/monitoring/welcome)
    exten => s,n,Background(/usr/local/share/asterisk/sounds/monitoring/Down)
    exten => s,n,Background(/usr/local/share/asterisk/sounds/monitoring/provider-a)
    exten => s,n,Background(/usr/local/share/asterisk/sounds/monitoring/bye)
    exten => s,n,hangup

    Исходя из данного контекста Asterisk дозвонившись до 89161112233 (человек взял трубку) выполнит следущее:

    • поднимет трубку со своей стороны
    • секунду подождет
    • проиграет записанные вами звуковые файлы (полные пути к файлам указаны)
    • повесит трубку

    Как записать голосовые файлы (то что вы будете проигрывать) вы можете узнать из этой статьи.

    После того как Asterisk полностью отработает call файл, он его удаляет из директории /var/spool/asterisk/outgoing/.

    Специальный экстеншен ‘failed
    Если на вызов не ответили, и существует стандартный экстеншен с именем failed и команда с приоритетом 1 в заданном (в .call файле) контексте, управление будет передано этой команде.

    exten => failed,1,Set(NumberDialed=${CUT(PassedInfo,,1)})
    exten => failed,n,SetCDRUserField(${NumberDialed})

    [Добавлено 11.02.2011]

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

    • сначала набираем внутренний SIP  номер (6003) человека
    • если внутренний SIP номер не отвечает/занят/недоступен — набираем мобильный номер

    Кажется, ну что может быть проще, написать:

    exten => failed,1,Dial(SIP/89161112233@sip-provider)

    А вот тут то и выяснилось, что не все так просто. На такое действо вы в консоле (выставив core set verbose 3) увидите подобное сообщение:

    — Executing [failed@dialsip:1] Dial(«OutgoingSpoolFailed», «SIP/6003») in new stack
    [Feb 11 16:57:44] WARNING[94371]: channel.c:3441 ast_request: No translator path exists for channel type SIP (native 65535) to 0
    [Feb 11 16:57:44] WARNING[94371]: app_dial.c:1296 dial_exec_full: Unable to create channel of type ‘SIP’ (cause 58 — Bearer capability not available)
    == Everyone is busy/congested at this time (1:0/0/1)
    == Auto fallthrough, channel ‘OutgoingSpoolFailed’ status is ‘CHANUNAVAIL’
    [Feb 11 16:57:54] NOTICE[94371]: pbx_spool.c:356 attempt_thread: Call failed to go through, reason (8) Congestion (circuits busy)

    Усе… приехали…. Лазая по результатам поиска в гугле я натыкался на сообщения:

    Канал получается OutgoingSpoolFailed и именно в него пытается звонить и Dial и играть Playback. Как мне находясь в failed сделать звонок на SIP и проиграть сообщение?

    Собственно точно такой же вопрос задавал себе и я сам, но ответа на него ни в Инете ни у меня не было.

    Так же как и я народ пытался реализовать подобное через failed c Goto, System и т.п., но результат получался таким же — никаким 🙁

    Получается из starndart extention failed сделать набор (Dial) другого номера не получится…..

    Я уже было подумал, что не судьба и мне придется ловить DIALSTATUS, передавать его AGI скрипту (который ещё и писать придется) и тот уже будет решать что с этим делать (создавать новый call файл или ещё что то), но тут родился ещё один вариант:

    core*CLI> core show channeltypes
    Type        Description                              Devicestate  Indications  Transfer
    ----------  -----------                              -----------  -----------  --------
    Skinny      Skinny Client Control Protocol (Skinny)  no           yes          no
    SIP         Session Initiation Protocol (SIP)        yes          yes          yes
    Console     OSS Console Channel Driver               no           yes          no
    MGCP        Media Gateway Control Protocol (MGCP)    yes          yes          no
    Local       Local Proxy Channel Driver               yes          yes          no
    Zap         DAHDI Telephony Driver w/PRI             no           yes          no
    Agent       Call Agent Proxy Channel                 yes          yes          no
    ----------
    7 channel drivers registered
    
    core*CLI> core show channeltype Local
    -- Info about channel driver: Local --
    Device State: yes
    Indication: yes
    Transfer : no
    Capabilities: -1
    Digit Begin: yes
    Digit End: yes
    Send HTML : yes
    Image Support: no
    Text Support: yes
    core*CLI>

    Создаем call-файл уже чуть другого содержания:

    Channel: Local/1@autocaller
    Callerid: 9998877
    Context: outgoing_to_89161112233
    Extension: s
    Priority: 1

    Где autocaller это название контекста, а 1-ца это приоритет в этом контексте. Соответственно делаем в extensions.conf этот контекст:

    [autocaller]
    exten => 1,1,Macro(call6003user,6003)

    Тем самым мы как бы набираем уже не номер, а конкретный exten  в контексте и в нем передаем вызов в макро, создаем и макро, которое используется в этом контексте:

    [macro-call6003user]
    exten => s,1,Dial(SIP/${ARG1},15,t)
    exten => s,n,Goto(s-${DIALSTATUS},1)
    exten => s-NOANSWER,1,Dial(SIP/89161112233@sip-provider)
    exten => s-NOANSWER,n,VoiceMail(${ARG1},u)
    exten => s-NOANSWER,n,Hangup()
    exten => s-BUSY,1,VoiceMail(${ARG1},b)
    exten => s-BUSY,n,Hangup()
    exten => _s-.,1,Goto(s-NOANSWER,1)

    Собственно этот макро дает нам возможность уже управлять куда и в каком случае пойдет вызов. Пример конечно «грубый», но главное ведь принцип, а дальше уже ваше творчество 😉

    И вот таким образом мы получаем искомый результат.

    [Конец добавленного 11.02.2011]

    Callback

    Он работает по тому же принципу, что и описанный выше автообзвон, за некоторыми исключениеми:

    • генерация call файла происходит при звонке человека на номер выделенный под callback.
    • в контексте (context) мы не просто проигрываем звуковые, а предлагаем пользователю ввести номер, на который он хочет позвонить

    Что нам потребуется в этом случае:

    • выделить номер для callback и создать контекст (context) под него в  extensions.conf.
    • «передать»  звонок в AGI скрипт, который проверит АОН звонящего на предмет разрешен ли этому номеру callback
    • если  callback разрешен, то сформирует call файл.

    AGI — это Asterisk Gateway Interface.
    Asterisk Gateway Interface это возможность расширить функционал Asterisk`а с помощью использования скриптов на многих языках программирования. Например Perl, PHP, C, Pascal, Bourne Shell.

    Начнем с номера, допустим это будет гор. номер 84955556677. Добавим в extensions.conf в контекст (context) куда поступают все входящие звонки:

    exten => 84955556677,1,AGI(sms-callback.php)
    exten => 84955556677,n,Hangup()

    Т.е. звонок на экстеншн (ext) 84955556677 будет передан AGI скрипту callback.php, а затем звонок будет сразу же завершен.

    AGI скрипты для Asterisk располагаются в директории  /usr/local/share/asterisk/agi-bin/.

    Почему скрипт на PHP ? PHP был выбран для AGI, т.к. callback является неотъемлимой частью проекта написанного на PHP + MySQL, потому решили и AGI пусть на PHP будет.
    Сам скрипт: http://subnets.ru/files/callback.php.txt

    Что происходит с скрипте ?

    • определяем необходимые переменные
    • получаем данные от Asterisk`а.
    • логи, куда же без них. В лог мы поместим все то, то получил AGI скрипт от Asterisk`а, это для дебага, потом можно выключить логирование.
    • проверяем номер (АОН) звонящего на доступ к callback
    • смотрим нет ли уже call файла для  данного номера, если нет, то создаем его

    В переменной $agivar[‘agi_callerid’] и содержится АОН (телефонный номер) звонящего переданного нам Asterisk`ом, что в других передаваемых переменных вы сможете увидеть в log файле.
    Если установить $debug в ноль, то тем самым выключите логирование.
    В массиве  $permit_num содержатся номера для которых разрешен callback.

    Ну и осталось дело за малым, а именно что бы был контекст (context) под звонящий номер в extensions.conf.

    Допустим наш callback номер 84955556677 набрали с мобильного 89105647899 и ему разрешен callback (номер84955556677 указан в массиве  $permit_num в скрипте), то его контекст может выглядеть вот так:

    [outgoing_to_89105647899]
    exten => s,1,Set(CallbackNumTries=0)
    exten => s,n,Set(CALLERID(num)="9998877")
    exten => s,n(start),Background(vo-vvedite-ton-num-abonent)
    exten => s,n,WaitExten(10)
    exten => 100,1,Dial(SIP/8495${EXTEN}@sip-provider,120)
    exten => _XXXXXXX,1,Dial(SIP/8495${EXTEN}@sip-provider,120)
    exten => _8X.,1,Dial(SIP/${EXTEN}@sip-provider,120)
    exten => i,1,Set(CallbackNumTries=$[${CallbackNumTries} + 1])
    exten => i,n,Playback(vo-nomer-nabran-ne-verno)
    exten => i,n,GotoIf($["${CallbackNumTries}" < "3"]?s|start)
    exten => i,n,Playback(vo-dosvidaniya)
    exten => t,1,Set(CallbackNumTries=$[${CallbackNumTries} + 1])
    exten => t,n,GotoIf($["${CallbackNumTries}" < "3"]?s|start)
    exten => t,n,Playback(vo-dosvidaniya)
    exten => t,n,Hangup()
    • устанавливаем число попыток в ноль
    • выставляем АОН (под исх. звонок)
    • проигрываем записанный текст: «переведите ваш телефон в тональный набор…. бла… бла.. бла…»
    • 10 сек. ждем от человека набора номера
    • указываем возможный набор номеров: 100 (узнать время ;)), 7-ми значный номер, 8-рка и далее сколько угодно цифр
    • даем человеку три попытки на набор номера, если истек таймаут набора номера или номер был набран не верно, то человеку это озвучивается и кол-во попыток увеличивается на 1-цу и наше мини голосовое меню начинается сначала (возврат к метке start)
    • если кол-во попыток исчерпано, то Asterisk вешает трубку

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

    Автор: Николаев Дмитрий (virus (at) subnets.ru)

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

    Назрел вопрос о реконфигурации AS5350, являющейся пограничным VoIP-шлюзом для существующей скромной (до 100 пиров) VoIP-сети.

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

    Задачи

    1. Прием входящего трафика на свою номерную емкость через потоки Е1 от разных операторов.
    2. Пропуск исходящего трафика на Е1 разных операторов (например, в зависимости от ценовой политики).
    3. Формирование АОНа на основе префикса, подставленного перед набираемым номером, присланным из IP сети.
    4. Блокировка исходящих звонков с АОНами, не прописанными на AS5350.
    5. Блокировка входящих звонков на номера, не прописанные на AS5350.

    Немного теории

    Звонок, с точки зрения AS5350, состоит из двух частей (legs) — voip и pots. Если при поступлении звонка на AS5350 не находятся диалпиры, под которые могут попасть voip и pots части звонка, то будут использоваться системные диалпиры, отображаемые под номером ноль. Ниже приведены две схемы порядка прохождения звонков:

    Входящий звонок из Е1

    Входящий звонок из Е1

    Исходящий звонок на Е1

    Посмотреть распределение активных leg-ов по диалпирам можно командой:

    show voice call status

    CallID     CID  ccVdb      Port             DSP/Ch  Called #   Codec    Dial-peers
    0x2B       12F1 0x6640CB84 3/0:D.30         1/3:1  *0007536    14400     66/2
    0x32       1256 0x6640CB84 3/1:D.31         1/3:4  *0000579536 g711alaw  0/3

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

    Настройка

    pots-диалпир для входящего трафика из потоков Е1:

    dial-peer voice 7 pots
    description INBOUND-CALLS-VIA-E1
    huntstop                                             //Нашли подходящий диалпир и останавливаем "охоту" на остальных :)
    preference 10
    incoming called-number .T        //Благодаря этой строке (.Т – любые набираемые номера) этот
    //диалпир выбирается в качестве наиболее подходящего для входящего звонка из Е1
    direct-inward-dial
    no register e164

    Замечание: в этом диалпире нет смысла указывать порт потока Е1 как и делать несколько подобных диалпиров под каждый поток, т.к. при входящем через потоки Е1 трафике на вашу номерную емкость всегда будет выбираться диалпир с наименьшим номером.

    pots-диалпир для пропуска исходящего МГ/МН трафика (начинающегося с 8-ки: 8.Т) в поток Е1 (3/1) первого провайдера:

    dial-peer voice 2 pots
    description OUTBOUND-MGMN-CALL-VIA-E1-1
    huntstop
    destination-pattern 8.T
    progress_ind setup enable 3
    progress_ind progress enable 8
    direct-inward-dial
    port 3/1:D
    no register e164

    pots-диалпир для пропуска оставшегося исходящего трафика в поток Е1 (3/0) второго провайдера:

    dial-peer voice 3 pots
    
    description OUTBOUND-REMAINING-CALLS-VIA-E1-0
    huntstop
    preference 8
    destination-pattern .T
    progress_ind setup enable 3
    progress_ind progress enable 8
    direct-inward-dial
    port 3/0:D
    no register e164

    Замечание:

    Преференс этого диалпира должен быть больше, чем pots-диалпира 1001 (описание которого будет дано ниже), иначе входящие со стороны Е1 звонки будут пытаться выйти через Е1 3/0 (и получим мы isdn-switching, который в данном случае никому не нужен).

    Тааакс… с pots-leg’ами разобрались, продолжим с voip-leg’ами.

    voip-диалпир для «приема» входящего из IP-сети номера с префиксом 009901 перед набранным номером:

    dial-peer voice 94 voip
    description inbound_peer_4_380-00-01
    translation-profile incoming CUT-PREFIX
    codec g711alaw
    incoming called-number 009901.T

    Создадим профиль преобразования АОНа и набираемого номера:

    voice translation-profile CUT-PREFIX
    translate calling 121
    translate called 120

    Создадим правило преобразования набираемого (called) номера – «отрежем» лидирующий префикс 009901:

    voice translation-rule 120
    rule 8 /^009901\(.*\)/ /\1/ type any unknown

    Создадим правило преобразования АОНа — заменим любой присланный АОН на нужный нам 380-00-01:

    voice translation-rule 121
    rule 12 /^.*/ /3800001/

    Пример типичного voip-диалпира:

    dial-peer voice 78 voip
    description TYPICAL-VOIP-PEER
    max-conn 2
    answer-address 84953800000     // answer-address служит для выбора диалпира в качестве наиболее
    // подходящего на основе АОНа звонка, пришедшего из IP-сети.
    //В данном случае у нас АОН будет 89453800000
    destination-pattern 3800000       // destination-pattern служит для выбора диалпира в качестве
    //наиболее подходящего на основе набранного номера звонка, пришедшего из Е1.
    session protocol sipv2
    session target ipv4:192.168.68.6
    dtmf-relay rtp-nte
    codec g711alaw
    no vad

    Все, что нужно мы разрешили-описали, осталась блокировка «левых» звонков, т.е. тех звонков, что не подходят ни под один dial-peer описанные выше, для чего создадим voip-диалпир:

    dial-peer voice 1001 voip
    description BAD-AON-AND-CALLED-NUM
    call-block translation-profile incoming BLOCK    //блокируем звонок из IP сети
    huntstop
    preference 7
    destination-pattern .T
    codec g711alaw
    session target ipv4:10.10.10.10

    По итогу отправляем входящий звонок из Е1 на адрес 10.10.10.10, который маршрутизируется в никуда.
    М.б. кто-то предложит лучшее решение ? С удовольствием послушаем.

    Маршрутизируем адрес в «/dev/null»:

    ip route 10.10.10.10 255.255.255.255 Null0

    Создадим профиль и правило трансляции для блокировки «левых» АОНов:

    voice translation-profile BLOCK
    translate calling 42
    !
    voice translation-rule 42
    rule 1 reject /^.*/

    Для понимания, как и какие диалпиры участвуют в «выборах» при звонке и кто из них «победил» вам поможет команда:

    debug voice dialpeer all

    Будьте аккуратны – ее вывод может быть очень объемным !

    В «отслеживании» звонков в/из IP-сети вам поможет команда:

    debug ccsip calls

    В трассировке звонка через ISDN вам поможет команда:

    debug isdn q931

    Увидеть логирование отработки правил трансляции номеров вам поможет команда:

    debug voice translation

    Замечание:

    не забывайте давать команду:

    terminal monitor

    для того, чтобы вывод дебага отображался у вас в консоли (если вы сидите на циске через telnet), иначе он будет тихо складироваться в буфер логов AS5350 и все 🙂

    Выражаю благодарность за помощь в написании статьи Сергею Бабичеву ( ака zaikini )

    Ссылки

    http://www.cisco.com/en/US/docs/ios/12_2t/12_2t11/feature/guide/ftgwrepg.html

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

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