Задать вопрос
@demsi

Asterisk почему нет звука?

Есть сервер на операционной системе Debian GNU/Linux Wheezy.
На нем установлен Asterisk и xl2tpd.
Подключение sip клиента к Asterisk происходит через l2tp соединение.
Asterisk недоступен для интерфейсов которые выходят во внешнюю сеть.
В соединении l2tp у сервера адрес 192.168.68.1 у клиента 192.168.68.10.
Соединяюсь с Asterisk sip клиентом linphone. Предварительно конечно соединившись с сервером через l2tp.
При звонке на любой номер (внешний, не подключенный к этому серверу), абонент меня отлично слышит, а я его совсем не слышу.
tcpdump со стороны клиента во время звонка выдает такое:
3:19:40.090729 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.110629 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.150170 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.163438 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.170718 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.190383 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.231184 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.240969 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.260849 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.270566 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.301064 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
13:19:40.320882 IP 192.168.68.10.7078 > 192.168.68.1.15668: UDP, length 172
....

Со стороны сервера тоже самое.

Если в программе linphone установить настройку: За NAT, внешний адрес: 192.168.68.10
То все работает отлично. Меня слышно, и я слышу абонента. В этом случае tcpdump выдает вот такое:
3:23:29.932392 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
13:23:29.942299 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
13:23:29.944305 IP 192.168.68.1.15336 > 192.168.68.10.7078: UDP, length 172
13:23:29.962740 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
13:23:29.964799 IP 192.168.68.1.15336 > 192.168.68.10.7078: UDP, length 172
13:23:29.971826 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
13:23:29.984661 IP 192.168.68.1.15336 > 192.168.68.10.7078: UDP, length 172
13:23:30.001635 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
13:23:30.005045 IP 192.168.68.1.15336 > 192.168.68.10.7078: UDP, length 172
13:23:30.024650 IP 192.168.68.1.15336 > 192.168.68.10.7078: UDP, length 172
13:23:30.031927 IP 192.168.68.10.7078 > 192.168.68.1.15336: UDP, length 172
....

Как можно заметить теперь пакеты ходят в обе стороны.

В чем тут дело? Если нужны какие-то другие данные, могу без проблем предоставить.

Спасибо большое Владимир.
Обратил внимание на SDP в пакетах. Как вы и говорили в случае когда настройка За NAT, внешний адрес: 192.168.68.10 не включена.
В SDP в заголовках Owner Adress и Connection Adress стоит 192.168.0.2 - адрес другого интерфейса.
Если настройку За NAT, внешний адрес: 192.168.68.10 включить то там нормальный адрес 192.168.68.10 - как мне нужно.

Самое смешное что в sip клиенте Ekiga нет возможности настроить внешний адрес как в linphone, и временами звук просто переставал работать. Видимо Ekiga выставляет ip адрес первого найденного интерфейса в SDP. Теперь ясно откуда у проблемы растут ноги.

В Asterisk добавил в настройки пира в sip.conf параметр nat=yes.
Теперь все отлично работает, даже без настройки За NAT, внешний адрес: 192.168.68.10 в linphone.

Кстати чтобы прояснить и никому не казалось что это некая магия. Почему же теперь все работает, когда в заголовках SDP все равно неверный ip адрес?
Все конечно знают что такое NAT. Но что же конкретно делает опция nat=yes в Asterisk?
Вот её описание:
Для параметра nat может быть задано значение yes, no или never. Ес-
ли задано yes, Asterisk игнорирует IP-адрес в заголовках SIP и SDP
и отвечает на адрес и порт, указанные в IP-заголовке. Опция never
предназначена для устройств, которые не могут обрабатывать поле
rport в SIP-заголовке.

Как можно заметить, на моем примере, она необходима не только когда клиент находится за NAT. В моем случае до сервера есть прямое vpn соединение, где NAT не используется. Но тем не менее в заголовки SIP и SPD попадает ip адрес другого интерфейса. Эта опция говорит Asterisk игнорировать ip адрес из заголовков этих протоколов, поэтому теперь все работает.
  • Вопрос задан
  • 12307 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
клиент анонсирует в SDP другой IP
будет видно в sip debug

при наличии нескольких интерфейсов не все клиенты способны правильно определить какой IP подставлять

включите nat=yes на пире
может быть полегчает
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
microphone
@microphone
Сломалось - читай логи!
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Ну проблема как раз в NAT, а то, что вы делаете - и есть ее решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы