Установка и настройка Kamailio на debian 9

Установка и настройка Kamailio на debian 9

Kamailio является программным коммутатором четвертого класса работающего c протоколом SIP. Kamailio позволяет гибко настраивать прохождение транзакций, методов заложенных в протокол sip, имеет модульную архитектуру. При конфигурировании Kamailio используя функции модулей возможно изменение текстовых полей транзакций, описания сессии. Управление запросами и ответами транзакций осуществляется в функции маршрутизации, эта же функция позволяет создавать новые транзакции. Kamailio - SBC.

SBC - Session Border Controller — пограничный контроллер сессий

Функции SBC
– трансляция сигнальных протоколов, транскодинг
– анализ качества медиа-каналов, задержка, джиттер, процент потери пакетов, контроль rtp трафика
– безопасность, единая точка входа, сокрытие топологии, устранение DDoS атак
* СОРМ, Сбор Биллинга

Элементы из которых состоит SBC
1. SIP Proxy
statefull – c сохранением состояния в памяти до конца транзакции
stateless – без сохранения только обработка вызова как есть
2. Сервер регистрации
3. Сервер определения местоположения
4. Сервер переадресации

Установка и базовая настройка Kamailio на debian 9
Устанавливаем компилятор, библиотеки зависимостей для Kamailio
apt-get install git-core
apt-get install gcc
apt-get install build-essential
apt-get install flex
apt-get install bison
#apt-get install libmysqlclient-dev, только если используется БД mysql
apt-get install make
Некоторые модули могут потребовать дополнительные библиотеки
apt-get install libssl-dev
apt-get install libcurl4-openssl-dev
apt-get install libxml2-dev
apt-get install libpcre3-dev

Создаем директорию для исходников
mkdir -p /usr/local/src/kamailio-5.0
cd /usr/local/src/kamailio-5.0/

Скачиваем исходные тексты из git
git clone --depth 1 --no-single-branch "https://github.com/kamailio/kamailio kamailio"

cd kamailio

Генерируем конфиг файл
make cfg
Компилируем
make all
Инсталлируем
make install

После инсталляции в директории
/usr/local/sbin
kamailio - Kamailio SIP server
kamcmd – CLI SIP server
kamctl - script to manage and control Kamailio SIP server
kamdbctl - script to create and manage the Databases
в директории для 64 бит
/usr/local/lib64/kamailio/modules
Readme в директории
/usr/local/share/doc/kamailio
Man в директории
/usr/local/share/man{5,8}
Конфиг файл
/usr/local/etc/kamailio
Добавляем переменную окружения
nano /root/.bash_profile
PATH=$PATH:/usr/local/sbin
export PATH

Готовим init file
cp /usr/local/src/kamailio-5.0/kamailio/pkg/kamailio/deb/debian/kamailio.init /etc/init.d/kamailio
chmod 755 /etc/init.d/kamailio
nano /etc/init.d/kamailio
DAEMON=/usr/local/sbin/kamailio
CFGFILE=/usr/local/etc/kamailio/kamailio.cfg
cp /usr/local/src/kamailio-5.0/kamailio/pkg/kamailio/deb/debian/kamailio.default /etc/default/
mv kamailio.default kamailio
раскомментируем - RUN_KAMAILIO=yes
mkdir -p /var/run/kamailio
adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "Kamailio" --home /var/run/kamailio kamailio
set ownership to /var/run/kamailio
chown kamailio:kamailio /var/run/kamailio
/etc/init.d/kamailio start

Установка базы данных psql

Добавим подпись GPG
apt-get install debian-keyring
apt-get install dirmngr
apt-key adv --keyserver pgp.mit.edu --recv-keys 8C718D3B5072E1F5
apt-get update

Postgres
apt-get install libpq-dev
Пересобираем kamailio c поддержкой psql, соберем еще модуль dialplan
nano src/modules.lst
include_modules= db_postgres dialplan
make all
nano /etc/apt/sources.list
deb "http://apt.postgresql.org/pub/repos/apt/ YOUR_DEBIAN_VERSION_HERE-pgdg main"
wget --quiet -O - "https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -"
apt-get update
apt-get install postgresql-9.6

Проверяем работает ли psql
su postgres
psql

Правим файл kamctl
nano -w /usr/local/etc/kamailio/kamctlrc
DBENGINE=PGSQL
DBPORT=5432

Настройка Kamailio
создаем домен
kamctl domain add domain1.test
/usr/local/sbin/kamctl domain reload
создаем sip пиры
kamctl add 101@domain1.test 101
kamctl add 102@domain1.test 102

Для работы нужен модуль сервера определения местоположения по default его нет, добавим и настроим его:
loadmodule "presence.so"
loadmodule "presence_xml.so"
Добавим кроме того модули для работы с базой postgres и для исходящих вызовов
loadmodule "db_postgres.so"
loadmodule "outbound.so"

Настроим аутентификацию
#!ifdef WITH_AUTH
modparam("auth_db", "db_url", "postgres://kamailioro:kamailioro@localhost/kamailio")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", MULTIDOMAIN)
#!endif
Настроим местоположение sip user peers
#!ifdef WITH_USRLOCDB
modparam("usrloc", "db_url", "postgres://kamailioro:kamailioro@localhost/kamailio")
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", MULTIDOMAIN)
#!endif

После этого user 101 может набирать user 102 и наоборот, с дефолтным набором правил маршрутизации

Краткое описание работы default правил маршрутизации kamailio
1. Функция REQINIT
Если включен модуль интифлуд задействуем его, если ip источника не мой ip проверить присутствие ip источника в таблице хэш, если user agent sip сканер отбрасываем запрос, проверяем значение maxfrwd, если больше 10 – 483, если метод options uri мой ip uri = 0, отправить 200, если не все заголовки sip отбросить
2 . Функция NATDETECT
Если включен модуль NAT, проверяем используется ли в запросе NAT, если метод REGISTER собираем URI из IP и порта и запоминаем положение контакта, иначе kamailio первый хост в транзакции – устанавливаем contact, флаг NATS
3. Если метод CANCEL и транзакция активна, то RELAY
4. RELAY
Если метод INVITE, BYE, SUBSCRIBE, UPDATE -  установить tag MANAGE, если метод не известен пишем ERROR
5. Если метод ACK то установленную транзакцию поддерживаем
6. Функция WITHINDLG
Если в заголовке нет tag отбрасываем транзакцию, проверяем tag ROUTE
7. Функция  DLGURI
Если задействован модуль NAT, проверяем исходящий адрес прокси, если его нет устанавливаем его из URI
8. Функция WITHINDLG
Если метод BYE установить флаг ACC и ACCFAILED
9. NATMANAGE
Если есть tag в заголовке, если в транзакции nat=yes, записать флаг NATB, если флаги NATS и NATB присутствуют, выход. Проверяем sdp по RFC, если нет tag nat, установим nat=yes, если первый в транзакции как хост, установить контакт на основании алиаса
10. Функция WITHINDLG
Если метод NOTIFY добавляем RECORD-ROUTE
11. Функция PRESENCE
Если метод SUBSCRIBE, то на голосовую почту, если нет VOICEMAIL – 404. Если не новая транзакция – выход.
Если метод PUBLISH, смотрим базу данных и отправляем ответ используя NOTIFI, удаляем транзакцию
12. Функция WITHINDLG
Если метод ACK и транзакция существует RELAY, если не существует выход
13. Функция RELAY
14. Функция AUTH
Если метод REGISTER и ip в моем списке – разрешить, если метод REGISTER или мой IP в fromURI проверяем подлинность. Если метод REGISTER удаляем учетные данные из сообщений. Если URI не я и URI_FROM не я – 409
15. Функция REQINIT
Удаляем из заголовков tag ROUTE. Если метод INVITE или SIBSCRIBE добавляем новый заголовок маршрута, если метод INVITE установить флаг ACC
16. Функция SIPOUT
Если URI = моему IP добавить p-hint outbound
17. Функция RELAY
18. Функция PRESENCE
19. Функция RAGISTRAR

Для диагностики, трассируем журнал
journalctl -xe

Минимальный набор модулей обеспечивающих функциональность:
AUTH, AUTH_DB, TM (statefull), usrloc, registrar, outbound
Обработка методов по умолчанию в правилах маршрутизации
- INVITE - да
- ACK - да
- BYE - да
- CANCEL - да
- REGISTER - да
- OPTIONS - да
- PRACK - нет
- SUBSCRIBE - да
- NOTIFY - да
- PUBLISH - да
- INFO - да
- REFER - нет
- MESSAGE - нет
- UPDATE - нет

Kamailio можно использовать для балансировки нагрузки вызывов на softswitch например Asterisk

1. Модули поддерживаемые kamailio для распределения вызовов
1. lcr – маршрутизация по стоимости, может использоваться как балансировщик по весу, префиксу, принцип аналогичен dispatcher. Сложность: нет примеров настройки дата 2014
2. dispatcher – балансировка на основе URI, приоритета, веса, нагрузки Дата 2015
3. carrierroute – мощный модуль, сделать можно все что нужно для балансировки и распределение не плохое описание Дата 2007

Настройка модуля Dispatcher kamailio
nano /usr/local/etc/kamailio/kamailio.cfg
Определяем директиву и загружаем модуль, если используется проверка хостов для отправки вызова на доступность, то зависит от модуля транзакций tm и должен быть запущен раньше tm
#!define WITH_LOADBALANSING
#!ifdef WITH_LOADBALANSING

 loadmodule "dispatcher.so"

#!endif

# ----- dispatcher params -----
modparam("dispatcher", "db_url", "postgres://kamailioro:kamailioro@localhost/kamailio")
modparam("dispatcher", "table_name", "dispatcher")
modparam("dispatcher", "setid_col", "setid")
modparam("dispatcher", "destination_col", "destination")
modparam("dispatcher", "flags_col", "flags")
modparam("dispatcher", "priority_col", "priority")
modparam("dispatcher", "flags", 2)
modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")
modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")
modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")
modparam("dispatcher", "sock_avp", "$avp(AVP_SOCK)")
modparam("dispatcher", "ds_probing_mode", 1)
modparam("dispatcher", "ds_ping_interval", 15)
modparam("dispatcher", "ds_probing_threshold", 1)
modparam("dispatcher", "ds_ping_reply_codes", "class=2;class=3;class=4")

# dispatch destinations to PSTN
route(PSTN);
# dispatch destinations
route(DISPATCH);
# user location service
route(LOCATION);

# Dispatch requests
route[DISPATCH] {
# round robin dispatching on gateways group '1'
if(!ds_select_dst("1", "4")) {
send_reply("404", "No destination");
exit;
}
xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");
t_on_failure("RTF_DISPATCH");
route(RELAY);
exit;
}

# Try next destionations in failure route
failure_route[RTF_DISPATCH] {
if (t_is_canceled()) {
exit;
}

 # next DST - only for 500 or local timeout
if (t_check_status("500")
or (t_branch_timeout() and !t_branch_replied())) {
if(ds_next_dst()) {
t_on_failure("RTF_DISPATCH");
route(RELAY);
exit;
}
}
}

Добавляем софтсвичи на которые будем отправлять вызов
kamctl dispatcher add 1 sip:89.18.143.20:5060 1 1
kamctl dispatcher add 1 sip:89.18.143.20:5061 1 2
kamctl dispatcher add 1 sip:89.18.143.20:5060 1 3

Проверка состояния шлюзов
kamctl dispatcher dump
Флаги активных шлюзов должны начинаться с - A

Для применения установок из базы с информацией о новых шлюзах
kamctl dispatcher reload
Дополнительные флаги для задействования алгоритмов распределения нагрузки модуля dispatcher
duid – содержит адрес шлюза в группе для его загрузки
maxload – верхний предел вызова для шлюза, целое число, если 0 то без лимита
weight – вес от 0 до 100, процент вызовов которые должны быть отправлены на шлюз
rweight – вес от 0 до 100, reverse
socket – сокет шлюза в файле для keepilive

Алгоритмы dispatcher
c 03 – все вызовы уходят на первый шлюз в списке, при его недоступности на следующий, не является балансировкой, но обеспечивает резервирование
4 – круговой, вызовы распределяются по кругу 1, 2, 3, последний, первый
5 – направление вызова по имени пользователя с авторизацией, если имя не найдено используется круговой алгоритм
6 – random
7 – распределение на основе переменной PV используя hash_pvar
8 – распределение на основе приоритета, отправляются вызовы на шлюз с большим приоритетом
9 – распределение на основе веса (процент вызовов), отправляются вызовы на шлюз с большим приоритетом
10 – распределение нагрузки вызовов, должны быть установлены параметры duid, dstid_avp, ds_hach_size
Первый бросок на хост с наименьшим количеством вызовов, остальные по порядку записей в группе
11 – распределение на основе веса с перерасчетом веса на основе данных об вышедшем или добавленном в пул хосте

2. Обеспечение безопасности
BLST – черный список
GEOIP – блокирование на основе IP адреса источника
Permission – список хостов (по URI или IP) которым разрешена либо регистрация, либо маршрутизация или то и другое
PIKE – отслеживает ip входящего запроса и блокирует те которые превышают лимит
PIPELIMIT – ограничение трафика запросов SIP

3. Сокрытие топологии
Topoh – позволяет скрыть ip в sip(name@main_ip), uname в URI, CallerID
Topos – скрытие топологии путем удаления заголовков маршрутизации branch_expire, dialog_expire

Поделиться:

Добавить комментарий

1 + 9 =
Решите простой математический пример. Например для "два плюс четыре =?" введите "6".