Asterisk + iptables

Решение проблем NAT в IP-телефонии Asterisk

NAT или трансляция сетевых адресов — довольно часто используется в сети. Но при использовании NAT необходимо учитывать тот факт, что данная технология может создавать препятствия для прохождения голосовых пакетов, а также инициализации соединений. Существует несколько схем нахождения SIP клиента и сервера Asterisk за NAT. Рассмотрим некоторые из них и способы решения проблем.

Рассмотрим случай, когда SIP клиент ( телефон) находится за NAT, а Asterisk — снаружи. В данном случае голосовые пакеты будут перенаправляться на немаршрутизируемый адрес в сети, что в свою очередь соответственно приведет к потере звука.

В данной ситуации решением проблемы будет заключаться в следующем: в файле sip.conf указывается что включен NAT и используется внешний IP, тогда Asterisk будет использовать внешний IP для всех клиентов, кроме явно указанных в праметре localnet. Также стоит установить для сервера параметр qualify, равный примерно 300 миллисекунд — сервер будет опрашивать устройства в сети через заданный промежуток времени. Также возможно целесообразно будет разрешить использовать устройствам технологию Reinvite.

Пример:sip.conflocalnet=192.168.1.10/255.255.255.0 ; локальная сетьexternip=88.128.221.1 ; внешний ip адресnat=yes ; включить НАТqualify=300 ; проверять соединение каждые 300 мс.

Следующий случай — сервер Asterisk находится за NAT, а клиенты снаружи. В данной ситуации проблема может заключаться в следующем — поток RTP приходит не с того IP на который настроен транк, а с другого или же маршрутизатор определил поток как не принадлежащий текущей сессии — то чаще всего проявляется это в наличие голоса от звонящего и в тоже время полное отсутствие звука от того кому был совершен звонок.

Решение данной проблемы заключается в следующем: необходимо в явном виде указать серверу Asterisk, что он находится за NAT ( в файле sip.conf); перенаправить входящие потоки RTP на Asterisk ( в файле rtp.conf указаны порты для RTP соответственно эти порты и должны быть открыты); и последним шагом необходимо запретить Reinvite, т.е. пустить все потоки через Asterisk, запретив телефонам соединяться напрямую.

Пример:localnet=192.168.1.10/255.255.255.0 ; локальная сетьexternip=88.128.221.1 ; внешний ip адресnat=yes ; включить НАТcanreinvite=nortp.confrtpstart=10000rtpend=20000

Следующая типичная схема — когда и сервер Asterisk и SIP-клиенты находятся за NAT. Клиенты снаружи не смогут принимать звонки и SIP сообщения. Или в случае указания в SIP сообщении локального IP адреса телефона, будет происходить потеря звука.

Для избежания потери голоса запрещаем reinvite. Для того чтобы клиенты за NAT могли инициировать соединения с Asterisk и направлять RTP-пакеты на нужный экстеншен — необходимо пробросить требуемые порты через файервол на сервере. Смотрим диапазон портов, используемых Asterisk для RTP, в файле rtp.conf.

Пример проброса портов:iptables -t nat -A PREROUTING -i eth0 -p udp -m udp —dport 10000:12000 -j DNAT —to-destination 192.168.1.10iptables -t nat -A PREROUTING -i eth0 -p udp -m udp —dport 5060 -j DNAT Клиент за NAT —to-destination 192.168.1.10Где eth0 — внешний интерфейс, а 192.168.1.10 — IP адрес Asterisk.

источник

Настройка и запуск

Открываем конфигурационный файл:

vi /etc/asterisk/asterisk.conf

И редактируем следующее:

runuser = asterisk
rungroup = asterisk
defaultlanguage = ru
documentation_language = ru_RU

Создаем системную учетную запись asterisk:

useradd asterisk -m

Задаем права:

chown -R asterisk:asterisk /var/run/asterisk

chown -R asterisk:asterisk /etc/asterisk

chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk

chown -R asterisk:asterisk /usr/lib64/asterisk

chown -R asterisk:asterisk /var/log/asterisk

Проверяем конфигурацию:

asterisk -c

Исправляем ошибки и предупреждения. В моем случае были следующие.

Ошибки запуска

No configured users for ARI. ARI предоставляет API для Asterisk REST Interface. В данном примере, отключаем поддержку:

vi /etc/asterisk/ari.conf

enabled = no

Name or service not known. Если появится такая ошибка, система не может разрешить имя компьютера в IP-адрес. Необходимо правильно настроить DNS или прописать имя компьютера в файл /etc/hosts.

No directory URL or host found. Модуль для работы lpad неправильно настроен или не настроен.PostgreSQL RealTime: Failed to connect database asterisk on 127.0.0.1. Модуль для работы с СУБД PostgreSQL.Failed to open /dev/dahdi/transcode: No such file or directory. Ошибку можно увидеть, если нет оборудования DAHDI.

Вышеописанные ошибки возникают из-за включенных, но не используемых модулей. Отключаем:

vi /etc/asterisk/modules.conf

noload => res_config_ldap.so
noload => res_config_pgsql.so
noload => codec_dahdi.so

Предупреждения при запуске

  • Unable to find a valid server address or name.
  • Process_dahdi: Ignoring any changes to …
  • CEL pgsql config file missing global section.
  • Cel_tds module had config problems; declining load.

Отключаем следующие модули: 

noload => res_phoneprov.so
noload => app_dahdiras.so
noload => chan_dahdi.so
noload => res_pjsip_phoneprov_provider.so
noload => cel_pgsql.so
noload => cel_tds.so

Список всех загружаемых модулей можно посмотреть командой:

ls -la /usr/lib64/asterisk/modules/

Разрешаем сервис asterisk и запускаем его:

systemctl enable asterisk

systemctl start asterisk

Moving Around

Basic motion commands:

        k              
      h   l          
        j             

h or

characters to the left (exclusive).

l or

or

characters to the right (exclusive).

k or

or

CTRL-P

lines upward

j or

or

CTRL-J or

or

CTRL-N

lines downward (linewise).

To the first character of the line (exclusive).

<Home>

To the first character of the line (exclusive).

To the first non-blank character of the line

$ or

<End>

To the end of the line and lines downward

g0 or

g<Home>

When lines wrap (‘wrap on): To the first character of the screen line (exclusive). Differs from «0» when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost character of the current line that is on the screen. Differs from «0» when the first character of the line is not on the screen.

g^

When lines wrap (‘wrap’ on): To the first non-blank character of the screen line (exclusive). Differs from «^» when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost non-blank character of the current line that is on the screen. Differs from «^» when the first non-blank character of the line is not on the screen.

g$ or

g<End&gr;

When lines wrap (‘wrap’ on): To the last character of the screen line and screen lines downward (inclusive). Differs from «$» when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the rightmost character of the current line that is visible on the screen. Differs from «$» when the last character of the line is not on the screen or when a count is used.

f{char}

To ‘th occurrence of {char} to the right. The cursor is placed on {char} (inclusive).

F{char}

To the ‘th occurrence of {char} to the left. The cursor is placed on {char} (inclusive).

t{char}

Till before ‘th occurrence of {char} to the right. The cursor is placed on the character left of {char} (inclusive).

T{char}

Till after ‘th occurrence of {char} to the left. The cursor is placed on the character right of {char} (inclusive).

Repeat latest f, t, F or T times.

,

Repeat latest f, t, F or T in opposite direction times.

— <minus>

lines upward, on the first non-blank character (linewise).

+ or

CTRL-M or

<CR>

lines downward, on the first non-blank character (linewise).

_ <underscore>

— 1 lines downward, on the first non-blank character (linewise).

<C-End> or

G

Goto line , default last line, on the first non-blank character.

<C-Home> or

gg

Goto line , default first line, on the first non-blank character.

<S-Right> or

w

words forward

<C-Right> or

W

WORDS forward

e

Forward to the end of word

E

Forward to the end of WORD

<S-Left> or

b

words backward

<C-Left> or

B

WORDS backward

ge

Backward to the end of word

gE

Backward to the end of WORD

These commands move over words or WORDS.

A word consists of a sequence of letters, digits and underscores, or a sequence of other non-blank characters, separated with white space (spaces, tabs, ). This can be changed with the ‘iskeyword’ option.

A WORD consists of a sequence of non-blank characters, separated with white space. An empty line is also considered to be a word and a WORD.

( sentences backward
) sentences forward
{ paragraphs backward
} paragraphs forward
]] sections forward or to the next ‘{‘ in the first column. When used after an operator, then the ‘}’ in the first column.
][ sections forward or to the next ‘}’ in the first column
The operators that can be used are:
  ~  switch case
  d  delete
  c  change
  y  yank
  >  shift right 
  <  shift left 
  !  filter through external command 
  =  filter through 'equalprg' option command 
  gq  format lines to 'textwidth' length 
v start Visual mode per character.
V start Visual mode linewise.
<Esc> exit Visual mode without making any changes

SIP клиенты и Asterisk за NAT


Все усложняется если и Asterisk, и клиенты, находятся за NAT. Клиенты с внешней стороны не смогут получать SIP сообщения и принимать звонки. Или в SIP сообщении будет указан локальный IP адрес телефона, что приведет к потере звука.

Чтобы избежать потери звука запретите re-invite в файле sip.conf

canreinvite => no

Опция canreinvite устарела. Используйте ‘directmedia’.

  • directmedia=yes
  • directmedia=nonat
  • directmedia=update
  • directmedia=outgoing

Но клиенты находящиеся за NAT, все равно не смогут инициировать соединение с Asterisk и направить голосовые пакеты RTP на требуемый екстеншен. Для того чтобы это работало, надо пробросить требуемые порты через брандмауер на Asterisk.
Диапазон RTP портов используемых Asterisk, назначается в файле rtp.conf.

rtpstart=10000 
rtpend=10100                  

По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответсвии с вашими потребностями (3 порта на каждый конкурирующий вызов).

Для нормальной работы за NAT, потребуется пробросить диапазон RTP портов в соответсвии с настройками в файле rtp.conf
и порт SIP(обычно 5060). В iptables это будет выглядеть так:

iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 10000:10100 -j DNAT \
--to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 5060 -j DNAT \
--to-destination 192.168.1.10

Где eth0 — внешний интерфейс, а 192.168.1.10 — IP адрес Asterisk.

AsteriskNOW Установка

Запишите образ AsteriskNOW DVD на DVD диск, а затем загрузитесь с DVD, чтобы начать процесс установки.
После загрузки с AsteriskNow DVD, вам будет представлен с следующего вида экран и варианты установки с веб-интерфейсом FreePBX или без.
Это описание предполагает, что веб-интерфейс FreePBX будет установлен. Для этого, выберите опцию 1 и нажмите <ВВОД>:

Запустится автоматизированный графический вариант установки.
Во время установки,
во первых вам будет представлен экран с возможностью выбора Часового пояса:

Выберите место, которое соответствует вашему часовому поясу и перейдите к следующему экрану.

Далее, вам будет предложено установить пароль администратора (root):

Пользователь ‘root’ полноправный хозяин Linux системы.

Большинство настроек требуют доступа с правами ‘root’.

Рекомендуется использовать в пароле строчные и заглавные буквы, цифры и символы.

Далее выберите раздел жесткого диска.

Рекомендуется, выбрать «Use All Space»

и перейти к следующему экрану.

Подождите когда система будет установлена, это может занять 15-30 минут.

После завершения установки, вам будет предложено перезагрузить компьютер:

После перезагрузки системы вы увидите этот экран:

Поздравляем! Вы успешно установили AsteriskNow.

Авторизуйтесь с логином ‘root’ и паролем заданным вами при установке.

Обратите внимание на текст, который говорит «Чтобы настроить AsteriskNow с FreePBX, введите в ​​браузере адрес HTTP: xx.xx.xx.xx »
Это понадобится нам в следующем разделе.

Теперь, прежде чем двигаться дальше, важно обновить систему AsteriskNOW последними пакетами Linux. Чтобы сделать это, используйте утилиту «Yum»

Выполните «yum update»

Чтобы сделать это, используйте утилиту «Yum».
Выполните «yum update»

  • Если новые пакеты доступны для установки, утилита просит разрешения на их установку — ‘y’.
  • Также утилита может попросить разрешения принять ключ ним. Вы должны разрешить и это, для успешного обновления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *