SRV-записи (Service Records) — это механизм DNS, который позволяет SIP-провайдерам распределять нагрузку между несколькими серверами и обеспечивать отказоустойчивость. Если ваш провайдер использует SRV, а FreePBX настроен неправильно — вы теряете балансировку и failover. Разбираемся, что это, как работает и как настроить в FreePBX.
Что такое SRV-записи и зачем они нужны
SRV-запись — это специальный тип DNS-записи, который указывает не на конкретный IP-адрес, а на сервис (хост + порт) с учётом приоритета и веса.
Формат SRV-записи:
Формат 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 решает три задачи:
- Failover — автоматический переход на резервный сервер при недоступности основного
- Балансировка нагрузки — трафик распределяется между несколькими серверами провайдера
- Гибкость провайдера — провайдер может менять IP-адреса серверов без переадресации на вашей стороне
Порядок DNS-резолвинга для SIP
Когда FreePBX пытается подключиться к хосту, выполняется цепочка:
NAPTR → SRV → A/AAAA- NAPTR — определяет доступные протоколы (UDP/TCP/TLS) и ссылается на SRV-записи
- SRV — определяет конкретные хосты и порты с учётом приоритетов
- 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 по умолчанию. Для включения:
Без этой галочки chan_sip делает только A/AAAA-запрос — SRV-записи игнорируются.
chan_sip при включённом SRV добавляет префикс _sip._udp. к имени хоста и выполняет DNS-запрос.
- Перейдите в Settings → Asterisk SIP Settings → Chan SIP Settings
- Найдите опцию Allow SRV Lookups
- Включите галочку
- Нажмите 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-адрес.
FreePBX 17 поддерживает только PJSIP (chan_sip удалён). SRV Lookup работает «из коробки» — единственное условие: указывайте hostname вместо IP.
Настройте транк в FreePBX
- Перейдите в Connectivity → Trunks → Add SIP (PJSIP)
- В поле General → Trunk Name введите понятное имя (например, «Zadarma Primary»)
- В поле Server/Host укажите hostname провайдера:
- ✅ Правильно: sip.zadarma.com
- ❌ Неправильно: 185.100.87.12
- ❌ Неправильно: sip.zadarma.com:5060
- Укажите логин и пароль (или IP-аутентификацию, если провайдер поддерживает)
- Нажмите Submit → Apply Config
Проверьте работу транка
- Reports → Asterisk info → Registries — статус транка должен быть « Registered» или «Reachable »
- В CLI: bash asterisk -rx "pjsip show registrations" asterisk -rx "pjsip show endpoints"
- Настройте исходящий маршрут в Connectivity → Outbound routes
- Настройте входящий маршрут в Connectivity → Inbound routes
- Попробуйте сделать тестовые входящий и исходящий звонки
Проверьте 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).
Решение: В поле Server/Host укажите hostname (sip.provider.ru), а не IP-адрес (185.100.87.12).
2. Указание порта вместе с хостом
Симптом: транк не регистрируется, ошибки в логах.
Причина: Поле Server/Host в FreePBX парсит строку как host:port. Если порт указан, SRV-резолвинг может сломаться, потому что SRV сам определяет порт.
Решение: Уберите порт из поля Server/Host. Порт берётся из SRV-записи автоматически.
Причина: Поле 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.14. Кэширование DNS
Симптом: провайдер сменил IP-адреса серверов, но FreePBX по-прежнему подключается к старым.
Решение: Asterisk кэширует DNS. Перезапустите SIP-модуль:
Решение: Asterisk кэширует DNS. Перезапустите SIP-модуль:
fwconsole restartFAQ
Обязательно ли включать 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 минут, но экономит часы простоя при авариях на стороне провайдера.
Проверьте SRV-записи вашего провайдера через dig, убедитесь, что DNS на сервере их резолвит, и транк будет автоматически переключаться между серверами провайдера при сбоях. Это занимает 5 минут, но экономит часы простоя при авариях на стороне провайдера.
Telephonization.ru — внедрение и поддержка корпоративной телефонии на Asterisk/FreePBX.