Есть сервер на операционной системе
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 адрес из заголовков этих протоколов, поэтому теперь все работает.