Снова односторонняя слышимость в звонках? Или может быть вы уже третий день пытаетесь заставить провайдера VoIP работать через вашу сеть, но SIP-трафик упорно идёт мимо вашего контроля? Или вообще не понимаете, почему ваш «SIP-сервер» не маршрутизирует звонки, хотя конфиг вроде бы правильный?
Добро пожаловать в мир SIP-инфраструктуры, где термины «прокси», «B2BUA», «SBC» и «медиасервер» используются как синонимы, хотя это совершенно разные вещи. Где половина руководств в интернете путает Asterisk (который по сути B2BUA) с настоящим SIP proxy сервером.
Давайте расставим точки над i раз и навсегда.
SIP прокси — это маршрутизатор SIP-сигнализации, который пересылает запросы между клиентами и серверами, но не вмешивается в медиапоток (RTP). Он не транскодирует аудио, не записывает разговоры, не выполняет IVR — он просто умно перенаправляет SIP-пакеты. Как nginx для HTTP, только для VoIP.
В этом руководстве вы получите:
- Полное понимание разницы между SIP proxy, B2BUA, SBC и медиасервером
- Сравнение Kamailio, OpenSIPS и Asterisk для задач SIP-проксирования
- Готовые конфиги для установки на Debian/Ubuntu
- Настройку Outbound SIP Proxy для контроля исходящего трафика
- Интеграцию с MikroTik (mikrotik sip proxy) для сетевой маршрутизации
- Решения всех типовых проблем: односторонняя связь, NAT traversal, TLS
- Мониторинг, безопасность и производительность
- Готовый чек-лист для внедрения в продакшн
Через час чтения у вас будет работающий SIP прокси сервер на Linux, способный обслуживать тысячи одновременных звонков, балансировать нагрузку между операторами и защищать вашу телефонию от атак.
Что такое SIP прокси и зачем он нужен
Прежде чем лезть в конфиги, разберёмся в терминологии. Потому что 90% проблем в VoIP начинаются с непонимания, что именно вы пытаетесь настроить.
SIP Proxy vs B2BUA vs SBC — разбираем по полочкам
| Компонент | Что делает | Вмешивается в RTP? | Примеры | Когда использовать |
|---|---|---|---|---|
| SIP Proxy | Маршрутизирует SIP-запросы | Нет (только сигнализация) | Kamailio, OpenSIPS | Масштабирование, балансировка |
| B2BUA | Разрывает SIP-диалог на два | Опционально | Asterisk, FreeSWITCH | АТС, IVR, запись звонков |
| SBC | Граница сетей + защита | Да (NAT, шифрование) | Kamailio+RTPengine, Oracle ACME | Граница с оператором, NAT |
| Медиасервер | Обработка RTP (транскодинг) | Да | RTPengine, rtpproxy, Freeswitch | Смешивание, конференции |
Ключевое отличие SIP прокси: Он работает в режиме stateless или stateful, но не разрывает SIP-диалог. Два клиента общаются напрямую, прокси только перенаправляет их сообщения и знает, куда слать следующий пакет.
Зачем вообще нужен SIP прокси сервер?
- Балансировка нагрузки — распределение звонков между несколькими АТС или операторами
- Централизованная маршрутизация — один узел решает, куда идёт каждый звонок
- Отказоустойчивость — если основной оператор упал, переключаемся на резервный
- Масштабирование — добавляем новые АТС без изменения клиентов
- Безопасность — единая точка контроля входящих подключений
- Outbound proxy — принудительная маршрутизация всего трафика через контролируемый узел
- Протокольные преобразования — UDP → TCP, TCP → TLS
- Логирование и аналитика — вся сигнализация проходит через одну точку
Типовые сценарии использования
Сценарий 1: Корпоративная сеть
У вас 500 IP-телефонов в офисе. Вместо того чтобы каждый телефон подключался напрямую к Asterisk, вы ставите перед ним Kamailio. Kamailio принимает регистрации, а Asterisk занимается только обработкой звонков. Нагрузка распределена.
Сценарий 2: Оператор связи
Вы подключаетесь к нескольким SIP-провайдерам (МТС, Билайн, локальный оператор). OpenSIPS стоит на границе, принимает звонки от клиентов и динамически выбирает, через какого оператора их отправить (по стоимости, нагрузке, доступности).
Сценарий 3: Домашняя лаборатория с MikroTik
У вас MikroTik роутер с встроенным SIP-функционалом (mikrotik sip proxy), но ему не хватает гибкости. Вы поднимаете Kamailio в LXC контейнере на Proxmox, настраиваете правила маршрутизации, а MikroTik просто пробрасывает порты.
Сценарий 4: Outbound SIP Proxy для контроля
Ваша компания запретила сотрудникам использовать личные SIP-аккаунты для работы. Вы настраиваете outbound sip proxy — все исходящие SIP-звонки обязательно идут через ваш сервер, где вы их логируете, фильтруете и маршрутизируете.
Обзор SIP прокси серверов под Linux
На Linux существует несколько зрелых решений для SIP-проксирования. Разберём каждое.
Kamailio — промышленный стандарт
Язык: C
Производительность: 10,000+ вызовов в секунду (CPS)
Кривая обучения: Крутая
Лицензия: GPL
Плюсы:
- Максимальная производительность среди всех SIP proxy
- Модульная архитектура — подключаешь только нужное
- Огромное комьюнити и документация
- Используется крупными операторами (Deutsche Telekom, 1&1)
- Гибкая маршрутизация на встроенном скриптовом языке
Минусы:
- Синтаксис конфигурации специфичный, нужно время на освоение
- Нет встроенного веб-интерфейса (только Siremis — отдельный проект)
- Требует понимания SIP на глубоком уровне
Когда выбирать: Высокие нагрузки, операторская связь, нужна максимальная гибкость.
OpenSIPS — баланс мощи и удобства
Язык: C
Производительность: 10,000+ CPS
Кривая обучения: Средняя
Лицензия: GPL
Плюсы:
- Производительность сравнима с Kamailio
- Встроенный Control Panel (веб-интерфейс для управления)
- Модули для биллинга и CDR из коробки
- Отличные модули балансировки (dispatcher, load_balancer)
- Проще в первоначальной настройке
Минусы:
- Меньше комьюнити, чем у Kamailio
- Некоторые модули платные (в Enterprise версии)
Когда выбирать: Нужна балансировка, биллинг, веб-управление. Средний и крупный бизнес.
Asterisk как SIP Proxy — костыль или решение?
Язык: C
Производительность: До 1000 CPS (зависит от железа)
Кривая обучения: Низкая (если уже знаете Asterisk)
Лицензия: GPL
Реальность: Asterisk — это B2BUA, а не прокси. Но его можно настроить в режиме «прозрачной пересылки».
Плюсы:
- Все уже знают Asterisk
- Простая настройка для малых нагрузок
- Можно совместить прокси + АТС в одном сервере
Минусы:
- Не масштабируется под высокие нагрузки
- Разрывает SIP-диалог (B2BUA), что добавляет задержки
- Потребляет больше ресурсов на звонок
Когда выбирать: Малый бизнес, 50-100 абонентов, не хочется учить новый синтаксис.
FreeSWITCH в режиме Proxy
Производительность: Высокая
Сложность: Средняя
FreeSWITCH умеет работать в режиме прокси через модуль mod_sofia с профилем proxy. Хорошо подходит для unified communications, но для чистого проксирования избыточен.
Сравнительная таблица
| Решение | CPS | RAM на 1000 звонков | Веб-интерфейс | Сложность настройки | Best for |
|---|---|---|---|---|---|
| Kamailio | 10,000+ | ~500MB | Нет (Siremis отдельно) | Высокая | Операторы, Large-scale |
| OpenSIPS | 10,000+ | ~600MB | Да (Control Panel) | Средняя | Средний бизнес, балансировка |
| Asterisk | 1,000 | ~200MB | Нет (FreePBX отдельно) | Низкая | Малый бизнес, SOHO |
| FreeSWITCH | 5,000+ | ~800MB | Нет | Средняя | Unified comms |
Выбор дистрибутива Linux и подготовка окружения
Правильный выбор дистрибутива — это 50% успеха. SIP прокси работают на любом Linux, но есть нюансы.
Рекомендуемые дистрибутивы
Debian 12 (Bookworm) — наш выбор №1
- Стабильность легендарная
- Kamailio и OpenSIPS есть в официальных репозиториях
- LTS-поддержка до 2028 года
- Минимальное потребление ресурсов
Ubuntu 22.04 LTS — альтернатива
- Более свежие пакеты
- Хорошая документация
- Поддержка до 2027 года
AlmaLinux / Rocky Linux 9 — для корпоративной среды
- Замена CentOS
- Жёсткие политики безопасности из коробки
- SELinux (может быть проблемой для новичков)
Не рекомендуется: Arch, Gentoo (нестабильные релизы), старые версии Ubuntu/Debian.
Системные требования
Для SIP прокси сервера на 1000 одновременных звонков:
- CPU: 2 ядра (4 для высоких нагрузок)
- RAM: 2GB минимум, 4GB комфортно
- Диск: 20GB (SSD рекомендуется для логов)
- Сеть: 1 Гбит/с, лучше 2 интерфейса (WAN/LAN разделение)
Подготовка системы
Обновляем систему и ставим базовые утилиты:
# Обновление пакетов apt update && apt upgrade -y # Установка необходимых утилит apt install -y curl wget git vim nano net-tools tcpdump ngrep \ iptables-persistent fail2ban build-essential # Проверка сетевых интерфейсов ip addr show # Должно быть минимум 2 интерфейса или настроенные VLAN
Настройка sysctl для высоких нагрузок
SIP прокси генерирует много коротких соединений. Оптимизируем ядро:
nano /etc/sysctl.conf
# Увеличение лимитов сетевых соединений net.core.somaxconn = 4096 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_max_syn_backlog = 8096 # Быстрое освобождение TIME_WAIT сокетов net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 # Увеличение диапазона локальных портов net.ipv4.ip_local_port_range = 10000 65535 # Для UDP (SIP чаще всего UDP) net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.udp_mem = 8388608 12582912 16777216 # Отключение SYN cookies (если проблемы с производительностью) # net.ipv4.tcp_syncookies = 0
# Применяем изменения sysctl -p
Настройка файрвола (начальная конфигурация)
# Очищаем правила (осторожно, если SSH!) iptables -F # Разрешаем loopback iptables -A INPUT -i lo -j ACCEPT # Разрешаем установленные соединения iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH (замените порт, если нестандартный) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SIP сигнализация (UDP и TCP) iptables -A INPUT -p udp --dport 5060 -j ACCEPT iptables -A INPUT -p tcp --dport 5060 -j ACCEPT # SIP TLS (опционально) iptables -A INPUT -p tcp --dport 5061 -j ACCEPT # RTP диапазон (если будете проксировать медиа через RTPengine) # iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT # Запрещаем всё остальное iptables -A INPUT -j DROP # Сохраняем правила netfilter-persistent save
Важно: На этапе тестирования можно отключить файрвол (ufw disable или systemctl stop firewalld), но в продакшене обязательно включите.
Установка и настройка Kamailio — стандарт индустрии
Начнём с Kamailio как самого мощного и гибкого решения.
Установка Kamailio на Debian/Ubuntu
# Добавляем официальный репозиторий Kamailio wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | apt-key add - echo "deb https://deb.kamailio.org/kamailio58 bookworm main" > /etc/apt/sources.list.d/kamailio.list # Обновляем индекс пакетов apt update # Устанавливаем Kamailio с модулями apt install -y kamailio kamailio-mysql-modules kamailio-tls-modules \ kamailio-websocket-modules kamailio-utils-modules kamailio-json-modules # Проверяем версию kamailio -v # Должно показать: version: kamailio 5.8.x
Структура конфигурации Kamailio
Основной конфиг находится в /etc/kamailio/kamailio.cfg. Он написан на специальном скриптовом языке.
Ключевые блоки:
- Global parameters — глобальные настройки (порты, IP, дочерние процессы)
- Modules — подключение модулей и их параметры
- Routing blocks — логика обработки SIP-сообщений
Минимальная конфигурация Stateless Proxy
Создадим простейший прокси, который просто перенаправляет запросы без сохранения состояния:
# Бэкап оригинального конфига cp /etc/kamailio/kamailio.cfg /etc/kamailio/kamailio.cfg.orig # Создаём новый минимальный конфиг nano /etc/kamailio/kamailio.cfg
####### Global Parameters #########
debug=2
log_stderror=no
log_facility=LOG_LOCAL0
fork=yes
children=4
# Слушаем на всех интерфейсах, порт 5060
listen=udp:0.0.0.0:5060
listen=tcp:0.0.0.0:5060
# Отключаем DNS (для начала)
disable_dns_failover=yes
dns=no
rev_dns=no
####### Modules Section ########
loadmodule "sl.so" # Stateless replies
loadmodule "tm.so" # Transaction module
loadmodule "rr.so" # Record-Route
loadmodule "maxfwd.so" # Max-Forward header check
loadmodule "textops.so" # Text operations
loadmodule "siputils.so" # SIP utilities
# Параметры модуля tm
modparam("tm", "fr_timer", 30000)
modparam("tm", "fr_inv_timer", 120000)
####### Routing Logic ########
# Главный маршрутный блок
request_route {
# Проверка Max-Forwards (защита от петель)
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483", "Too Many Hops");
exit;
}
# Логируем входящий запрос
xlog("L_INFO", "SIP Request: $rm from $fu to $tu\n");
# Record-Route для всех диалогов (важно!)
if (method=="INVITE" || method=="SUBSCRIBE") {
record_route();
}
# Loose route обработка (для последующих запросов в диалоге)
if (loose_route()) {
xlog("L_INFO", "Loose route - forwarding\n");
t_relay();
exit;
}
# Обработка REGISTER (пока просто пропускаем дальше)
if (method=="REGISTER") {
xlog("L_INFO", "REGISTER from $fu\n");
# Здесь можно добавить сохранение в базу или пересылку на АТС
t_relay();
exit;
}
# Обработка INVITE
if (method=="INVITE") {
xlog("L_INFO", "INVITE from $fu to $ru\n");
# Простая пересылка на указанный URI
t_relay();
exit;
}
# Для всех остальных методов
t_relay();
}
# Обработка ответов
onreply_route {
xlog("L_INFO", "SIP Reply: $rs $rr\n");
}
# Обработка ошибок
failure_route {
xlog("L_INFO", "Transaction failed: $rm to $ru\n");
}
Запуск и проверка Kamailio
# Проверка синтаксиса конфига kamailio -c -f /etc/kamailio/kamailio.cfg # Если ошибок нет, запускаем systemctl start kamailio # Включаем автозапуск systemctl enable kamailio # Проверяем статус systemctl status kamailio # Смотрим логи в реальном времени tail -f /var/log/syslog | grep kamailio
Тестирование базового прокси
Настройте SIP-клиент (например, MicroSIP, Linphone, Zoiper) для подключения к вашему серверу:
- SIP Server: IP-адрес вашего Kamailio
- Port: 5060
- Transport: UDP
- Outbound Proxy: оставьте пустым пока
Попробуйте зарегистрироваться. В логах должны появиться записи о REGISTER.
Настройка Outbound SIP Proxy на Kamailio
Outbound SIP Proxy — это режим, когда все SIP-запросы клиента обязательно идут через ваш прокси, независимо от того, что написано в Request-URI.
Это критически важно для:
- Контроля исходящего трафика
- Логирования всех звонков
- Применения политик безопасности
- NAT traversal
Как работает Outbound Proxy
В обычном режиме SIP-клиент смотрит на Request-URI и отправляет запрос напрямую туда. Например:
INVITE sip:123@provider.com SIP/2.0
Клиент попытается резолвить provider.com и отправить INVITE напрямую туда.
С Outbound Proxy: Клиент настроен отправлять все запросы на ваш прокси, а прокси сам решает, куда их дальше маршрутизировать.
Настройка клиента для использования Outbound Proxy
В настройках SIP-клиента укажите:
- Outbound Proxy:
sip:ваш-IP:5060 - Force Outbound Proxy: Включить (галочка)
Теперь все запросы клиента пойдут через ваш Kamailio.
Конфигурация Kamailio как Outbound Proxy
Добавим логику принудительной маршрутизации:
nano /etc/kamailio/kamailio.cfg
# В routing block добавьте после проверки Max-Forwards:
# Если клиент использует наш прокси как outbound
if (method=="INVITE" && !has_totag()) {
# Добавляем Record-Route с нашим IP
record_route();
# Логируем
xlog("L_INFO", "Outbound INVITE from $fu to $ru via $si\n");
# Опционально: подмена Contact header на наш IP
# (требуется модуль uac)
# uac_replace_from("", "sip:$fU@ваш-внешний-IP");
# Маршрутизация на целевой сервер
# Можно задать статический route или использовать DNS
# Пример: все звонки на номера 8xxx идут на провайдера А
if ($rU =~ "^8") {
$ru = "sip:" + $rU + "@provider-a.com";
t_relay();
exit;
}
# Все остальные на провайдера Б
$ru = "sip:" + $rU + "@provider-b.com";
t_relay();
exit;
}
Record-Route и Loose Route — критически важно!
Без record_route() последующие запросы в диалоге (BYE, re-INVITE) пойдут мимо вашего прокси напрямую между клиентами.
Record-Route: Добавляет в SIP-сообщение заголовок с адресом прокси, чтобы все следующие запросы шли через него.
Record-Route: <sip:ваш-IP:5060;lr>
Loose Route: Обработка запросов, которые уже содержат Route header (последующие в диалоге).
if (loose_route()) {
t_relay();
exit;
}
Эта конструкция обязательна в конфиге!
OpenSIPS — балансировка и веб-управление
OpenSIPS отлично подходит, когда нужна балансировка между несколькими АТС или провайдерами.
Установка OpenSIPS на Debian
# Добавляем репозиторий OpenSIPS apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 049AD65B echo "deb https://apt.opensips.org bookworm 3.4-releases" > /etc/apt/sources.list.d/opensips.list apt update apt install -y opensips opensips-mysql-module opensips-tls-module # Проверка версии opensips -V
Базовая настройка через opensipsctl
# Инициализация конфигурации opensipsctl fifo opensipsctl moni # Создание базы данных <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mysql/" title="MySQL" data-wpil-keyword-link="linked" data-wpil-monitor-id="405">MySQL</a> (опционально) opensipsctl-setup # Следуйте мастеру настройки
Настройка Dispatcher для балансировки
Dispatcher — модуль OpenSIPS для распределения нагрузки между несколькими SIP-серверами.
nano /etc/opensips/opensips.cfg
# Загружаем модуль dispatcher
loadmodule "dispatcher.so"
# Параметры
modparam("dispatcher", "db_url", "mysql://opensips:password@localhost/opensips")
modparam("dispatcher", "table_name", "dispatcher")
modparam("dispatcher", "flags", 2)
modparam("dispatcher", "dst_avp", "$avp(ds_dst)")
modparam("dispatcher", "grp_avp", "$avp(ds_grp)")
modparam("dispatcher", "cnt_avp", "$avp(ds_cnt)")
# Проверка доступности через SIP OPTIONS
modparam("dispatcher", "ds_ping_interval", 30)
modparam("dispatcher", "ds_probing_mode", 1)
# В routing block:
route {
# ... другие проверки ...
if (method=="INVITE") {
# Балансировка между серверами группы 1
# Алгоритм: round-robin (4)
if (!ds_select_dst("1", "4")) {
send_reply("503", "Service Unavailable");
exit;
}
xlog("L_INFO", "Dispatched to $du\n");
record_route();
t_relay();
exit;
}
}
# Обработка неудачных попыток
failure_route[1] {
# Если сервер не ответил, пробуем следующий
if (t_check_status("408|503")) {
if (ds_next_dst()) {
xlog("L_INFO", "Trying next destination: $du\n");
t_relay();
exit;
}
}
}
Добавление серверов в Dispatcher
# Через MySQL mysql -u opensips -p opensips INSERT INTO dispatcher (setid, destination, flags, description) VALUES (1, 'sip:192.168.1.10:5060', 0, 'Asterisk Server 1'), (1, 'sip:192.168.1.11:5060', 0, 'Asterisk Server 2'), (1, 'sip:192.168.1.12:5060', 0, 'Asterisk Server 3'); # Или через opensipsctl opensipsctl fifo ds_reload
OpenSIPS Control Panel (веб-интерфейс)
Для удобного управления установите OpenSIPS Control Panel:
# Установка зависимостей apt install -y apache2 php php-mysql php-gd php-curl php-xmlrpc # Клонируем репозиторий cd /var/www/html git clone https://github.com/OpenSIPS/opensips-cp.git cd opensips-cp # Настройка конфига cp config/tools/system/database/database.inc.php.sample config/tools/system/database/database.inc.php nano config/tools/system/database/database.inc.php # Укажите параметры подключения к MySQL # Настройка Apache systemctl restart apache2 # Открываем в браузере: http://ваш-IP/opensips-cp # Логин: admin, пароль: opensips (измените!)
Asterisk как простой SIP прокси для малого бизнеса
Для офиса на 50-100 абонентов можно использовать Asterisk в качестве прокси.
Установка Asterisk
apt install -y asterisk # Или последняя версия из исходников cd /usr/src wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz tar xvf asterisk-20-current.tar.gz cd asterisk-20.x.x ./configure make menuselect # Выберите нужные модули make && make install
Настройка Asterisk для работы в режиме прокси
Отредактируйте /etc/asterisk/sip.conf или pjsip.conf (если используете PJSIP):
nano /etc/asterisk/pjsip.conf
[transport-udp] type=transport protocol=udp bind=0.0.0.0:5060 [global] type=global endpoint_identifier_order=ip,username,anonymous # Для каждого клиента создаём endpoint без auth (прозрачный прокси) [client-1] type=endpoint context=default disallow=all allow=ulaw,alaw direct_media=no rtp_symmetric=yes force_rport=yes rewrite_contact=yes [client-1] type=identify endpoint=client-1 match=192.168.1.100
Важно: direct_media=no — RTP идёт через Asterisk (не прокси-режим для медиа).
Для настоящего прокси (без RTP) используйте directmedia=yes и правильные маршруты в dialplan:
nano /etc/asterisk/extensions.conf
[default]
; Простая пересылка на провайдера
exten => _X.,1,NoOp(Proxy call to ${EXTEN})
exten => _X.,n,Dial(SIP/${EXTEN}@provider-trunk,,r)
exten => _X.,n,Hangup()
Ограничения Asterisk как прокси
- Не масштабируется на тысячи звонков
- Всегда разрывает SIP-диалог (B2BUA), даже если не нужно
- Сложнее настроить чистый stateless режим
- Больше потребление CPU и RAM на звонок
Вывод: Если уже есть Asterisk и нагрузка небольшая — можно использовать. Для серьёзных задач — Kamailio/OpenSIPS.
Интеграция с MikroTik (mikrotik sip proxy)
MikroTik RouterOS имеет встроенный SIP ALG (Application Layer Gateway), но его возможности ограничены. Для серьёзной VoIP-инфраструктуры лучше использовать связку MikroTik + Linux SIP Proxy.
Сценарий 1: MikroTik как граница сети, Kamailio внутри
Типовая схема:
- MikroTik пробрасывает порты 5060 и RTP на внутренний сервер с Kamailio
- Kamailio обрабатывает всю SIP-логику
- MikroTik занимается только маршрутизацией пакетов
# Проброс SIP UDP /ip firewall nat add chain=dstnat protocol=udp dst-port=5060 \ action=dst-nat to-addresses=192.168.1.50 to-ports=5060 \ comment="SIP to Kamailio" # Проброс SIP TCP /ip firewall nat add chain=dstnat protocol=tcp dst-port=5060 \ action=dst-nat to-addresses=192.168.1.50 to-ports=5060 # Проброс RTP диапазона /ip firewall nat add chain=dstnat protocol=udp dst-port=10000-20000 \ action=dst-nat to-addresses=192.168.1.50 to-ports=10000-20000 \ comment="RTP to Kamailio"
Сценарий 2: MikroTik SIP Proxy + Linux для тяжёлой обработки
MikroTik может выполнять базовую маршрутизацию SIP, но для сложной логики (балансировка, запись, аналитика) передаёт на Kamailio.
Настройка SIP-хелпера на MikroTik:
# Включение SIP ALG (осторожно, может ломать SIP!) /ip firewall service-port set sip disabled=no # Или лучше отключить и использовать статический NAT /ip firewall service-port set sip disabled=yes
Рекомендация: Отключайте SIP ALG на MikroTik и управляйте NAT вручную через Kamailio + RTPengine.
Безопасность SIP прокси на Linux
SIP-серверы — любимая цель хакеров. Защищаемся:
1. Fail2ban для блокировки атак
apt install -y fail2ban # Создаём фильтр для Kamailio nano /etc/fail2ban/filter.d/kamailio.conf
[Definition]
failregex = kamailio.*authentication failure.*<HOST>
kamailio.*407 Proxy Authentication Required.*<HOST>
kamailio.*401 Unauthorized.*<HOST>
ignoreregex =
# Настраиваем jail nano /etc/fail2ban/jail.local
[kamailio] enabled = true port = 5060,5061 protocol = udp filter = kamailio logpath = /var/log/syslog maxretry = 5 bantime = 3600 findtime = 600
systemctl restart fail2ban
2. Pike модуль в Kamailio (ограничение флуда)
loadmodule "pike.so"
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 30)
modparam("pike", "remove_latency", 120)
# В routing block перед обработкой
if (!pike_check_req()) {
xlog("L_ALERT", "PIKE: Too many requests from $si\n");
exit;
}
3. IP Whitelist для доверенных клиентов
# В Kamailio
if ($si != "192.168.1.0/24" && $si != "10.0.0.50") {
sl_send_reply("403", "Forbidden");
exit;
}
4. Принудительный TLS для провайдеров
# Модуль TLS
loadmodule "tls.so"
modparam("tls", "config", "/etc/kamailio/tls.cfg")
# Слушаем TLS
listen=tls:0.0.0.0:5061
# В routing: форсируем TLS для исходящих к провайдеру
if (method=="INVITE" && $ru =~ "provider.com") {
$du = "sip:provider.com:5061;transport=tls";
t_relay();
exit;
}
5. Digest Authentication на прокси
Для защиты от анонимных регистраций:
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "db_url", "mysql://kamailio:password@localhost/kamailio")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
# В route для REGISTER
if (method=="REGISTER") {
if (!auth_check("$fd", "subscriber", "1")) {
auth_challenge("$fd", "0");
exit;
}
# Сохраняем регистрацию
save("location");
exit;
}
Мониторинг и логирование SIP прокси
1. Логи Kamailio в JSON для Loki/Grafana
# В kamailio.cfg
loadmodule "jsonrpcs.so"
modparam("jsonrpcs", "pretty_format", 1)
# Логирование в JSON
xlog("L_INFO", "{\"timestamp\":\"$TV(Sn)\", \"method\":\"$rm\", \"from\":\"$fu\", \"to\":\"$ru\", \"src_ip\":\"$si\"}\n");
2. SIP трассировка через sngrep
apt install -y sngrep # Запуск интерактивного монитора sngrep # Фильтр по IP sngrep host 192.168.1.100 # Сохранение PCAP sngrep -O /tmp/sip-capture.pcap
3. Prometheus exporter для Kamailio
# Устанавливаем kamailio_exporter wget https://github.com/florentchauveau/kamailio_exporter/releases/download/v1.2.0/kamailio_exporter chmod +x kamailio_exporter mv kamailio_exporter /usr/local/bin/ # Создаём systemd unit nano /etc/systemd/system/kamailio_exporter.service
[Unit] Description=Kamailio Prometheus Exporter After=network.target [Service] Type=simple ExecStart=/usr/local/bin/kamailio_exporter --kamailio.scrape-uri=http://localhost:8080/RPC2 Restart=on-failure [Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl start kamailio_exporter systemctl enable kamailio_exporter # Метрики доступны на http://localhost:9494/metrics
4. Homer SIP Capture для глубокой аналитики
Homer — мощная платформа для захвата и анализа SIP-трафика.
# Установка Homer (упрощённо) wget https://github.com/sipcapture/homer-installer/raw/master/homer_installer.sh chmod +x homer_installer.sh ./homer_installer.sh # Следуйте инструкциям установщика # После установки веб-интерфейс доступен на http://IP:9080
Решение типовых проблем SIP прокси
Проблема 1: Односторонняя слышимость
Симптом: Один абонент слышит другого, но обратно звук не идёт.
Причина: Проблемы с NAT traversal или RTP не проходит через файрвол.
Решение:
# Установите RTPengine для проксирования медиа
apt install -y rtpengine
# В Kamailio загрузите модуль rtpengine
loadmodule "rtpengine.so"
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")
# В route для INVITE
if (method=="INVITE") {
rtpengine_offer();
record_route();
t_relay();
}
# В onreply_route для ответа 200 OK
onreply_route {
if (status=="200" && has_body("application/sdp")) {
rtpengine_answer();
}
}
Проблема 2: Звонки идут мимо прокси после INVITE
Причина: Забыли record_route().
Решение: Добавьте в конфиг:
if (method=="INVITE" || method=="SUBSCRIBE") {
record_route();
}
Проблема 3: Прокси не слушает на нужном IP
Симптом: Клиенты не могут подключиться.
Решение: Проверьте listening socket:
# В kamailio.cfg listen=udp:публичный-IP:5060 listen=udp:локальный-IP:5060 # Проверка netstat -tulnp | grep 5060 # Должно показать все интерфейсы
Проблема 4: DNS не резолвится
Симптом: Ошибки вида «Unable to resolve provider.com».
Решение:
# Включите DNS в Kamailio dns=yes rev_dns=yes # Проверьте /etc/resolv.conf cat /etc/resolv.conf # Должны быть работающие DNS-серверы # Тест резолва dig provider.com SRV dig _sip._udp.provider.com SRV
Проблема 5: TLS не работает
Решение:
# Создайте самоподписанный сертификат openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/kamailio/kamailio-selfsigned.key \ -out /etc/kamailio/kamailio-selfsigned.crt # В /etc/kamailio/tls.cfg [server:default] method = TLSv1.2+ verify_certificate = no require_certificate = no private_key = /etc/kamailio/kamailio-selfsigned.key certificate = /etc/kamailio/kamailio-selfsigned.crt
Чек-лист внедрения SIP прокси в продакшн
Перед запуском в бой проверьте:
- ✅ Дистрибутив Linux: Debian 12 / Ubuntu 22.04 LTS установлен и обновлён
- ✅ Сетевая конфигурация: Минимум 2 интерфейса или VLAN, статические IP настроены
- ✅ Sysctl оптимизации: Применены параметры для высоких нагрузок
- ✅ Kamailio/OpenSIPS установлен: Версия актуальная (5.8+ / 3.4+)
- ✅ Конфигурация протестирована:
kamailio -cбез ошибок - ✅ Record-Route включен: Для INVITE и SUBSCRIBE
- ✅ Loose Route обрабатывается: Последующие запросы в диалоге проходят
- ✅ Outbound Proxy настроен: Если требуется принудительная маршрутизация
- ✅ Файрвол настроен: Порты 5060, 5061, RTP-диапазон открыты
- ✅ Fail2ban активен: Защита от брутфорса
- ✅ TLS сертификаты: Если нужен SIPS (TLS)
- ✅ RTPengine установлен: Если проксируете медиа
- ✅ Логирование настроено: Syslog или JSON в Grafana
- ✅ Мониторинг: Prometheus exporter или Homer установлен
- ✅ Тестовый звонок успешен: SIP-трейс проверен через sngrep
- ✅ Балансировка работает: Dispatcher переключается между серверами
- ✅ Документация готова: Схема сети, конфиги сохранены
Заключение и рекомендации
Теперь у вас есть полное понимание SIP прокси серверов на Linux и готовые конфиги для внедрения.
Итоговые рекомендации по выбору
| Ваш случай | Решение | Почему |
|---|---|---|
| Крупный оператор, 10k+ звонков | Kamailio | Максимальная производительность |
| Средний бизнес, нужна балансировка | OpenSIPS | Веб-панель + dispatcher из коробки |
| Малый офис, 50-100 абонентов | Asterisk | Простота настройки, все знают |
| Нужен только чистый прокси | Kamailio stateless | Минимум ресурсов |
| Граница с оператором + NAT | Kamailio + RTPengine | Полноценный SBC |
| Домашняя лаборатория | Kamailio в LXC | Легковесно, легко бэкапить |
Что мы разобрали
- Чёткое понимание разницы между SIP Proxy, B2BUA и SBC
- Установку и настройку Kamailio на Debian/Ubuntu
- Конфигурацию OpenSIPS для балансировки нагрузки
- Использование Asterisk в режиме прокси
- Настройку Outbound SIP Proxy для контроля трафика
- Интеграцию с MikroTik для сетевой маршрутизации
- Безопасность: Fail2ban, Pike, TLS, IP-whitelist
- Мониторинг через Prometheus, Homer, sngrep
- Решение всех типовых проблем VoIP
Дальнейшие шаги
- Разверните тестовый стенд — LXC контейнер с Kamailio + 2 SIP-клиента
- Протестируйте Record-Route — убедитесь, что BYE проходит через прокси
- Настройте RTPengine — решите проблемы с NAT traversal
- Добавьте мониторинг — Homer или Prometheus для аналитики
- Внедрите в продакшн — следуя чек-листу выше
- Документируйте всё — схемы, конфиги, пароли в надёжное место
Полезные ресурсы
- Официальная документация Kamailio
- Туториалы OpenSIPS
- RTPengine на GitHub
- Homer SIP Capture
- VoIP-Info — энциклопедия VoIP
Остались вопросы или столкнулись с проблемой? Пишите в комментарии — разберём вместе! Поделитесь вашим опытом настройки SIP-инфраструктуры, это поможет другим инженерам.
Подпишитесь на наш Telegram-канал IT-Apteka — публикуем готовые конфиги для VoIP, разборы сложных кейсов с SIP, лайфхаки по Kamailio и Asterisk. Только практика от реальных инженеров!
💡 Профессиональный совет: Не пытайтесь сразу построить идеальную SIP-инфраструктуру. Начните с простого stateless proxy на Kamailio, убедитесь, что понимаете, как работают Record-Route и Loose Route. Только потом добавляйте RTPengine, балансировку, TLS и прочие сложности. 80% проблем в VoIP — это непонимание базовых принципов SIP-маршрутизации. Освойте основы — остальное приложится.



