Настройка NAT в Asterisk и FreePBX
Мы уже поняли, почему NAT мешает VoIP-связи, и разобрались со STUN и TURN. Теперь применим эти знания на практике: настроим Asterisk и FreePBX для работы за NAT.
Настраиваем NAT в Asterisk
Asterisk работает с NAT через специальные параметры в файлах конфигурации SIP (chan_sip) или PJSIP (chan_pjsip).
Для chan_sip (старый, но встречается)
Если используете chan_sip, основные параметры NAT настраивают в sip.conf (или в файлах, которые генерирует FreePBX).
externip/externhost: Укажите внешний IP-адрес или доменное имя. Asterisk будет использовать их в SIP-заголовкахContactиVia.externip=ваш_внешний_ipexternhost=ваш_внешний_домен.ru
Если IP динамический, добавьте
externrefresh=60. Asterisk будет обновлять его каждые 60 секунд.localnet: Перечислите внутренние подсети. Трафик из них не будет проходить NAT-обработку.localnet=192.168.1.0/255.255.255.0localnet=10.0.0.0/8
nat: Укажите, как Asterisk обрабатывает NAT.nat=no: Отключить NAT-обработку (для внутренних сетей).nat=force_rport,comedia: Рекомендуемая комбинация для большинства случаев.force_rport: Asterisk игнорирует порт в заголовкеViaи использует порт, с которого пришёл SIP-пакет. Помогает, когда NAT меняет исходящий порт.comedia: Asterisk отправляет RTP-трафик на тот же IP-адрес и порт, с которого пришёл первый RTP-пакет от клиента. Полезно, когда клиент за NAT и его внутренний IP недоступен.
qualify: Asterisk периодически отправляет OPTIONS-запросы пирам. Так он проверяет их доступность и поддерживает NAT-сессии открытыми.qualify=yesилиqualify=2000(период в мс).
Пример секции [general] в sip.conf:
[general]
externip=82.146.40.100 ; Ваш внешний IP
localnet=192.168.1.0/255.255.255.0 ; Ваша локальная сеть
nat=force_rport,comedia
qualify=yes
Для PJSIP (современный стек, рекомендуем)
В PJSIP настройка NAT более гибкая. Она делается через объекты endpoint, aor и transport.
external_media_address/external_signaling_address: Какexternipдляchan_sip, но отдельно для медиа и сигнализации.local_net: Какlocalnetдляchan_sip.rewrite_contact: Еслиyes, Asterisk перезаписывает заголовокContactв SIP-сообщениях, используя свой внешний IP-адрес.rtp_symmetric: Какcomediaдляchan_sip. Еслиyes, Asterisk отправляет RTP на тот же IP/порт, с которого пришёл RTP от клиента.force_rport: Какforce_rportдляchan_sip. Еслиyes, Asterisk использует фактический порт источника для ответов.qualify_frequency: Какqualifyдляchan_sip.
Пример настройки pjsip.conf:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=82.146.40.100
external_signaling_address=82.146.40.100
local_net=192.168.1.0/255.255.255.0
[my_extension](endpoint)
type=endpoint
context=from-internal
disallow=all
allow=ulaw,alaw,g729
aors=my_extension
auth=my_extension_auth
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
qualify_frequency=30
[my_extension](aor)
type=aor
max_contacts=1
Настраиваем NAT во FreePBX
FreePBX упрощает настройку NAT через графический интерфейс.
Глобальные настройки NAT
- Откройте Admin -> Asterisk SIP Settings (или Settings -> SIP Settings в новых версиях).
- Перейдите на вкладку General SIP Settings (для
chan_sip) или PJSIP Settings (дляchan_pjsip). - В разделе NAT Settings:
- External Address: Укажите внешний статический IP-адрес или доменное имя. Если IP динамический, FreePBX может определить его через
dyndnsилиstun. - Local Networks: Добавьте все внутренние подсети (например,
192.168.1.0/24,10.0.0.0/8). - NAT: Для
chan_sipвыберитеYes, force_rport, comedia. ДляPJSIPэти опции обычно настраиваются для расширений или транков.
- External Address: Укажите внешний статический IP-адрес или доменное имя. Если IP динамический, FreePBX может определить его через
Настройки NAT для расширений (Extensions)
При создании или редактировании расширения (Applications -> Extensions):
- Откройте вкладку Advanced.
- Найдите NAT Mode (для
chan_sip) или RTP Symmetric, Force rport, Rewrite Contact (дляPJSIP).- Для внутренних абонентов (в той же локальной сети, что и Asterisk) обычно достаточно
Noили отключить симметричный RTP. - Для удаленных абонентов (например, софтфоны сотрудников, работающих из дома) выберите
Yesили включитеRTP Symmetric,Force rport,Rewrite Contact.
- Для внутренних абонентов (в той же локальной сети, что и Asterisk) обычно достаточно
Настройки NAT для транков (Trunks)
При создании или редактировании транка (Connectivity -> Trunks):
- Перейдите в настройки SIP-транка.
- В разделе Outgoing Settings или Incoming Settings (зависит от транка и провайдера) найдите параметры NAT.
- Для
chan_sipэто может бытьnat=yesилиnat=force_rport,comediaв полеPEER Details. - Для
PJSIPэто будутrtp_symmetric,force_rport,rewrite_contactв соответствующих полях.
Важно: Некоторые SIP-провайдеры сами за NAT или требуют особых настроек. Всегда сверяйтесь с их документацией.
- Для
Не забудьте: После любых изменений в FreePBX нажмите кнопку Apply Config в правом верхнем углу. Иначе изменения не применятся к Asterisk.
Проверка и диагностика
После настройки NAT убедитесь, что всё работает.
- Проверьте регистрацию: Убедитесь, что удалённые SIP-клиенты регистрируются. Используйте
asterisk -rvvvи командыsip show peers(дляchan_sip) илиpjsip show endpoints(дляchan_pjsip). - Сделайте тестовые звонки: Позвоните между внутренними и внешними абонентами, а также через транки.
- Изучите логи: Внимательно читайте логи Asterisk (
/var/log/asterisk/full). Ищите ошибки, связанные с NAT, SIP-сообщениями и RTP-трафиком. - Захватите трафик: Используйте
tcpdumpи Wireshark. Анализируйте SIP-сигнализацию и RTP-потоки. Убедитесь, что в SIP-заголовкахContactиViaиспользуются правильные IP-адреса (внешний для Asterisk, внутренний для клиентов).
Настройка NAT — это фундамент стабильной и качественной VoIP-связи, особенно когда абоненты или провайдеры находятся за разными сетевыми экранами. Понимая эти настройки, вы решите большинство проблем со связью, связанных с трансляцией сетевых адресов.
Теперь, когда мы разобрались с тем, как Asterisk и FreePBX преодолевают сложности NAT, пришло время углубиться в ещё один фундаментальный аспект сетевой телефонии — локальные SIP-порты. Какие порты используются, для чего они нужны и как их диагностировать, мы узнаем на следующей странице.