Настройка NAT в Asterisk и FreePBX - Asterisk и FreePBX: От GUI к Глубокому Администрированию и Оптимизации - Qpel.AI

Мы уже поняли, почему 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=ваш_внешний_ip
    • externhost=ваш_внешний_домен.ru

    Если IP динамический, добавьте externrefresh=60. Asterisk будет обновлять его каждые 60 секунд.

  • localnet: Перечислите внутренние подсети. Трафик из них не будет проходить NAT-обработку.
    • localnet=192.168.1.0/255.255.255.0
    • localnet=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

  1. Откройте Admin -> Asterisk SIP Settings (или Settings -> SIP Settings в новых версиях).
  2. Перейдите на вкладку General SIP Settings (для chan_sip) или PJSIP Settings (для chan_pjsip).
  3. В разделе 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 эти опции обычно настраиваются для расширений или транков.

Настройки NAT для расширений (Extensions)

При создании или редактировании расширения (Applications -> Extensions):

  1. Откройте вкладку Advanced.
  2. Найдите NAT Mode (для chan_sip) или RTP Symmetric, Force rport, Rewrite Contact (для PJSIP).
    • Для внутренних абонентов (в той же локальной сети, что и Asterisk) обычно достаточно No или отключить симметричный RTP.
    • Для удаленных абонентов (например, софтфоны сотрудников, работающих из дома) выберите Yes или включите RTP Symmetric, Force rport, Rewrite Contact.

Настройки NAT для транков (Trunks)

При создании или редактировании транка (Connectivity -> Trunks):

  1. Перейдите в настройки SIP-транка.
  2. В разделе 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 убедитесь, что всё работает.

  1. Проверьте регистрацию: Убедитесь, что удалённые SIP-клиенты регистрируются. Используйте asterisk -rvvv и команды sip show peers (для chan_sip) или pjsip show endpoints (для chan_pjsip).
  2. Сделайте тестовые звонки: Позвоните между внутренними и внешними абонентами, а также через транки.
  3. Изучите логи: Внимательно читайте логи Asterisk (/var/log/asterisk/full). Ищите ошибки, связанные с NAT, SIP-сообщениями и RTP-трафиком.
  4. Захватите трафик: Используйте tcpdump и Wireshark. Анализируйте SIP-сигнализацию и RTP-потоки. Убедитесь, что в SIP-заголовках Contact и Via используются правильные IP-адреса (внешний для Asterisk, внутренний для клиентов).

Настройка NAT — это фундамент стабильной и качественной VoIP-связи, особенно когда абоненты или провайдеры находятся за разными сетевыми экранами. Понимая эти настройки, вы решите большинство проблем со связью, связанных с трансляцией сетевых адресов.

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