Телефонизация. Технический блог.

SRV Lookup в FreePBX: зачем и как настроить

SRV-записи (Service Records) — это механизм DNS, который позволяет SIP-провайдерам распределять нагрузку между несколькими серверами и обеспечивать отказоустойчивость. Если ваш провайдер использует SRV, а FreePBX настроен неправильно — вы теряете балансировку и failover. Разбираемся, что это, как работает и как настроить в FreePBX.

Что такое SRV-записи и зачем они нужны

SRV-запись — это специальный тип DNS-записи, который указывает не на конкретный IP-адрес, а на сервис (хост + порт) с учётом приоритета и веса.

Формат SRV-записи:
_service._proto.name.  TTL  IN  SRV  priority  weight  port  target
Пример реальной SRV-записи для SIP-провайдера:
$ dig SRV _sip._udp.sipprovider.ru

;; ANSWER SECTION:
_sip._udp.sipprovider.ru.  3600  IN  SRV  10  60  5060  sip1.provider.ru.
_sip._udp.sipprovider.ru.  3600  IN  SRV  20  40  5060  sip2.provider.ru.
Это означает: - Приоритет 10 (ниже = приоритетнее) → сначала подключаемся к sip1.provider.ru:5060 - Приоритет 20 → sip2.provider.ru:5060 — запасной сервер - Вес 60/40 — при одинаковом приоритете распределяет трафик пропорционально

Зачем это нужно для SIP-телефонии

Без SRV-записи ваш FreePBX привязан к одному IP-адресу провайдера. Если этот сервер упадёт — все звонки пропадут. SRV решает три задачи:
  1. Failover — автоматический переход на резервный сервер при недоступности основного
  2. Балансировка нагрузки — трафик распределяется между несколькими серверами провайдера
  3. Гибкость провайдера — провайдер может менять IP-адреса серверов без переадресации на вашей стороне

Порядок DNS-резолвинга для SIP

Когда FreePBX пытается подключиться к хосту, выполняется цепочка:
NAPTR → SRV → A/AAAA
  1. NAPTR — определяет доступные протоколы (UDP/TCP/TLS) и ссылается на SRV-записи
  2. SRV — определяет конкретные хосты и порты с учётом приоритетов
  3. A/AAAA — резолвит финальный hostname в IP-адрес

Если SRV-записей нет, DNS сразу выполняет A-запрос и возвращает один IP.

SRV Lookup в FreePBX: PJSIP vs chan_sip

FreePBX поддерживает два SIP-драйвера. SRV Lookup работает в них принципиально по-разному.

chan_sip (устаревший, FreePBX 13–16)

chan_sip не поддерживает SRV по умолчанию. Для включения:

  1. Перейдите в Settings → Asterisk SIP Settings → Chan SIP Settings
  2. Найдите опцию Allow SRV Lookups
  3. Включите галочку
  4. Нажмите Submit → Apply Config

Без этой галочки chan_sip делает только A/AAAA-запрос — SRV-записи игнорируются.

chan_sip при включённом SRV добавляет префикс _sip._udp. к имени хоста и выполняет DNS-запрос.

PJSIP (современный, FreePBX 15–17)

PJSIP поддерживает SRV-записи нативно с версии Asterisk 14 (PJSIP 14.0.1). В конфигурации:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[sip-provider]
type=endpoint
; srv_lookups=yes  ; включено по умолчанию, можно не указывать
host=sip.provider.ru
Параметр srv_lookups=yes активен по умолчанию. Отдельно включать его не нужно.

Ключевой момент для FreePBX

SRV-lookup срабатывает только когда в поле транка указан hostname, а не IP-адрес.
Поле Server/Host
SRV-запись используется?
sip.provider.ru
✅ Да — PJSIP делает SRV → A lookup
185.100.87.12
❌ Нет — IP не резолвится через SRV
sip.provider.ru:5060
⚠️ Может не работать — указание порта в поле хоста нарушает парсинг
FreePBX 17 поддерживает только PJSIP (chan_sip удалён). SRV Lookup работает «из коробки» — единственное условие: указывайте hostname вместо IP.

Настройте транк в FreePBX

  1. Перейдите в Connectivity → Trunks → Add SIP (PJSIP)
  2. В поле General → Trunk Name введите понятное имя (например, «Zadarma Primary»)
  3. В поле Server/Host укажите hostname провайдера:
  4. ✅ Правильно: sip.zadarma.com
  5. ❌ Неправильно: 185.100.87.12
  6. ❌ Неправильно: sip.zadarma.com:5060
  7. Укажите логин и пароль (или IP-аутентификацию, если провайдер поддерживает)
  8. Нажмите Submit → Apply Config

Проверьте работу транка

  1. Reports → Asterisk info → Registries — статус транка должен быть « Registered» или «Reachable »
  2. В CLI: bash asterisk -rx "pjsip show registrations" asterisk -rx "pjsip show endpoints"
  3. Настройте исходящий маршрут в Connectivity → Outbound routes
  4. Настройте входящий маршрут в Connectivity → Inbound routes
  5. Попробуйте сделать тестовые входящий и исходящий звонки

Проверьте failover (опционально)

Подключитесь к серверу по SSH и выполните:
dig SRV _sip._udp.sipprovider.ru
Или для SIP over TCP/TLS:
dig SRV _sips._tcp.sipprovider.ru
Пример вывода:
;; ANSWER SECTION:
_sip._udp.sipprovider.ru.  3600  IN  SRV  10  60  5060  sip1.provider.ru.
_sip._udp.sipprovider.ru.  3600  IN  SRV  20  40  5060  sip2.provider.ru.
Если SRV-записей нет → провайдер не использует SRV
Проверьте также A-записи финальных хостов:
dig A sip1.provider.ru
dig A sip2.provider.ru

Если провайдер предоставляет два SRV-сервера, имитируйте отказ:

# Блокируем основной сервер
iptables -A OUTPUT -d sip1.provider.ru -j DROP

# Ждём 30-60 секунд (зависит от qualify frequency)
# Проверяем, переключился ли транк
asterisk -rx "pjsip show contacts"

# Убираем блокировку
iptables -D OUTPUT -d sip1.provider.ru -j DROP

Типичные ошибки и как их избежать

1. Указание IP вместо hostname

Симптом: failover не работает, при падении основного сервера провайдера звонки пропадают.
Решение: В поле Server/Host укажите hostname (sip.provider.ru), а не IP-адрес (185.100.87.12).

2. Указание порта вместе с хостом

Симптом: транк не регистрируется, ошибки в логах.

Причина: Поле Server/Host в FreePBX парсит строку как host:port. Если порт указан, SRV-резолвинг может сломаться, потому что SRV сам определяет порт.

Решение: Уберите порт из поля Server/Host. Порт берётся из SRV-записи автоматически.

3. DNS-сервер не резолвит SRV

Симптом: dig SRV возвращает пустой ответ, хотя у другого DNS-провайдера SRV есть.

Проверка:
cat /etc/resolv.conf
Решение: Убедитесь, что DNS-сервер в /etc/resolv.conf поддерживает SRV-записи. Попробуйте Google DNS:
# Временно
dig @8.8.8.8 SRV _sip._udp.sipprovider.ru
Для постоянного решения добавьте в /etc/resolv.conf:
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 1.1.1.1

4. Кэширование DNS

Симптом: провайдер сменил IP-адреса серверов, но FreePBX по-прежнему подключается к старым.

Решение: Asterisk кэширует DNS. Перезапустите SIP-модуль:
fwconsole restart

FAQ

Обязательно ли включать SRV Lookup для работы SIP-транка?

Нет. SRV не является обязательным. Транк работает и с hostname/IP-адресом. Но SRV даёт отказоустойчивость и балансировку — для бизнес-телефонии это критично.

Работает ли SRV с FreePBX 17?

Да. FreePBX 17 использует только PJSIP, который поддерживает SRV по умолчанию. Укажите hostname в транке — всё заработает.

Работает ли SRV с FreePBX 16 и ранних версий?

Да, но нужно учитывать: в FreePBX 15–16 есть и chan_sip, и PJSIP. SRV работает только в PJSIP (для chan_sip — включите галочку в настройках).

Что лучше: chan_sip или PJSIP для SRV?

PJSIP. Он нативно поддерживает SRV, работает быстрее, лучше справляется с NAT и является рекомендованным драйвером для FreePBX 15+.

Заключение

SRV Lookup — это не «nice to have», а важный механизм для отказоустойчивости SIP-транка. В FreePBX 17 с PJSIP настройка сводится к одному действию: укажите hostname вместо IP-адреса в поле Server/Host.

Проверьте SRV-записи вашего провайдера через dig, убедитесь, что DNS на сервере их резолвит, и транк будет автоматически переключаться между серверами провайдера при сбоях. Это занимает 5 минут, но экономит часы простоя при авариях на стороне провайдера.

Telephonization.ru — внедрение и поддержка корпоративной телефонии на Asterisk/FreePBX.
2026-07-10 19:16 В общем про Asterisk FreePBX