По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Начиная своё знакомство с iptables, следует рассказать про netfilter. Netfilter - это набор программных хуков внутри ядра Linux, которые позволяют модулям ядра регистрировать функции обратного вызова от стека сетевых протоколов. Хук (hook) - это программный элемент, который позволяет перехватывать функции обратного вызова в чужих процессах. Netfilter является основой для построения Firewall'а в дистрибутивах Linux, но для того, чтобы он заработал в полную силу его нужно настроить. Как раз с помощью iptables мы можем взаимодействовать с хуками Netfilter и создавать правила фильтрации, маршрутизации, изменения и транслирования пакетов. Иногда про Netfilter забывают и называют эту связку просто iptables. Введение Итак, iptables - это утилита для настройки программного Firewall'а (межсетевого экрана) linux, которая предустанавливается по умолчанию во все сборки Linux, начиная с версии 2.4. Запускается iptables из командной строки (CLI) под пользователем с правами root и настраивается там же. Можете в этом убедиться, набрав команду iptables -V в командной строке, она покажет вам версию iptables. Почему же iptables всем так понравился, что его стали включать во все сборки Linux? Всё дело в том, что iptables действительно очень прост в настройке. С помощью него можно решить следующие задачи: Настроить stateless и statefull фильтрацию пакетов версий IPv4 и IPv6; Stateless - это фильтрация, основанная на проверке статических параметров одного пакета, например: IP адрес источника и получателя, порт и другие не изменяющиеся параметры. Statefull - это фильтрация, основанная на анализе потоков трафика. С помощью нее можно определить параметры целой TCP сессии или UDP потока. Настраивать все виды трансляции IP адресов и портов NAT, PAT, NAPT; Настроить политики QoS; Производить различные манипуляции с пакетами, например - изменять поля в заголовке IP. Прежде чем переходить к практике, давайте обратимся к теории и поймём саму логику iptables. Логика и основные понятия iptables Правила Как и все файрволлы, iptables оперирует некими правилами (rules), на основании которых решается судьба пакета, который поступил на интерфейс сетевого устройства (роутера). Ну допустим у нас есть сетевое устройство с адресом 192.168.1.1, на котором мы настроили iptables таким образом, чтобы запрещать любые ssh (порт 22) соединения на данный адрес. Если есть пакет, который идёт, например, с адреса 192.168.1.15 на адрес 192.168.1.1 и порт 22, то iptables скажет: “Э, нет, брат, тебе сюда нельзя” и выбросит пакет. Или вообще ничего не скажет и выбросит, но об этом чуть позже :) Каждое правило в iptables состоит из критерия, действия и счётчика Критерий - это условие, под которое должны подпадать параметры пакета или текущее соединение, чтобы сработало действие. В нашем примере – этим условием является наличие пакета на входящем интерфейсе, устанавливающего соединение на порт 22 Действие - операция, которую нужно проделать с пакетом или соединением в случае выполнения условий критерия. В нашем случае – запретить пакет на порт 22 Счетчик - сущность, которая считает сколько пакетов было подвержено действию правила и на основании этого, показывает их объём в байтах. Цепочки Набор правил формируется в цепочки (chains) Существуют базовые и пользовательские цепочки. Базовые цепочки - это набор предустановленных правил, которые есть в iptables по умолчанию. Существует 5 базовых цепочек и различаются они в зависимости от того, какое назначение имеет пакет. Имена базовых цепочек записываются в верхнем регистре. PREROUTING - правила в этой цепочке применяются ко всем пакетам, которые поступают на сетевой интерфейс извне; INPUT - применяются к пакетам, которые предназначаются для самого хоста или для локального процесса, запущенного на данном хосте. То есть не являются транзитными; FORWARD - правила, которые применяются к транзитным пакетам, проходящими через хост, не задерживаясь; OUTPUT - применяются к пакетам, которые сгенерированы самим хостом; POSTROUTING - применяются к пакетам, которые должны покинуть сетевой интерфейс. В базовых цепочках обязательно устанавливается политика по умолчанию, как правило – принимать (ACCEPT) или сбрасывать (DROP) пакеты. Действует она только в цепочках INPUT, FORWARD и OUTPUT Таблица Таблицы - это набор базовых и пользовательских цепочек. В зависимости от того, в какой таблице находится цепочка правил, с пакетом или соединением производятся определённые действия Существует 5 таблиц: filter - таблица, выполняющая функции фильтрации пакетов по определённым параметрам. В большинстве случаев вы будете использовать именно её. Содержит следующие встроенные цепочки: FORWARD, INPUT, OUTPUT; raw - чтобы понять предназначение этой таблицы, нужно понимать логику работы statefull firewall'а. Дело в том, что по умолчанию, iptables рассматривает каждый пакет как часть большого потока и может определить какому соединению принадлежит тот или иной пакет. С помощью raw таблицы настраиваются исключения, которые будут рассматривать пакет как отдельную, ни к чему не привязанную сущность. Содержит следующие встроенные цепочки: INPUT, OUTPUT; nat - таблица, предназначенная целиком по функции трансляции сетевых адресов. Содержит следующие встроенные цепочки: PREROUTING, OUTPUT, POSTROUTING; mangle - таблица, предназначенная для изменения различных заголовков пакета. Можно, например, изменить TTL, количество hop'ов и другое. Содержит следующие встроенные цепочки: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING>; security - используется для назначения пакетам или соединениям неких меток, которые в дальнейшем может интерпретировать SElinux. Теперь мы можем представить себе логику iptables в виде следующей схемы: Действия Ну и последнее, о чем нужно рассказать, прежде чем мы с вами начнем писать правила - это target. В контексте iptables, target - это действие, которое нужно проделать с пакетом или соединением, которое совпало с критериями правила. Итак, наиболее используемые действия: ACCEPT - разрешить прохождение пакета; DROP - тихо выбросить пакет, не сообщая причин; QUEUE - отправляет пакет за пределы логики iptables, в стороннее приложение. Это может понадобиться, когда нужно обработать пакет в рамках другого процесса в другой программе; RETURN - остановить обработку правила и вернуться на одно правило назад. Это действие подобно break'у в языке программирования. Помимо этих четырех, есть ещё масса других действий, которые называются расширенными (extension modules): REJECT - выбрасывает пакет и возвращает причину в виде ошибки, например: icmp unreachable; LOG - просто делает запись в логе, если пакет соответствует критериям правила; Есть действия, которые доступны только в определенной цепочке и таблицах, например, только в табоице nat и цепочках OUTPUT и PREROUTING доступно действие DNAT, которое используется в NAT'ировании и меняет Destination IP пакета. В той же таблице, только в цепочке POSTRUNNING доступно действие SNAT, меняющее Source IP пакета. Отдельно остановимся на действии MASQUERADE, которое делает то же самое что SNAT, только применяется на выходном интерфейсе, когда IP адрес может меняться, например, когда назначается по DHCP. Пишем правила Отлично, теперь давайте приближаться к практике. Как Вы уже поняли, мы будем писать правила, поэтому нам нужно понять, как они строятся. Итак, допустим у нас есть хост с адресом 192.168.2.17, на 80 (http) порту которого, работает вэб-сервер Apache. Мы заходим на адрес http://192.168.2.17 с хоста с адресом 192.168.2.2 и всё отлично работает: А теперь открываем командную строку под root на хосте 192.168.2.17 и пишем: iptables -A INPUT -p tcp -s 192.168.2.2 --dport 80 -j DROP Попробуем открыть открыть http://192.168.2.17 ещё раз: Упс, не работает. Давайте теперь разбираться, что мы наделали? Всё очень просто – данной командой мы: вызвали утилиту iptables; -A - этим ключом мы указали, что нужно добавить правило к существующей цепочке; INPUT - указали цепочку, к которой хотим добавить правило; -p tcp - явно указали протокол TCP. Здесь также можно указывать другие протоколы (udp, icmp, sctp), или номер протокола, инкапсулируемого в IP (17 – udp, 6 – tcp и др.); -s 192.168.2.2 - указали, какой адрес источника должен быть у пакета, который мы хотим фильтровать; --dport 80 - указали адресованные какому порту пакеты мы хотим фильтровать. В данном случае - 80, на котором работает наш сервер Apache. -j DROP - указали что нужно сделать с пакетом, параметры которого совпали с данными критериями. В данном случае – просто тихо выбросить. Таким образом, мы заблокировали все пакеты с адреса 192.168.2.2 на локальный порт 80 и тем самым закрыли доступ к нашему серверу Apache для данного хоста. Обратите внимание – мы не указывали таблицу, в цепочки которой мы хотим добавить правило. Поэтому, по умолчанию таблица - filter. Для явного указания таблицы нужно перед указанием цепочки ввести ключ -t или (--table) Чтобы открыть доступ опять просто поменяем ключ -A в правиле на -D, тем самым мы удалим данное правило из iptables. Синтаксис iptables Друзья, на самом деле в iptables очень богатый синтаксис правил. Полный список ключей и параметров вы можете найти в официальном гайде на iptables.org. Мы же приведём самые “ходовые” опции, которыми вы, вероятно, будете пользоваться. Чтобы вы не запутались, мы приводим их в табличках ниже. Для удобства, в iptables реализовано очень много сокращений для разных ключей. Например, мы писали ключ -A вместо полного --append, -p вместо полного --proto и -s вместо полного --source, дальше мы покажем, что ещё можно сократить и где применить. Начнём с команд для редактирования правил и цепочек – добавления, удаления, замены и так далее: коротко синтаксис правила применение -A --append {цепочка правила} добавить правило к цепочке (в самое начало) -D --delete {цепочка правила} удалить правило из цепочки -D --delete {номер правила в цепочке} удалить правило из цепочки по номеру (1 - x) -I --insert {номер правила вцепочке} вставить правило в цепочку по номеру (1 - x) -R --replace {номер правила вцепочке} заменить правило в цепочке по номеру (1 - x) -X --delete-chain {цепочка} удалить цепочку (только для пользовательских) -E --rename-chain {старое имя цепочки} {новое имя цепочки} переименовать цепочку -N --new {имя цепочки} создание новой пользовательской цепочки -C --check {правило цепочки} проверит наличие правила в цепочке -F --flush {цепочка} удаляет все правила в цепочке, если цепочка не указана – удалятся все правила -Z --zero {цепочка} {номер правила вцепочке} обнуляет все счётчики пакетов и байтов в цепочке или всех цепочках -P --policy {цепочка} {номер правила вцепочке} изменяет политику по умолчанию, она должна основываться на встроенном target’e {ACCEPT, DROP, QUEUE} Продолжим синтаксисом настройки правил – на каком сетевом интерфейсе следить за пакетами, какой протокол проверять, адрес источника, назначения и так далее. Кстати, перед некоторыми параметрами можно ставить восклицательный знак - !, означающее логическое НЕ. В таблице мы пометим такие параметры таким значком – (!) коротко синтаксис опции применение -p (!) --proto {протокол} протокол {tcp, udp, udplite, icmp, esp, ah, sctp} или номер протокола {16,7}, all - все протоколы -4 --ipv4 указывает версию протокола ipv4 -6 --ipv6 указывает версию протокола ipv6 -s (!) --source {адрес/маска} указывает ip адрес источника -d (!) --destination {адрес/маска} указывает ip адрес назначения -m --match включает дополнительные модули, явно задающимися данным ключем. например <code>m limit --limit 3/min</code> - установит лимит на количество пакетов в минуту -f (!) --fragment включает обработку фрагментированных пакетов, в которых нет параметров изначального полного пакета, содержащихся в первом фрагменте пакета -i (!) --in-interface {имя интерфейса} обрабатывает только входящие пакеты, прилетающие на сетевой интерфейс {имя интерфейса} -o (!) --out-interface {имя интерфейса} обрабатывает только исходящие пакеты, прилетающие на сетевой интерфейс {имя интерфейса} --set-counters {пакеты} {байты} включает счётчик для ключей--insert, --append, --replace Теперь рассмотрим опции для действий, которые должны сработать по совпадению критериев: коротко синтаксис опции применение -j --jump {действие} применяет одно из действий accept, drop, reject и другие -g --goto {цепочка} переходит к другой цепочке правил Теперь рассмотрим какую информацию мы можем вытянуть с помощью iptables и какие опции для этого нужно использовать: коротко синтаксис команды применение -l --list {цепочка} {номер правила} показывает правила в цепочке или всех цепочках. по умолчанию покажет таблицу filter -s --list-rules{цепочка} {номер правила} показывает текст правила в цепочке или всех цепочках -n --numeric покажет параметры правила в числовом виде. например не порт будет не http, а 80 -v --verbose выводит более подробную информацию -v --version покажет версию iptables -x --exact покажет точные значения числовых параметров --line-numbers покажет номера правил Для быстрого получения информации о настроенных правилах и о метриках их срабатывания, часто применяется команда, комбинирующая 3 ключа - iptables -nLv. Например, для настроенного нами ранее правила – вывод будет такой: Пример посложнее Давайте рассмотрим ещё один пример. Допустим у нас во локальной сети есть хост 192.168.2.19 с сервером Apache. Мы хотим сделать его доступным из Интернета. Для этого нам нужно воспользоваться возможностями таблицы nat и написать правило, которое будет перенаправлять входящий http трафик на внешний интерфейс (пусть будет enp0s3 с адресом 101.12.13.14) и порт 80 на адрес нашего сервера внутри сети и 80 порт – 192.168.2.19:80. По сути – нужно сделать проброс портов. Напишем такое правило: iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to 192.168.2.19:80 Теперь если мы перейдём по адресу http://101.12.13.14, то должны попасть на наш Apache. Возможности iptables настолько обширны, что мы могли бы начать писать новую Базу знаний по нему. В статье мы показали лишь базовые варианты применения. Это действительно великий инструмент и освоить его не так уж сложно. Надеюсь, данная статья Вам в этом поможет. Спасибо за внимание!
img
Всем привет! Сегодня в статье мы хотим вам рассказать про то как зарегистрировать телефоны Cisco серии 78хх на IP-АТС Asterisk. Рассматривать настройку мы будем на примере телефона Cisco 7811, самого простого из этой серии, отличающегося от других тем что, имеет только одну линию. Если вам интересно как настроить телефон для работы с оригинальными АТС от Cisco, то тут вы можете прочитать про CUCM, а тут про CME. Процесс загрузки телефона Телефоны Cisco 78хх поддерживают протокол SIP, в отличие от старых моделей, которые работали по проприетарному протоколу SCCP, и это облегчит нам настройку. Когда телефон Cisco загружается он выполняет следующие действия: Телефон получает питание c помощью блока питания или при помощи PoE; Телефон загружает ПО, которое хранится локально в его памяти; Телефон узнает голосовой VLAN ID при помощи CDP; Телефон использует DHCP чтобы узнать свой IP адрес, маску подсети, шлюз и адрес TFTP сервера; Телефон связывается с TFTP сервером и запрашивает конфигурационный файл. (У каждого телефона есть конфигурационный файл, который имеет вид SEP<мак_адрес>.cnf.xml); Телефон регистрируется на АТС CUCM, который указан в конфигурационном файле; А нам, поскольку у нас Asterisk вместо CUCM, нужно изменить конфигурационный файл, который находится на TFTP и в нем указать адрес нашей АТС, его номер и прочие параметры. Начнем по порядку. Настройка DHCP и TFTP Прежде всего нам нужно настроить DHCP сервер который будет выдавать адрес телефона и сообщать ему о TFTP сервере, а также соответственно сам TFTP сервер, на котором будут лежать все необходимые файлы. Если вы используете в качестве DHCP сервера оборудование Cisco то прочитать про то как создать на нем DHCP сервер можно здесь, а если вы используете оборудование Mikrotik то здесь. Основной момент – телефоны Cisco получают информацию о TFTP сервере при помощи параметра Option 150, и именно его нужно настроить и в нем указать адрес TFTP сервера, с которым должен связаться телефон чтобы забрать необходимые файлы. Для Cisco нужно использовать следующую команду в настройках DHCP: option 150 ip 192.168.1.20 Для Mikrotik нужно в WinBox перейти в меню IP - DHCP Server – Options и нажать “+”. Тут необходимо указать в поле Code значение 150, а в поле Value – адрес сервера. А затем в разделе Networks в поле DHCP Options указать созданную нами опцию. В нашем примере мы будем использовать бесплатную программу Tftpd64, которая может выступать в качестве DHCP и TFTP сервера, а также может показывать логи, что очень удобно для траблшутинга. В меню настроек во вкладке DHCP можно настроить все нужные параметры, в том числе и необходимую нам опцию 150. Во вкладке TFTP указываем необходимые параметры, такие как адрес директории где будут находится файлы. Если ваше оборудование не поддерживает Option 150 или вы не хотите заморачиваться с этим, то адрес TFTP сервера можно прописать на самом телефоне в разделе Настройки – Параметры администратора – Настройка сети – Настройка IPv4 и тут в пункте Дополнительный TFTP сервер установить значение “Да”, а ниже в поле TFTP-сервер вручную прописать нужный адрес. Создание экстеншена на Asterisk Создадим новый номер на нашей АТС при помощи графического интерфейса FreePBX. Для этого переходим в меню Applications – Extensions, нажимаем Add Extension и выбираем Add New PJSIP Extension. Да мы будем использовать PJSIP, поскольку телефон будет слать пакеты на стандартный порт 5060, который в Asterisk использует PJSIP. Этого будет достаточно, сохраняем и применяем конфиг. Создание необходимых файлов При загрузке телефона он будет пытаться скачать файл конфигурации и обновить свою прошивку. После того как мы подняли наш TFTP сервер нам нужно залить на него все файлы, которые будут необходимы телефону. Для начала нужно скачать файл прошивки для нашего телефона, потому что телефон будет всегда запрашивать его при загрузке. Скачать его можно с официального сайта Cisco, предварительно зарегистрировавшись там. Оттуда же нам нужно скачать файл с локалью. Далее идет самое важное – файл конфигурации телефона. Нам нужно создать XML файл, который должен называться SEP<mac_адрес_телефона>.cnf.xml. Например, SEPA1B2C3D4E5F6.cnf.xml Для создания этого файла лучше всего использовать специальный XML-редактор (например, EditiX), чтобы не было проблем с валидацией. Его содержание должно быть таким: <?xml version="1.0" encoding="UTF-8" <device> <versionStamp>{7821 Aug 28 2015 12:40:48}</versionStamp> <devicePool> <dateTimeSetting> <dateTemplate>D.M.Y</dateTemplate> <timeZone>E. Europe Standard/Daylight Time</timeZone> <ntps> <ntp> <name>time.windows.com</name> <ntpMode>Unicast</ntpMode> </ntp> </ntps> </dateTimeSetting> <callManagerGroup> <members> <member priority="0"> <callManager> <ports> <ethernetPhonePort>2000</ethernetPhonePort> </ports> <processNodeName>192.168.1.17</processNodeName> </callManager> </member> </members> </callManagerGroup> </devicePool> <commonProfile> <callLogBlfEnabled>3</callLogBlfEnabled> </commonProfile> <loadInformation>sip78xx.12-5-1-16</loadInformation> <userLocale> <name>Russian_Russia</name> <uid/> <langCode>ru_RU</langCode> <version/> <winCharSet>utf-8</winCharSet> </userLocale> <networkLocale>United_States</networkLocale> <networkLocaleInfo> <name>Russian_Russia</name> </networkLocaleInfo> <idleTimeout>0</idleTimeout> <authenticationURL/> <directoryURL/> <idleURL/> <informationURL/> <messagesURL/> <proxyServerURL/> <servicesURL/> <capfAuthMode>0</capfAuthMode> <capfList> <capf> <phonePort>5060</phonePort> <processNodeName/> </capf> </capfList> <deviceSecurityMode>1</deviceSecurityMode> <sipProfile> <sipCallFeatures> <cnfJoinEnabled>true</cnfJoinEnabled> <callForwardURI>x--serviceuri-cfwdall</callForwardURI> <callPickupURI>x-cisco-serviceuri-pickup</callPickupURI> <callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI> <callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI> <meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI> <abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI> <rfc2543Hold>true</rfc2543Hold> <callHoldRingback>2</callHoldRingback> <localCfwdEnable>true</localCfwdEnable> <semiAttendedTransfer>true</semiAttendedTransfer> <anonymousCallBlock>2</anonymousCallBlock> <callerIdBlocking>0</callerIdBlocking> <dndControl>0</dndControl> <remoteCcEnable>true</remoteCcEnable> </sipCallFeatures> <sipStack> <sipInviteRetx>6</sipInviteRetx> <sipRetx>10</sipRetx> <timerInviteExpires>180</timerInviteExpires> <timerRegisterExpires>120</timerRegisterExpires> <timerRegisterDelta>5</timerRegisterDelta> <timerKeepAliveExpires>120</timerKeepAliveExpires> <timerSubscribeExpires>120</timerSubscribeExpires> <timerSubscribeDelta>5</timerSubscribeDelta> <timerT1>500</timerT1> <timerT2>4000</timerT2> <maxRedirects>70</maxRedirects> <remotePartyID>false</remotePartyID> <userInfo>None</userInfo> </sipStack> <autoAnswerTimer>1</autoAnswerTimer> <autoAnswerAltBehavior>false</autoAnswerAltBehavior> <autoAnswerOverride>true</autoAnswerOverride> <transferOnhookEnabled>true</transferOnhookEnabled> <enableVad>false</enableVad> <preferredCodec>g729</preferredCodec> <dtmfAvtPayload>101</dtmfAvtPayload> <dtmfDbLevel>3</dtmfDbLevel> <dtmfOutofBand>avt</dtmfOutofBand> <alwaysUsePrimeLine>false</alwaysUsePrimeLine> <alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail> <kpml>3</kpml> <stutterMsgWaiting>1</stutterMsgWaiting> <callStats>false</callStats> <silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts> <disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig> <startMediaPort>16384</startMediaPort> <stopMediaPort>16399</stopMediaPort> <voipControlPort>5069</voipControlPort> <dscpForAudio>184</dscpForAudio> <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy> <dialTemplate>dialplan.xml</dialTemplate> <phoneLabel>Office</phoneLabel> <sipLines> <line button="1"> <featureID>9</featureID> <featureLabel>Merion Networks</featureLabel> <name>200</name> <displayName>Cisco</displayName> <contact>200</contact> <proxy>192.168.1.17</proxy> <port>5060</port> <autoAnswer> <autoAnswerEnabled>2</autoAnswerEnabled> </autoAnswer> <callWaiting>3</callWaiting> <authName>200</authName> <authPassword>qwe123</authPassword> <sharedLine>false</sharedLine> <messageWaitingLampPolicy>1</messageWaitingLampPolicy> <messagesNumber>121</messagesNumber> <ringSettingIdle>4</ringSettingIdle> <ringSettingActive>5</ringSettingActive> <forwardCallInfoDisplay> <callerName>true</callerName> <callerNumber>false</callerNumber> <redirectedNumber>false</redirectedNumber> <dialedNumber>true</dialedNumber> </forwardCallInfoDisplay> </line> </sipLines> </sipProfile> </device> Что нас здесь интересует и что нужно изменить: <timeZone> - E. Europe Standard/Daylight Time - в нашем примере мы используем временную зону, которая подходит для Москвы UTC+3. <processNodeName> – адрес нашего Asterisk <loadInformation> – имя файла прошивки (который с расширением .loads) <userLocale><name> и <networkLocaleInfo> - Russian_Russia – папка с локалью <phonePort> - 5060 – номер SIP порта <voipControlPort> - номер порта телефона И рассмотрим блок <line button="1"> с настройкой линии. Здесь нужно изменить в соответствии с нашими данными: <featureLabel>Merion Networks</featureLabel> - Имя на телефона <name>200</name> - Номер экстеншена <displayName>Cisco</displayName> - Имя экстеншена <contact>200</contact> - Снова номер экстеншена <proxy>192.168.1.17</proxy> - Адрес Asterisk <port>5060</port> - номер SIP порта <authName>200</authName> - Еще раз номер экстеншена <authPassword>qwe123</authPassword> - Пароль экстеншена Помимо этого, создаем файл диалпана dialplan.xml, без которого телефон не загрузится: <DIALTEMPLATE> <TEMPLATE MATCH="8,800......." Timeout="1"/> <TEMPLATE MATCH="8,.........." Timeout="1"/> <TEMPLATE MATCH="0.." Timeout="1"/> <TEMPLATE MATCH="1..." Timeout="1"/> <TEMPLATE MATCH="2..." Timeout="1"/> <TEMPLATE MATCH="3..." Timeout="1"/> <TEMPLATE MATCH="4..." Timeout="1"/> <TEMPLATE MATCH="[5-7]..." Timeout="1"/> <TEMPLATE MATCH="**...." Timeout="0"/> <TEMPLATE MATCH="*" Timeout="3"/> </DIALTEMPLATE> Далее создаем файл g3-tones.xml со следующим содержанием: <tones> <trkLocaleName>Russian_Federation</trkLocaleName> <trkBaseClearcaseVersion>/main/3.3.release/1</trkBaseClearcaseVersion> <trkTranslationVersion>0</trkTranslationVersion> <tone c1="30959" i1="-1879" d="1" t="ringing"> <part m="on" t="800"/> <part m="off" t="3200"/> <repeat c="65535"/> </tone> <tone c1="30959" i1="-1879" d="1" t="reorder"> <part m="on" t="200"/> <part m="off" t="200"/> <repeat c="65535"/> </tone> <tone c1="30959" i1="-1879" d="1" t="busy"> <part m="on" t="400"/> <part m="off" t="400"/> <repeat c="65535"/> </tone> <tone c1="30959" i1="-1879" d="1" t="odial"> <part m="on" t="65535"/> <repeat c="65535"/> </tone> <tone c1="30959" i1="-1879" d="1" t="idial"> <part m="on" t="65535"/> <repeat c="65535"/> </tone> <tone c1="14876" i1="-5346" d="1" t="recording"> <part m="on" t="400"/> <part m="off" t="15000"/> <repeat c="65535"/> </tone> <tone c1="30743" i1="-1384" c2="29780" i2="-1252" c3="30743" i3="-1384" c4="29780" i4="-1252" d="34" t="amwi"> <part m="on" t="100" /> <part m="off" t="100" /> <part m="on" t="65535" /> <repeat c="65535" pc1="10" pc2="65535"/> </tone> <tone c1="30831" i1="-2032" d="17" t="monitoring"> <part m="on" t="1500"/> <part m="off" t="8000"/> <part m="on" t="500"/> <part m="off" t="8000"/> <repeat c="65535"/> </tone> </tones> После этого создаем в директории TFTP папку Russian_Russia (или ту которую указали в <userLocale><name> и <networkLocaleInfo><name>) и переносим туда файл g3-tones.xml. Также туда необходимо перенести файл локали sp-sip.jar. И наконец нам нужно создать три пустых файла: CTLSEPSEP<mac_адрес_телефона>.tlv ITLSSEPSEP<mac_адрес_телефона>.tlv ITLFile.tlv Эти файлы нужны чтобы у нас не было ошибки “No Trust List Installed”. На этом все. По итогу в директории нашего TFTP сервера должны быть следующие файлы: SEP<mac_адрес_телефона>.cnf.xml dialplan.xml sip78xx.12-5-1-16.loads CTLSEP<mac_адрес_телефона>.tlv ITLSSEP<mac_адрес_телефона>.tlv ITLFile.tlv Папка Russian_Russia с файлами: g3-tones.xml и sp-sip.jar Загрузка телефона На этом наша подготовка закончена, и мы теперь можем включить телефон. Он начнет загружаться, получит IP адрес и пойдет на TFTP чтобы скачать все необходимые файлы. При помощи Tftfd64 можно смотреть за происходящем через вкладку Log Viewer, где можно увидеть какие файлы скачивает, и каких ему не хватает, в случае ошибки. Если все нормально, то телефон скачает файл конфигурации, затем установит новую версию прошивки с TFTP и выбранную локаль, после чего перезагрузится. После прошивки он начнет связываться с нашей IP-АТС Asterisk и начнется процесс регистрации в результате, которого мы получим телефон Cisco, работающий с Asterisk по протоколу SIP. Успех! Теперь можем проверять телефон и делать звонки!
img
Сегодня подробно расскажем как найти практическое применение знаниям, полученным в статье про структуру asteriskcdrdb, а именно, как сделать ежедневные отчеты о входящих звонках на почту. Создание скрипта Чтобы наш .php скрипт смог подключиться к базе данных, необходимо создать пользователя, с правами, которые буду позволять ему извлекать необходимую информацию. Для этого, подключимся к нашему серверу по SSH [root@asterisk]# mysql mysql>CREATE USER ' user'@'localhost' IDENTIFIED BY 'P@ssw0rd'; На данном этапе мы создали пользователя user с паролем P@ssw0rd. Далее дадим ему необходимые права: mysql> GRANT SELECT ON asteriskcdrdb.cdr TO 'user' Создадим файл с расширением .php, в котором мы отразим подключение к нашей базе данных. Запишем эту конструкцию так: $hostname = "localhost"; //адрес хоста. Скрипт мы будем запускать на той же машине, на которой находится БД asteriskcdrdb; $username = "user"; //отражаем пользователя $password = "P@ssw0rd"; //пароль для созданного нами пользователя $dbName = "asteriskcdrdb"; //база данных, в которой хранятся необходимые нам данные $today = date('y-m-d'); // сегодняшняя дата в формате 2016-03-25 $counter = 1; // счетчик mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); // соединиться к БД mysql_select_db($dbName) or die(mysql_error()); //выбрать базу данных. Если произойдет ошибка - вывести ее $headers = "; charset=windows-1251 "; //заголовок для письма $headers .= "From: Мерион Нетворкс <info@merionet.ru> "; $headers .= "Reply-To: info@merionet.ru "; Предположим, что все входящие звонки приходят на номер секретаря – 100. Так же мы знаем, что при звонке из города, мы видим номер звонящего, который содержит в себе больше 3 символов (пусть у нас используется трехзначная внутренняя нумерация). Наша задача сводится к формулировке запроса к таблице cdr. Добавляем к нашему .php файлу: $query = "SELECT `dst` , `src` , `duration` , `dstchannel` , `calldate` , `disposition` FROM `cdr` WHERE `calldate` >='$today 00:00:00' AND `calldate` <='$today 23:59:59' AND LENGTH( `src` ) >3 AND `dst` = '100';" ; $res=mysql_query($query) or die(mysql_error()); // Выполнить запрос. Если произойдет ошибка - вывести ее. $number = mysql_num_rows($res); // Как много нашлось строк У нас почти все готово. Осталось только обработать данные на выходе. Для этого, нам понадобится следующая конструкция: //формируем шапку нашей таблицы со значениями $mes .= ' table style="max-width: 575px;border-bottom:none; margin: 0 auto;border-spacing: inherit;"> thead> tr style="border-bottom: 2px solid #05477c;"> th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Порядковый номер</th> th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Дата</th> th style="padding:10px; color: #fff; max-width: 100px;background:#05477c;">От кого</th> th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Кому</th> th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Статус звонка</th> /tr> /thead>'; //перебираем значения ассоциативного массива. Число элементов данного массива равно числу строк на выходе sql запроса while ($row=mysql_fetch_array($res)) { $mes .= ' tbody> tr style="width: 100px;"> td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$counter.'</td> td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['calldate'].'</td> td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['src'].'</td> td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$row['dst'].'</td> td style="padding:10px; text-align:center; border-bottom: 1px solid #eee; min-width: 120px; ">'.$row['disposition'].'</td> /tr>'; $counter = $counter + 1; } Теперь, мы храним в переменной $mes html таблицу, которая готова к отправке на почту. Добавим в конец скрипта: mail("info@merionet.ru", 'Все входящие за '.$today.'', $mes, $headers); ВАЖНО! Если вы используете кириллические символы, установите кодировку .php файла на Кириллицу (windows-1251) Итак, готово. Давайте посмотрим что приходит нам на почту: Работает. Давайте сделаем ежедневное задание на отработку этого скрипта через cron. Сделаем, например, ежедневно, в 17:30, когда рабочий день подходит к концу: 30 17 * * * php /home/admin/mail_report.php Не забудьте в начала скрипта поставить открывающий тэг php, а в конце скрипта закрывающий.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59