У сервера Elastix два интерфейса eth0 (192.168.1.10) и eth1 (10.1.1.10). Один смотрит в локалку(+через шлюз в этой же подсети смотрит в Интернет), другой смотрит в корпоративную сеть. В одной подсети(локальной), с сервером Elastix, софтфон PhonerLite. В удаленном офисе стоит D-Link 150s. При звонке из/в удаленный офис звук слышат только в удаленном офисе, в софтфоне тишина. NAT не используется.
Поиск неисправности начался с просмотра консоли Asterisk. В консоли сервера вводим:
asterisk -r
Затем в консоли asterisk вводим:
rtp set debug ip 10.1.1.10
Где 10.1.1.10 — IP-адрес сервера Elastix.
И пробуем звонить. Из полученного вывода видим, что UDP-пакеты (с голосом) до сервера от удаленного филиала, просто, не доходят.
Для верности проверил это утверждение командой в linux-консоли:
tcpdump -i eth1
Попробовал позвонить и, снова, получил «картину», которая подтвердила то, что пакеты из удаленного филиала до интерфейса eth0(10.1.1.10) не доходят.
Вот, что вывела команда:
09:10:27.518244 IP 10.1.1.10.18122 > 10.1.1.111.10028: UDP, length 172 09:10:27.537689 IP 10.1.1.10.18122 > 10.1.1.111.10028: UDP, length 172 09:10:27.558299 IP 10.1.1.10.18122 > 10.1.1.111.10028: UDP, length 172 09:10:27.577733 IP 10.1.1.10.18122 > 10.1.1.111.10028: UDP, length 172 09:10:27.598595 IP 10.1.1.10.18122 > 10.1.1.111.10028: UDP, length 172
10.1.1.111 — IP-адрес телефонного аппарата в филиале.
UDP-пакеты от нас уходят, но к нам не приходят.
Потом я проверил нормально ли зарегистрировался телефон филиала на сервере:
Снова вошел в консоль asterisk:
asterisk -r
Затем ввёл команду:
sip show peers
В которой нашел строчку с телефоном филиала:
Name/username Host Dyn Forcerport Comedia ACL Port Status Description 130/130 10.1.1.111 D No No A 5060 OK (4 ms)
Где 130 — внутренний номер.
Статус — ОК.
Через какое-то время, после смены многоисленных настроек телефона и прочих танцев с бубном меня озарило:
Нужно проверить параметр externip в файле sip_nat.conf и оказалось, что этой директиве присвоен совсем не тот IP-адрес, который нужно.
Я исправил его на:
externip=10.1.1.10
И всё заработало.
Исходя из этого я сделал вывод, что эта директива служит для того, чтобы показать телефонам, которые находятся вне локальной сети, на какой IP-адрес отправлять пакеты с голосом.