Asterisk за 2мя NATами, как быть с externip

Jun 26, 2015 12:08

Дабы не вдаваться в подробности, напишу, что без externip в sip.conf за NATом жизни нет.


Это обусловлено тем, что "голова", отдающая нам транк, не знает, куда ей обратно отвечать. Т.е., в консоли мы видим, что trunk registered, пытаемся звонить на мобильный - и ни буя! Представим себе ситуацию, что за каким-то хреновым чудом мы сидим за двумя роутерами (суть NAT) через канал с динамическим ip. есть, конечно, палочка-выручалочка в виде сервиса NOIP, но вот поди ж ты докажи второму роутеру, что тебе по динамике чего-то там присваивается...

Предположим, что наш крайний роутер смотрит "в интернет" и умеет работать с сервисами DDNS, следовательно, он сообщает тому же NOIP, какой адрес на этот раз ему отстегнул пров. И что правила маршрутизации sip-траффика вы настроили и сделали это правильно. Ок, гугл, как узнать присвоенный сервисом ip изнутри нашей сети? -nslookup, Ватсон! И его вывод даёт нам полянку для творчества на скриптах и синей изоленте.

Вкратце задача:
  1. получить ip, который знает noip (и он привязан к выданному сервисом DN);
  2. очистить адрес от мусора;
  3. засунуть его в sip.conf;
  4. перезагрузить конфу астериска.
Задача решается одним скриптом:

#! /bin/bash
noip=""
curdate=""
noip=`nslookup novostroykomfort.ddns.net | sed -n 6p | cut -f 2 -d " "`
curdate=`date +%D_%T`
echo $curdate $noip >> /var/log/noipcheck.log
sed -i "/externip =/ s/.*/externip = $noip/" /etc/asterisk/sip.conf | echo > /dev/null
service asterisk reload
Не торопитесь запускать! Что он делает: задаём переменные под ip и дату. Дата нам понадобится для логирования. В переменную noip заносим вывод конвейера команд nslookup, sed и cut. С первой всё понятно, sed - потоковый редактор с мощным функционалом (им берём только 6 строку из вывода), cut - резалка для строк и списков (ей берём 2й столбец). В curdate занесём текущие дату и время в формате м.д.г._ч.м.с. и запишем обе переменные в лог (">>" - это добавление строки). Далее тем же sed`ом обрабатываем файл /etc/asterisk/sip.conf (конфа сип-соединений астериска): ищем строку, начинающуюся на "externip = " и заменяем значение на "externip = $noip" (т.е. - значение переменной). Обратите внимание, что sed`у нужна инструкция -i и двойные кавычки, иначе чуда с подстановкой значения переменной не произойдёт. Ну и бросаем его вывод в /dev/null через конвейер и команду echo. И перезагружаем конфигурацию астериска. Читать это и только потом запускать -> Так же, необходимо слегка пошаманить в конфе астериски: где в комментах примеры вида "externip = ...". Просто поставьте 2 пробела до знака "=", т.е. "externip  = ..." (или вообще потрите коменты в конфиге, не забываем сделать бэкап!). Теперь - GO!

linux, asterisk, телефония, сети, связь

Previous post Next post
Up