Диагностика проблем, связанных с SIP-портами - Asterisk и FreePBX: От GUI к Глубокому Администрированию и Оптимизации - Qpel.AI

Диагностика проблем, связанных с SIP-портами

Мы уже знаем, что SIP-порты (5060/5061) отвечают за сигнализацию, а RTP-порты (обычно 10000-20000) — за передачу голоса. Но что делать, когда что-то идёт не так? Давайте разбираться, как диагностировать проблемы с портами.

Инструменты для диагностики

Для эффективной диагностики нам понадобятся эти Linux-утилиты:

  • netstat или ss: Покажут активные сетевые соединения, прослушиваемые порты и статистику. ss — современнее и быстрее.
  • tcpdump: Захватывает и анализирует сетевой трафик на уровне пакетов. Незаменим для глубокой диагностики.
  • firewall-cmd (для CentOS/RHEL): Управляет firewalld, чтобы проверить, какие порты открыты или заблокированы.
  • nmap или telnet: Проверят доступность портов с других машин.

Проверяем, что Asterisk слушает порты

Первым делом убедимся, что Asterisk действительно слушает нужные порты.

С помощью ss

ss -tuln | grep -E '5060|5061|10000'

Что означают эти флаги:

  • t: TCP-сокеты
  • u: UDP-сокеты
  • l: Только прослушиваемые сокеты
  • n: Не разрешать имена сервисов и хостов (показывать номера портов)
  • grep -E '5060|5061|10000': Фильтруем вывод, чтобы увидеть SIP-порты и начало диапазона RTP.

Вывод должен показать, что Asterisk (или процесс asterisk) слушает UDP-порты 5060 (для chan_sip или chan_pjsip) и/или 5061 (для TLS/SRTP PJSIP). Также должно быть видно прослушивание в диапазоне RTP.

Важно: Если вы используете chan_pjsip, Asterisk по умолчанию может использовать другие порты для SIP-сигнализации, например, 5060 UDP/TCP и 5160 UDP/TCP. Проверьте конфигурацию PJSIP в FreePBX (Settings -> Asterisk SIP Settings -> PJSIP Settings) или в файлах /etc/asterisk/pjsip.conf и /etc/asterisk/pjsip_custom.conf.

Проверяем диапазон RTP-портов

По умолчанию Asterisk использует RTP-порты 10000-20000. В FreePBX это настраивается в Settings -> Asterisk SIP Settings -> General SIP Settings -> RTP Port Ranges.

Чтобы убедиться, что Asterisk использует эти порты, посмотрите активные соединения во время звонка:

ss -uan | grep -E '1000[0-9]|100[1-9][0-9]|10[1-9][0-9][0-9]|1[1-9][0-9][0-9][0-9]|20000'

Этот grep поможет найти активные RTP-соединения в указанном диапазоне во время вызова.

Проверяем правила файрвола

Даже если Asterisk слушает порты, файрвол может их блокировать.

Проверка firewalld (CentOS/RHEL)

sudo firewall-cmd --list-all

Убедитесь, что порты 5060 (UDP/TCP), 5061 (UDP/TCP) и диапазон RTP (например, 10000-20000 UDP) разрешены в активной зоне.

Пример добавления портов (если они не открыты):

sudo firewall-cmd --permanent --add-port=5060/udp
sudo firewall-cmd --permanent --add-port=5060/tcp
sudo firewall-cmd --permanent --add-port=5061/udp
sudo firewall-cmd --permanent --add-port=5061/tcp
sudo firewall-cmd --permanent --add-port=10000-20000/udp
sudo firewall-cmd --reload

Внимание: Открытие портов делает вашу систему уязвимой. Всегда открывайте только те порты, которые действительно необходимы, и по возможности ограничивайте доступ по IP-адресам.

Диагностика с помощью tcpdump

tcpdump — ваш лучший друг при проблемах с портами. Он покажет, доходят ли пакеты до сервера и что с ними происходит.

Захват SIP-трафика

sudo tcpdump -i eth0 -n -s 0 port 5060 or port 5061
  • -i eth0: Укажите сетевой интерфейс (например, ens33).
  • -n: Не преобразовывать IP-адреса и номера портов в имена.
  • -s 0: Захватывать весь пакет (полный снимок).
  • port 5060 or port 5061: Фильтруем по SIP-портам.

Если вы не видите SIP-пакеты, когда ожидаете их (например, при попытке регистрации телефона), это может указывать на:

  1. Блокировку на внешнем файрволе (провайдера, роутера).
  2. Неправильный IP-адрес или порт, на который отправляется трафик.

Захват RTP-трафика

Во время активного звонка захватите RTP-трафик:

sudo tcpdump -i eth0 -n -s 0 udp portrange 10000-20000

Если SIP-сигнализация проходит, но нет звука, и вы не видите RTP-пакеты, это может быть связано с:

  • Проблемами NAT (особенно если RTP-пакеты уходят, но не приходят обратно).
  • Неправильной настройкой диапазона RTP-портов.
  • Блокировкой RTP-портов файрволом.

Типичные проблемы и их решения

  1. Телефон не регистрируется (ошибка 408 Request Timeout или 403 Forbidden):

    • Проверьте: Открыты ли SIP-порты (5060/5061) на сервере и на пути к нему. Используйте tcpdump на сервере, чтобы увидеть, доходят ли REGISTER-запросы.
    • Решение: Откройте порты в firewalld, проверьте правила NAT на роутере.
  2. Нет звука в одну или обе стороны:

    • Проверьте: Открыт ли диапазон RTP-портов (10000-20000 UDP) на сервере и на пути к нему.
    • Используйте: tcpdump для анализа RTP-трафика. Если видите исходящие RTP-пакеты, но не видите входящие, это часто указывает на проблему NAT или файрвола на стороне клиента или на пути.
    • Решение: Настройте NAT в FreePBX/Asterisk, проверьте правила файрвола.
  3. Вызовы не устанавливаются (ошибка 486 Busy Here, 404 Not Found):

    • Эти ошибки чаще связаны с диалпланом или регистрацией. Но иногда они могут быть косвенно связаны с недоступностью портов, если Asterisk не может установить соединение с внешним провайдером или другим пиром.
    • Проверьте: Доступность портов до внешнего SIP-провайдера, если вы используете транк.

Понимание работы SIP- и RTP-портов и умение диагностировать связанные с ними проблемы — фундаментальные навыки для любого администратора Asterisk. Теперь, когда мы разобрались с диагностикой портов, пришло время заглянуть под капот FreePBX и понять, как он генерирует конфигурационные файлы Asterisk. Это поможет вам глубже понимать, что происходит «под капотом».