воскресенье, 27 марта 2016 г.

Шаблоны и настройка звонков между SIP-клиентами в Asterisk

Как известно, чтобы съесть слона, достаточно есть его по кусочкам. Сегодня рассмотрим ещё несколько простых тем:
  • использование шаблонов для описания SIP-клиентов в файле /etc/asterisk/sip.conf,
  • настройка номерного плана /etc/asterisk/extensions.conf, для соединения абонентов друг с другом,
  • использование в номерном плане шаблонов номеров и встроенных переменных,
  • использование встроенных функций номерного плана и настройку тестовых номеров для проговаривания номер звонящего абонента.
1. Использование шаблонов

В прошлой заметке Настройка SIP-клиента и тестовых номеров в Asterisk у нас получился файл /etc/asterisk/sip.conf со следующим содержимым:
[general]
allowguest=no
alwaysauthreject=yes

[1000]
call-limit=1
type=friend
context=phones
host=dynamic
secret=password
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24
Теперь, чтобы добавить новых SIP-клиентов, можно просто скопировать секцию 1000 и отредактировать её. Если подобных клиентов будет много, то при необходимости поменять одну и ту же настройку у всех клиентов, нужно будет потратить некоторое время на правку настроек каждого клиента. Вместо этого можно создать шаблон, в котором будут указываться общие настройки для определённой группы клиентов. Шаблон потом можно назначить каждому из клиентов. Файл /etc/asterisk/sip.conf будет выглядеть следующим образом:
[general]
allowguest=no
alwaysauthreject=yes

[ata](!)
call-limit=1
language=ru
type=friend
context=phones
host=dynamic
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24

[1000](ata)
secret=password

[1001](ata)
secret=password2
Восклицательный знак в скобках указывает, что эта секция является шаблоном. Если же в скобках указан какой-то другой текст, то он интерпретируется как название шаблона, который нужно использовать как настройки по умолчанию для этой секции. Каждому клиенту можно назначать и более одного шаблона. В этом случае шаблоны перечисляются в скобках через запятую. Например, один шаблон может указывать настройки клиентов в локальной сети, а другой - настройки кодеков для определённых моделей шлюзов. Если я правильно понимаю, то шаблоны не могут быть иерархическими, а при указании нескольких шаблонов, настройки предыдущих шаблонов перекрываются настройками из последующих.

Как обычно, для вступления новых настроек в силу, выполним соответствующую команду:
# asterisk -rx 'sip reload'
2. Звонки между SIP-клиентами

Для соединения абонентов между собой в Asterisk существует приложение номерного плана Dial. У этого приложения есть множество различных возможностей и настроек, но сейчас нам достаточно знать, что вызов приложения типа Dial(SIP/1000) означает соединение звонящего с SIP-абонентом с идентификатором 1000. Если у нас есть всего два тестовых абонента, то достаточно настроить в номерном плане в файле /etc/asterisk/extensions.conf всего две записи:
exten => 1000,1,Dial(SIP/1000)

exten => 1001,1,Dial(SIP/1001)
После этого можно перезагрузить номерной план такой командой:
# asterisk -rx 'dialplan reload'
Теперь с одного телефона можно позвонить на другой.

3. Шаблоны номеров и переменные

У настроек, рассмотренных в предыдущем разделе, есть один большой недостаток - при появлении нового SIP-клиента для него нужно создавать новую запись в номерном плане. Чтобы исправить этот недостаток, воспользуемся шаблонами и предопределённой переменной ${EXTEN}. Шаблоны позволяют не указывать точный номер телефона, а предопределённая переменная ${EXTEN} позволяет передать номер в приложение:
exten => _1XXX,1,Dial(SIP/${EXTEN})
Шаблоны номеров начинаются с символа подчёркивания. Далее следуют цифры или подстановочные символы:
  • [15-7] - одна из цифр: 1, 5, 6 или 7,
  • X - одна цифра от 0 до 9. Является более короткой записью для [0-9],
  • Z - одна цифра от 1 до 9. Является более короткой записью для [1-9],
  • N - одна цифра от 2 до 9. Является более короткой записью для [2-9],
  • . - одно или более соответствий предыдущему подстановочному символу. Например, шаблон _N. будет совпадать с любым количеством цифр от 2 до 9,
  • ! - ноль и более соответствий предыдущему подстановочному символу. Например, шаблон _1N! будет соответствовать номеру 1 и любым номерам, начинающимися с единицы и продолжающимися цифрами от 2 до 9.
Переменная ${EXTEN} содержит в себе набранный номер. Из этого номера можно вырезать произвольные фрагменты. Например, ${EXTEN:1} вернёт все цифры, кроме первой. ${EXTEN:1:2} вернёт две цифры после первой.

Ещё одна важная деталь номерного плана состоит в том, что Asterisk стремится найти наиболее точно заданный шаблон. Например, если задать в номерном плане два шаблона:
exten => _XXXX,1,Playback(tt-monkeyintro)

exten => _1XXX,1,Dial(SIP/${EXTEN})
То первое соответствие будет срабатывать только для тех номеров, которые не начинаются с 1. То есть Asterisk не обращает внимания на порядок перечисления шаблонов и выбирает для номеров, начинающихся с 1 второе правило, хотя первое для таких номеров тоже подходит.

Итак, осталось перезагрузить номерной план и проверить прохождение звонков с одного номера на другой:
# asterisk -rx 'dialplan reload'
4. Функции и ещё несколько тестовых номеров

Кроме переменных, таких как ${EXTEN}, в Asterisk существуют ещё и функции. Функции вызываются похожим образом, но могут принимать аргументы. Одной из таких функций является функция ${CALLERID()}. Она возвращает информацию о звонящем абоненте. Если указать ей аргумент num, то она вернёт номер звонящего абонента.

Кроме того, в Asterisk существуют приложения SayDigits() и SayNumber(). Первое произносит цифры, переданные ему в аргументе. Второе умеет произносить целые числа от 0 до 99999999 (8 цифр, числа до 100 миллионов), переданные ему в аргументе.

Воспользуемся функцией ${CALLERID()} и приложениями SayDigits() и SayNumber() для создания в номерном плане в /etc/asterisk/extensions.conf ещё двух тестовых номеров, с помощью которых можно узнать номер телефона, с которого вы позвонили на соответствующий тестовый номер:
exten => 502,1,SayDigits(${CALLERID(num)})

exten => 503,1,SayNumber(${CALLERID(num)})
Первое приложение кажется не столь полезным, однако оно, в отличие от второго, позволяет точно воспроизводить номера телефонов, начинающихся с одного и более нулей. В этом случае второй тестовый номер опустит старшие нули и воспроизведёт только число, в то время как первый позволит узнать точное количество нулей в начале номера.

Можно совместить оба приложения в пределах одного тестового номера, так чтобы сначала проговаривался номер, а потом, после небольшой паузы, цифры номера. Заодно воспользуемся сокращением same, которое можно использовать, чтобы не повторять номер в каждой строчке номерного плана:
exten => 504,1,SayNumber(${CALLERID(num)})
same  =>     n,Wait(1)
same  =>     n,SayDigits(${CALLERID(num)})
Как обычно, теперь нужно перезагрузить номерной план:
# asterisk -rx 'dialplan reload'
Эти тестовые номера могут оказаться полезными новым сотрудникам, сотрудникам, временно севшими за чужое рабочее место, и техническому персоналу для диагностики проблем телефонии.

Полезные ссылки:

воскресенье, 20 марта 2016 г.

Настройка SIP-клиента и тестовых номеров в Asterisk

В прошлой заметке Автоматическая настройка голосового шлюза Cisco ATA 186 я рассказал о том, как можно сбросить настройки шлюза, автоматически настроить его при помощи DHCP- и TFTP-серверов, обновить прошивку и продиагностировать проблемы с помощью сетевого сниффера.

В этой заметке я рассмотрю первичную настройку Asterisk, подключение к системе голосового шлюза Cisco ATA 186 по протоколу SIP и настройку тестовых номеров для проверки связи между телефоном и Asterisk. Хочу сразу предупредить, что не имею опыта работы с Asterisk и поэтому приведённая здесь конфигурация может привести ко взлому телефонной системы, что при наличии подключения к сети телефонного оператора может вылиться в большие счета за международную связь.

1. Установка и включение
Установим Asterisk:
# apt-get install asterisk
Включим запуск asterisk при загрузке системы:
# systemctl enable asterisk.service
Запустим asterisk:
# systemctl start asterisk.service
Для подключения к консоли запущенного asterisk можно ввести следующую команду:
# asterisk -r
2. Подключение SIP-телефона

Для начала переименуем все имеющиеся файлы, настраивающие номерной план, чтобы имеющиеся в них настройки не мешали нам:
# cd /etc/asterisk/
# mv extensions.conf extensions.conf.sample
# mv extensions.lua extensions.lua.sample
# mv extensions.ael extensions.ael.sample
Создадим пустой номерной план в файле /etc/asterisk/extensions.conf:
[globals]

[general]

[internal]

[phones]
include => internal
Контексты globals и general являются специальными. Имена остальных контекстов - произвольные, но они могут состоять только из латинских букв и цифр, знаков подчёркивания и минусов. Пробелы в именах контекстов не допускаются. В контексте phones осуществляется включение всех настроек из контекста internal.

Чтобы новые настройки номерного плана вступили в силу, выполним такие команды:
# asterisk -rx 'module unload pbx_lua.so'
# asterisk -rx 'module unload pbx_ael.so'
# asterisk -rx 'module reload pbx_config.so'
# asterisk -rx 'dialplan reload'
Теперь переименуем файл /etc/asterisk/sip.conf, чтобы он не мешал нам:
# mv sip.conf sip.conf.sample
Вместо него создадим тестовый файл /etc/asterisk/sip.conf со следующим содержимым:
[general]
allowguest=no
alwaysauthreject=yes

[1000]
call-limit=1
type=friend
context=phones
host=dynamic
secret=password
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24
Этот файл настраивает учётную запись SIP-клиента с идентификатором 1000 и паролем password. Клиент не имеет предопределённого адреса, его IP-адрес будет определяться в момент его регистрации в телефонной системе. При попытке позвонить с этого телефона будет использоваться контекст phones.

Реальный пароль я рекомендую сгенерировать, например, при помощи программы pwgen. Если пароль не будет вводиться человеком вручную, можно сгенерировать сразу длинный пароль. Следующая команда выдаст варианты 16-символьных паролей, один из которых можно выбрать:
$ pwgen 16
Для усиления безопасности в разделе general первой указана настройка allowguest=no, запрещающая Asterisk обрабатывать звонки от незарегистрированных в системе SIP-клиентов. По умолчанию Asterisk выдаёт разные ошибки для случая, когда SIP-клиент использовал несуществующее имя пользователя, и для случая, когда SIP-клиент использовал верное имя пользователя, но указал неправильный пароль. Такая настройка по умолчанию облегчает подбор имени пользователя и его пароля взломщику, поэтому второй настройкой alwaysauthreject=yes в разделе general мы задаём выдачу одинакового сообщения об ошибке в обоих случаях.

Настройка call-limit=1 разрешает клиенту звонить одновременно только на один номер. Позвонить на один номер, а затем в процессе разговора позвонить с использованием той же учётной записи на другой номер не получится. Не смотря на то, что у клиента нет постоянного IP-адреса, опции deny и permit разрешают клиенту регистрироваться только с IP-адресов в сети 169.254.254.0/24.

Чтобы новые настройки модуля sip вступили в силу, выполним команды:
# asterisk -rx 'reload chan_sip.so'
# asterisk -rx 'sip reload'
3. Настройка пакетного фильтра

Портом по умолчанию для SIP-клиентов на Asterisk является UDP-порт 5060. Для голосового трафика между Asterisk и SIP-клиентами используются UDP-порты с 10000 по 20000. В этом можно убедиться, заглянув в файл /etc/asterisk/rtp.conf, содержимое которого, если из него удалить комментарии, сведётся к следующим строчкам:
[general]
rtpstart=10000
rtpend=20000
Таким образом, чтобы клиенты из сети 169.254.254.0/24 через интерфейс br0 смогли работать с Asterisk, нужно выполнить такую команду:
# iptables -A INPUT -i br0 -s 169.254.254.0/24 -d 169.254.254.1 -p udp -m multiport --dports 5060,10000:20000 -j ACCEPT
Предполагается, что iptables настроен в режиме учёта состояния подключений, для чего где-то в начале правил должна быть настроена команда, которая умеет пропускать однажды разрешённый трафик и ответный трафик:
# iptables -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
После этого можно попробовать посмотреть список зарегистрированных на Asterisk SIP-клиентов:
# asterisk -rx 'sip show peers'
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      
1000/1000                 169.254.254.8                            D  Auto (No)  No          A  5060     Unmonitored                                  
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 0 offline]
4. Тестовый номер 500. Проигрывание музыки

Наш первый номер в номерном плане будет просто воспроизводить музыку позвонившему абоненту. Для этого сначала установим пакеты, содержащий музыкальные файлы:
# apt-get install asterisk-moh-opsound-gsm asterisk-moh-opsound-g722 asterisk-moh-opsound-wav
Теперь добавим в контекст internal номерного плана в файле /etc/asterisk/extensions.conf следующую строчку:
exten => 500,1,MusicOnHold()
Она предписывает воспроизвести музыку абоненту, позвонившему на номер 500. Чтобы новые настройки вступили в силу, перезагрузим номерной план и модуль moh:
# asterisk -rx 'dialplan reload'
# asterisk -rx 'moh reload'
Теперь можно попробовать поднять трубку телефона и набрать номер 500. Если в трубке начала воспроизводиться музыка, то тест успешно пройден.

4. Тестовый номер 501. Эхо-тест

Второй тестовый номер будет воспроизводить фразу о начале эхо-теста, затем повторять с небольшой задержкой всё произнесённое в трубку. Чтобы завершить эхо-тест, можно сразу повесить трубку, а можно нажать клавишу с решёткой. В этом случае будет воспроизведена фраза о завершении эхо-теста, после чего телефонная станция повесит трубку. Для начала установим пакеты, содержащие голосовые файлы на русском языке:
# apt-get install asterisk-core-sounds-ru-gsm asterisk-core-sounds-ru-g722 asterisk-core-sounds-ru-wav
Теперь добавим в файл /etc/asterisk/sip.conf к настройкам SIP-клиента ещё одну строчку, которая задаёт язык абонента:
language=ru
Добавим в контекст internal номерного плана ещё один тестовый номер:
exten => 501,1,Playback(demo-echotest)
exten => 501,n,Echo()
exten => 501,n,Playback(demo-echodone)
Осталось перезагрузить модули, настройки которых изменялись:
# asterisk -rx 'reload chan_sip.so'
# asterisk -rx 'reload app_playback.so'
# asterisk -rx 'dialplan reload'
# asterisk -rx 'sip reload'
Теперь можно попробовать поднять трубку телефона и набрать номер 501. В трубке должна прозвучать фраза о начале эхо-теста. Потом, если всё настроено правильно, в трубке можно будет услышать эхо собственного голоса. Для завершения теста можно нажать решётку или повесить трубку.

На этом пока всё. Буду рад услышать конструктивную критику, замечания и предложения.

воскресенье, 13 марта 2016 г.

Автоматическая настройка голосового шлюза Cisco ATA 186

Голосовой шлюз Cisco ATA 186 - это устройство, которое может превратить два обычных аналоговых телефона с тоновым набором в два SIP-телефона. Телефоны подключаются к портам FXS, а сам шлюз - в сеть Ethernet.

В руководстве администратора описаны различные способы настройки шлюза: через веб-интерфейс, с помощью телефона с тоновым набором и посредством протоколов DHCP и TFTP. Наиболее интересным способом настройки мне показалась настройка через протоколы DHCP и TFTP.

1. Сброс настроек шлюза

Предположим, что имеется шлюз, который ранее где-то использовался и текущие настройки которого нам не известны. Для начала нужно сбросить его к заводским настройкам. Для этого подключим телефонный аппарат с тоновым набором в первый порт, поднимем трубку и нажмём кнопку на корпусе шлюза. Шлюз должен начать воспрозводить зацикленное голосовое меню. Наберём номер 322873738# (номер соответствует буквам FACTRESET) и подтвердим сброс нажатием *. Если вместо * нажать #, то действие будет отменено и шлюз опять начнёт воспроизводить голосовое меню.

2. Настройка DHCP-сервера

Шлюз со сброшенными настройками будет запрашивать сетевые настройки у DHCP-сервера. DHCP-сервер среди прочих настроек может сообщить шлюзу IP-адрес TFTP-сервера, с которого шлюз может запросить уже все остальные свои настройки. По сути, для удалённой настройки таким способом нужно знать только MAC-адрес шлюза, который написан на корпусе шлюза.

Установим на сервер, который будет использоваться для раздачи настроек шлюзам, DHCP-сервер:
# apt-get install isc-dhcp-server
Пропишем в файл /etc/default/isc-dhcp-server список интерфейсов, на которых DHCP-сервер будет ожидать запросы:
INTERFACES="br0"
Пропишем в файл /etc/dhcp/dhcpd.conf следующие настройки:
subnet 169.254.254.0 netmask 255.255.255.0 { # Сеть, настройки которой описаны ниже
  range 169.254.254.2 169.254.254.254;       # Диапазон выдаваемых IP-адресов

  option routers 169.254.254.1;              # Маршрут по умолчанию
  option broadcast-address 169.254.254.255;  # Адрес для широковещательных рассылок

  option domain-name "stupin.su";            # Доменное имя, выдаваемое DHCP-клиентам
  option domain-name-servers 169.254.254.1;  # DNS-сервер, выдаваемый клиентам

  option ntp-servers 169.254.254.1;          # NTP-сервер, выдаваемый клиентам
  option time-offset 18000;                  # Часовой пояс - секунды, прибавляемые ко времени UTC
                                             # 18000 секунд - это 5 часов, Asia/Yekaterinburg

  option tftp-server-name "169.254.254.1";   # TFTP-сервер

  default-lease-time 86400;                  # Время аренды выданного IP-адреса (сутки)
  max-lease-time 172800;                     # Максимальное время аренды IP-адреса (2 суток) 
}
А для того, чтобы шлюзу всегда выдавался один и тот же адрес, можно вписать в тот же файл ещё одну секцию. В реальных условиях это может быть не оправданно, т.к. при большом количестве шлюзов лучше сэкономить IP-адреса на тех шлюзах, которые давно не появляются в сети. Сделать это можно вот так:
host ata1 {
  hardware ethernet 00:25:45:94:96:ab;
  fixed-address 169.254.254.8;
}
Теперь перезапустим DHCP-сервер, чтобы его настройки вступили в силу:
# systemctl restart isc-dhcp-server.service

3. Настройка TFTP-сервера

В качестве TFTP-сервера я воспользуюсь tftpd-hpa, настройку которого я описывал ранее в заметке Настройка TFTP-сервера tftpd-hpa.

Чтобы подготовить настройки шлюза, нужно обзавестись архивом с прошивкой. В моём случае это архив ata_03_02_01_sip_050616_a.zip. Внутри него кроме прошивки имеются пример файла конфигурации sip_example.txt с подробными комментариями, программа cfgfmt.linux, которая умеет преобразовывать этот файл в двоичный и файл ptag.dat, в котором хранятся правила преобразования текстового файла конфигурации в двоичный.

Можно скопировать файл sip_example.txt в файл с именем ata.txt и отредактировать настройки. Впрочем, можно создать файл самостоятельно. Первой строчкой файла должна быть строчка "#ata".

3.1. Обновление прошивки шлюза

Для начала создадим файл ata0025459496ab.txt, который заставит шлюз обновить свою прошивку:
#ata

dhcp:1
UseTftp:1
upgradecode:3,0x301,0x0400,0x0200,169.254.254.1,69,0x050616A,ATA030201SIP050616A.zup
Имя файла прошивки ATA030201SIP050616A.zup задаётся в последнем параметре. Цифры 030201 соответствуют версии прошивки 3.2.1. SIP указывает на протокол (имеются также варианты для протоколов SCCP и MGCP). 050616A - это идентификатор прошивки, его нужно указать в параметре перед именем прошивки, записав в виде 0x050616A. Ещё два параметра - это IP-адрес и порт TFTP-сервера (169.254.254.1 и 69). Если нужно обновить прошивку, то первым параметром нужно указать 3. Для отключения обновления прошивки нужно указать 0.

Осталось преобразовать файл с настройками в двоичный вид при помощи следующей команды:
# cfgfmt.linux -tptag.dat -sip ata0025459496ab.txt ata0025459496ab
Теперь можно перейти в браузере по ссылке http://169.254.254.8/refresh, чтобы шлюз скачал настройки и обновил прошивку.

3.2. Защита веб-интерфейса паролем

Чтобы защитить веб-интерфейс паролем, можно задать такую настройку:
UIPassword:123456

3.3. Настройка часового пояса

Поскольку шлюз почему-то не использует настройку часового пояса, полученную по DHCP, можно задать эту настройку в файле конфигурации:
TimeZone:5

3.4. Настройка отправки сообщений на Syslog

Для подробного журналирования всех событий, происходящих на шлюзе можно вписать в файл настройки, задающие адрес сервера Syslog и указать число, 8 бит которого соответствуют 8 типам разных событий:
SyslogIP:169.254.254.1.514
SyslogCtrl:0x000000ff

3.5. Настройка подключения к SIP-серверу

Для настройки подключения первого телефона к SIP-серверу нужно задать следующие настройки:
Proxy:169.254.254.1:5060
UID0:1000
PWD0:password
SIPRegOn:1
Proxy задаёт IP-адрес и порт SIP-сервера. UID0 задаёт имя пользователя SIP-сервера. PWD0 задаёт пароль пользователя на SIP-сервере. SIPRegOn включает регистрацию на SIP-сервере.

4. Отладка сниффером

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

4.1. Скачивание конфигурации и обновление прошивки

Если настроено обновление прошивки, то прослушивая трафик между TFTP-сервером и шлюзом, можно увидеть, как шлюз последовательно запрашивает файл с настройками, а затем - прошивку:
root@stupin:/var/tftp# tcpdump -npi br0 host 169.254.254.8 and udp port 69
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:02:55.854073 IP 169.254.254.8.12200 > 169.254.254.1.69:  24 RRQ "ata0025459496ab" octet
22:02:56.697852 IP 169.254.254.8.12203 > 169.254.254.1.69:  32 RRQ "ATA030201SIP050616A.zup" octet
Прошивка не скачивается каждый раз. Шлюз сверяет идентификатор прошивки 050616A, указанной в файле конфигурации, с идентификатором текущей прошивки и не обновляет её, если идентификаторы совпадают.

4.2. Обновление времени

Если DHCP-сервер выдаёт IP-адрес NTP-сервера, то можно увидеть, как шлюз после включения запрашивает время у NTP-сервера:
root@stupin:/var/tftp# tcpdump -npi br0 host 169.254.254.8 and udp port 123
12:53:17.057037 IP 169.254.254.8.14737 > 169.254.254.1.123: NTPv4, Client, length 48
12:53:17.057088 IP 169.254.254.1.123 > 169.254.254.8.14737: NTPv4, Server, length 48
4.3. Отправка сообщений

Если в файле конфигурации шлюза определён адрес Syslog-сервера и включена отправка сообщений, то можно увидеть, как шлюз шлёт сообщения на Syslog-сервер:
root@stupin:/var/tftp# tcpdump -npi br0 host 169.254.254.8 and udp port 514
12:53:17.059984 IP 169.254.254.8.14738 > 169.254.254.1.514: SYSLOG daemon.debug, length: 210
12:53:17.080339 IP 169.254.254.8.14738 > 169.254.254.1.514: SYSLOG ftp.info, length: 69
12:53:22.066473 IP 169.254.254.8.14738 > 169.254.254.1.514: SYSLOG news.info, length: 78
4.4. Регистрация на SIP-сервере

Процесс регистрации шлюза на SIP-сервере будет выглядеть следующим образом:
root@stupin:/var/tftp# tcpdump -npi br0 host 169.254.254.8 and udp port 5060
12:53:17.134595 IP 169.254.254.8.5060 > 169.254.254.1.5060: SIP, length: 407
12:53:17.134801 IP 169.254.254.1.5060 > 169.254.254.8.5060: SIP, length: 541
12:53:17.166146 IP 169.254.254.8.5060 > 169.254.254.1.5060: SIP, length: 548
12:53:17.166421 IP 169.254.254.1.5060 > 169.254.254.8.5060: SIP, length: 585
4.5. Обмен голосовым трафиком

По умолчанию шлюз использует для обмена голосовым трафиком по протоколу RTP UDP-порт 16384. Увидеть обмен голосовым трафиком в процессе разговора можно вот так:
root@stupin:/var/tftp# tcpdump -npi br0 host 169.254.254.8 and udp port 16384
12:58:14.121126 IP 169.254.254.1.18032 > 169.254.254.8.16384: UDP, length 172
12:58:14.122525 IP 169.254.254.8.16384 > 169.254.254.1.18032: UDP, length 172
12:58:14.132306 IP 169.254.254.8.16384 > 169.254.254.1.18032: UDP, length 13
12:58:14.141120 IP 169.254.254.1.18032 > 169.254.254.8.16384: UDP, length 172
12:58:14.161121 IP 169.254.254.1.18032 > 169.254.254.8.16384: UDP, length 172

воскресенье, 6 марта 2016 г.

Postfix как локальный SMTP-ретранслятор во FreeBSD

Ранее я уже настраивал Postfix в Debian: Postfix как локальный SMTP-ретранслятор. Здесь я выложу ту же заметку, адаптированную применительно к FreeBSD.

Установим Postfix из портов:
# cd /usr/ports/mail/postfix
В процессе установки этого порта оставим отмеченными только опции SASL2 и TLS. Как зависимость опции SASL2 будет установлен также порт security/cyrus-sasl2. У этого порта я оставил отмеченными только опции CRAM, DIGEST, LOGIN и PLAIN.

Настроим Postfix для отправки почты с подменой отправителя и аутентификацией на сервере провайдера. Настроим в файле /usr/local/etc/postfix/main.cf следующую конфигурацию:
# Имя сервера и его почтового домена
myhostname = server.domain.tld
mydomain = domain.tld

# Откуда и для кого принимать почту к доставке
inet_protocols = ipv4
inet_interfaces = 127.0.0.1
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8

# К адресам локальных отправителей добавлять этот домен
masquerade_domains = domain.tld

# Карта соответствия локальных получателей адресам на почтовом сервере ISP  
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases

# Карта соответствия локальных отправителей ящикам на почтовом сервере ISP  
sender_canonical_maps = hash:/usr/local/etc/postfix/sender_maps

# Включаем использование аутентификации на сервере провайдера
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/passwords

# Включаем выбор учётных данных на сервере провайдера в зависимости от отправителя
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/sender_relays

# Если в таблице отправителей нет соответствия, использовать этот почтовый сервер ISP
relayhost = [mailserver.domain.tld]:587

# Устанавливаем не более одного исходящего подключения на каждый домен
default_destination_concurrency_limit = 1

# Разрешаем использовать механизмы аутентификации PLAIN и LOGIN
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login
Теперь создадим необходимые карты. Укажем в файле /etc/mail/aliases, на какие ящики на сервере провайдера перенаправлять почту для локальных пользователей:
postmaster root
root recipient@domain.tld
Почта для пользователя root будет перенаправляться в ящик recipient@domain.tld.

Укажем в файле /usr/local/etc/postfix/sender_maps, какой ящик на сервере провайдера использовать для отправки почты от локального отправителя:
root sender@domain.tld
Когда пользователь root попытается отправить письмо, то на сервер провайдера оно уйдёт от отправителя sender@domain.tld.

Укажем в файле /usr/local/etc/postfix/sender_relays, какой сервер следует использовать для отправки писем от определённого отправителя:
sender@domain.tld [mailserver.domain.tld]:587
Когда пользователь root попытается отправить почту, письмо, в соответствии с настройками в файле /usr/local/etc/postfix/sender_maps, будет отправлено с адреса sender@domain.tld. Письмо от этого отправителя нужно отправить через порт 587 сервера mailserver.domain.tld.

Укажем в файле /usr/local/etc/postfix/passwords учётные данные каждого из ящиков на сервере провайдера:
sender@domain.tld sender:password
Когда пользователь root попытается отправить почту, письмо, в соответствии с настройками в файле /usr/local/etc/postfix/sender_maps, будет отправлено с адреса sender@domain.tld. Письмо от этого отправителя, в соответствии с настройками в файле /usr/local/etc/postfix/sender_relays, нужно отправить через порт 587 сервера mailserver.domain.tld. В соответствии с настройками в этом файле для аутентификации на сервере провайдера нужно будет использовать имя пользователя sender и пароль password.

Для файла /usr/local/etc/postfix/passwords стоит задать разрешения, ограничивающие возможность подсмотреть пароли локальными пользователями системы:
# chown root:root /usr/local/etc/postfix/passwords
# chmod u=rw,g=r,o= /usr/local/etc/postfix/passwords
При каждом обновлении файлов карт нужно не забывать обновлять их двоичные копии одной из следующих команд:
# postalias /etc/mail/aliases
# postmap /usr/local/etc/postfix/sender_maps
# postmap /usr/local/etc/postfix/sender_relays
# postmap /usr/local/etc/postfix/passwords
Двоичные копиии имеют то же имя, но с расширением .db. Права доступа к оригинальному файлу полностью переносятся и на его двоичную копию.

Теперь нужно отключить использование sendmail и включить postfix. Для этого отредатируем файл /etc/rc.conf, вписав в него следующие опции:
postfix_enable="YES"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
Для отключения служебных периодически запускаемых скриптов sendmail впишем в файл /etc/periodic.conf следующие опции:
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
В процессе установки порта postfix предлагается заменить содержимое файла /etc/mail/mailer.conf. Если вы отказались, можно исправить упущение, вписав в него следующие настройки:
#
# Execute the Postfix sendmail program, named /usr/local/sbin/sendmail
#
sendmail        /usr/local/sbin/sendmail
send-mail       /usr/local/sbin/sendmail
mailq           /usr/local/sbin/sendmail
newaliases      /usr/local/sbin/sendmail
Теперь, когда с настройкой покончено, настало время остановить sendmail и запустить вместо него postfix. Для этого выполним следующие команды:
# /etc/rc.d/sendmail stop
# /usr/local/etc/rc.d/postfix start
Осталось проверить правильность работы системы. Попробуем отправить тестовое письмо от имени пользователя root пользователю root:
# mail -s test root
test
.
На ящик recipient@domain.tld должно прийти письмо от ящика sender@domain.tld.