Linux SIP прокси сервер: полное руководство по Kamailio, OpenSIPS и Asterisk

Полное руководство по настройке SIP прокси сервера на Linux.

Снова односторонняя слышимость в звонках? Или может быть вы уже третий день пытаетесь заставить провайдера 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 занимается только маршрутизацией пакетов

Настройка NAT на 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 прокси в продакшн

Перед запуском в бой проверьте:

  1. Дистрибутив Linux: Debian 12 / Ubuntu 22.04 LTS установлен и обновлён
  2. Сетевая конфигурация: Минимум 2 интерфейса или VLAN, статические IP настроены
  3. Sysctl оптимизации: Применены параметры для высоких нагрузок
  4. Kamailio/OpenSIPS установлен: Версия актуальная (5.8+ / 3.4+)
  5. Конфигурация протестирована: kamailio -c без ошибок
  6. Record-Route включен: Для INVITE и SUBSCRIBE
  7. Loose Route обрабатывается: Последующие запросы в диалоге проходят
  8. Outbound Proxy настроен: Если требуется принудительная маршрутизация
  9. Файрвол настроен: Порты 5060, 5061, RTP-диапазон открыты
  10. Fail2ban активен: Защита от брутфорса
  11. TLS сертификаты: Если нужен SIPS (TLS)
  12. RTPengine установлен: Если проксируете медиа
  13. Логирование настроено: Syslog или JSON в Grafana
  14. Мониторинг: Prometheus exporter или Homer установлен
  15. Тестовый звонок успешен: SIP-трейс проверен через sngrep
  16. Балансировка работает: Dispatcher переключается между серверами
  17. Документация готова: Схема сети, конфиги сохранены

Заключение и рекомендации

Теперь у вас есть полное понимание 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

Дальнейшие шаги

  1. Разверните тестовый стенд — LXC контейнер с Kamailio + 2 SIP-клиента
  2. Протестируйте Record-Route — убедитесь, что BYE проходит через прокси
  3. Настройте RTPengine — решите проблемы с NAT traversal
  4. Добавьте мониторинг — Homer или Prometheus для аналитики
  5. Внедрите в продакшн — следуя чек-листу выше
  6. Документируйте всё — схемы, конфиги, пароли в надёжное место

Полезные ресурсы


Остались вопросы или столкнулись с проблемой? Пишите в комментарии — разберём вместе! Поделитесь вашим опытом настройки SIP-инфраструктуры, это поможет другим инженерам.

Подпишитесь на наш Telegram-канал IT-Apteka — публикуем готовые конфиги для VoIP, разборы сложных кейсов с SIP, лайфхаки по Kamailio и Asterisk. Только практика от реальных инженеров!

💡 Профессиональный совет: Не пытайтесь сразу построить идеальную SIP-инфраструктуру. Начните с простого stateless proxy на Kamailio, убедитесь, что понимаете, как работают Record-Route и Loose Route. Только потом добавляйте RTPengine, балансировку, TLS и прочие сложности. 80% проблем в VoIP — это непонимание базовых принципов SIP-маршрутизации. Освойте основы — остальное приложится.

over_dude
Author: over_dude

Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх