Мы должны обновить систему, чтобы минимизировать время простоя и устранить проблемы.
Это одна из обычных задач администратора Linux для исправления системы один раз в месяц или максимум 90 дней. Читать
Мы должны обновить систему, чтобы минимизировать время простоя и устранить проблемы.
Это одна из обычных задач администратора Linux для исправления системы один раз в месяц или максимум 90 дней. Читать
Операционная система GNU/Linux появилась благодаря стечению обстоятельств. Вы узнаете о том, с чего всё начиналось и какую роль в этом сыграл неисправный принтер. Это история Ричарда Столлмана и Линуса Торвальдса.
Столлман задал вектор развития программного обеспечения и пракически закончил работу над операционной системой, подготовив необходимые системные утилиты. А Торвальдс добавил недостающее — ядро Linux.
Как Вам известно, asterisk является приложением (сервером) для IP-телефонии. То есть позволяет подключившимся к нему клиентам звонить друг другу и во внешний мир, используя (помимо всего прочего) линии телефонной связи. При этом возникают следующие риски:
Программа fail2ban в связке с брандмауэром (например, iptables) и правильно настроенным asterisk (отображающим в логах полную информацию, в том числе IP адреса клиентов и других серверов) позволяет эффективно заблокировать попытки подключения и подбора пароля.
Перед началом настройки Вам необходимо установить iptables и fail2ban. Кроме того, iptables должен быть уже настроен (и разрешать подключения к asterisk) до начала настройки fail2ban! Прочитать, как настроить iptables можно здесь: настройка iptables для работы asterisk. Вы также можете установить fail2ban до установки самого asterisk, и в этом случае (по крайней мере, теоретически) в процессе установки последние версии asterisk обнаруживают установленный fail2ban и настраивают его автоматически. Однако:
В первую очередь имеет смысл настроить ведение логов asterisk, чтобы информация сразу же начала собираться в нужном нам формате и виде. Для этого в каталоге конфигурации asterisk (по умолчанию это /etc/asterisk) найдите файл logger.conf и внесите в него следующие изменения: раскомментируйте (уберите точку с запятой в начале строки):
dateformat=%F %T ; ISO 8601 date format
Это нужно для того, чтобы asterisk писал в логи дату в правильном формате:
год-месяц-день часы:минуты:секунды
Начиная с 10-й версии asterisk, Вы можете включить Asterisk Security Framework. Для этого в файле logger.conf найдите и раскомментируйте (или добавьте) строку:
security => security
В этой строке с левой стороны от стрелки указано имя файла, в котором будут сохраняться события, а с правой стороны – уровни (типы событий), которые будут сохраняться. В данном примере события, относящиеся к уровню security (и только они), будут сохраняться в файл с именем security в папке логов asterisk.
Разумеется, после внесения изменений необходимо, чтобы asterisk перечитал конфигурацию. Для этого можно либо перезагрузить сервис астериска, либо только конфигурацию логов (logger reload из asterisk CLI).
После этого в папке логов asterisk (по умолчанию /var/log/asterisk) появится файл с именем security. Не забудьте настроить ротацию логов для этого файла (так же, как и для остальных логов asterisk)!
Теперь нам необходимо создать фильтр, который будет извлекать из общего потока сообщений астериска потенциально опасные события (неверный логин/пароль, попытка входа с неразрешенного IP адреса, и т.д. и т.п.). При этом нам необходимо не только обнаруживать такие потенциально опасные события, но и вычленять оттуда IP адрес, с которого было выполнено действие. То есть мы не просто ищем определенные строки в файлах событий астериска, а настраиваем правила фильтрации.
Правила фильтрации можно прописать в файле /etc/fail2ban/filter.d/asterisk.conf. Вот образец содержимого этого файла:
# Fail2Ban configuration file
#
#
# $Revision: 250 $
#
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf
[Definition]
#_daemon = asterisk
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?PS+)
# Values: TEXT
#
# Asterisk 1.8 uses Host:Port format which is reflected here
failregex = NOTICE.* .*: Registration from '.*' failed for ':.*' - Wrong password
NOTICE.* .*: Registration from '.*' failed for ':.*' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for ':.*' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for ':.*' - Device does not match ACL
NOTICE.* .*: Registration from '.*' failed for ':.*' - Not a local domain
NOTICE.* .*: Registration from '.*' failed for ':.*' - Peer is not supposed to register
NOTICE.* .*: Registration from '.*' failed for ':.*' - ACL error (permit/deny)
NOTICE.* .*: Registration from '.*' failed for '' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for '' - Device does not match ACL
NOTICE.* .*: Registration from '.*' failed for '' - Not a local domain
NOTICE.* .*: Registration from '.*' failed for '' - Peer is not supposed to register
NOTICE.* .*: Registration from '.*' failed for '' - ACL error (permit/deny)
NOTICE.* .*: Registration from '".*".*' failed for ':.*' - No matching peer found
NOTICE.* .*: Registration from '".*".*' failed for ':.*' - Wrong password
NOTICE.* .*: No registration for peer '.*' (from )
NOTICE.* .*: Host failed MD5 authentication for '.*' (.*)
NOTICE.* .*: Failed to authenticate user .*@.*
NOTICE.* failed to authenticate as '.*'$
NOTICE.* .*: Sending fake auth rejection for device .*<sip:.*@>;tag=.*
NOTICE.* .*: tried to authenticate with nonexistent user '.*'
VERBOSE.*SIP/-.*Received incoming SIP connection from unknown peer
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
В asterisk версии 1.4 и более ранних используются строки типа “… failed for ‘<HOST>’ …”, а в asterisk 1.8 и выше – строки “… failed for ‘<HOST>:.*’ …”, поскольку начиная с версии asterisk 1.8 в логах появилась информация о номере порта, которой нет в asterisk 1.4. Приведенный выше вариант учитывает как старые, так и новые версии asterisk, так что Вам нет необходимости в нем что-либо менять.
Для asterisk версии 10 и выше, если Вы включили ведение логов security, не забудьте прописать правила фильтрации для этих логов!
Правила фильтрации можно прописать в файле /etc/fail2ban/filter.d/asterisk-security.conf. Вот образец содержимого этого файла:
# Fail2Ban configuration file
#
#
# $Revision: 250 $
#
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf
[Definition]
#_daemon = asterisk
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?PS+)
# Values: TEXT
#
failregex = SECURITY.* SecurityEvent="FailedACL".*RemoteAddress=".+?/.+?//.+?".*
SECURITY.* SecurityEvent="InvalidAccountID".*RemoteAddress=".+?/.+?//.+?".*
SECURITY.* SecurityEvent="ChallengeResponseFailed".*RemoteAddress=".+?/.+?//.+?".*
SECURITY.* SecurityEvent="InvalidPassword".*RemoteAddress=".+?/.+?//.+?".*
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Теперь нам необходимо создать описания так называемых “изоляторов” (jails) для fail2ban, т.е. “привязать” наши фильтры к fail2ban: объяснить, в каких файлах эти строки искать, и что потом делать.
Для этого откройте файл /etc/fail2ban/jail.conf
enabled = false
Это правило необходимо создать для всех версий asterisk. Вы можете создать новое правило, или модифицировать любое из уже имеющихся, но отключенных. Новое правило (поскольку в нашем примере используется fail2ban в связке с iptables) будет называться asterisk-iptables и будет применяться к файлу, в котором сохраняются все основные виды событий астериска (notice, warning, error, …). По умолчанию в астериске этот основной файл логов называется messages, но (например) в FreePBX это будет файл под названием full (как называется файл у Вас – см. настройки астериска в файле logger.conf). Итак, само правило:
# настраиваем изоляторы fail2ban для основных событий asterisk:
[asterisk-iptables]
# правило включено:
enabled = true
# фильтр, которым будет пользоваться правило, называется asterisk
# (название фильтра - это имя файла в каталоге /etc/fail2ban/filter.d):
filter = asterisk
# к какому файлу (логам астериска) применять фильтр для поиска потенциально опасных событий:
logpath = /var/log/asterisk/messages
# количество потенциально опасных событий, найденных фильтром, для срабатывания действия:
maxretry = 3
# на какой период времени (в секундах) применять действие action:
bantime = 86400
# за какой период времени (в секундах) искать в logpath потенциально опасные события:
findtime = 3600
# что делать, если фильтр обнаружил атаку (за период findtime секунд в логах logpath обнаружено
# maxretry потенциально опасных действий с одного IP адреса) - блокируем все порты
# для этого IP и посылаем письмо для root:
action = iptables-allports[name=ASTERISK, protocol=all]
sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@asterisk]
# список IP адресов/подсетей, для которых все потенциально опасные события игнорируются:
ignoreip = 127.0.0.1/8
Это правило будет работать только в случае, если версия asterisk – 10 или новее, а также если включено ведение логов security (см. выше). Вы также можете создать новое правило, или модифицировать любое из уже имеющихся, но отключенных. Новое правило (поскольку в нашем примере используется fail2ban в связке с iptables) будет называться asterisk-security-iptables и это правило будет использовать для анализа файл security в каталоге логов астериска:
# настраиваем изоляторы fail2ban для событий безопасности asterisk:
[asterisk-security-iptables]
# правило включено:
enabled = true
# фильтр, которым будет пользоваться правило, называется asterisk-security
# (название фильтра - это имя файла в каталоге /etc/fail2ban/filter.d):
filter = asterisk-security
# к какому файлу (логам астериска) применять фильтр для поиска потенциально опасных событий:
logpath = /var/log/asterisk/security
# количество потенциально опасных событий, найденных фильтром, для срабатывания действия:
maxretry = 3
# на какой период времени (в секундах) применять действие action:
bantime = 86400
# за какой период времени (в секундах) искать в logpath потенциально опасные события:
findtime = 3600
# что делать, если фильтр обнаружил атаку (за период findtime секунд в логах logpath обнаружено
# maxretry потенциально опасных действий с одного IP адреса) - блокируем все порты
# для этого IP и посылаем письмо для root:
action = iptables-allports[name=ASTERISK-security, protocol=all]
sendmail-whois[name=ASTERISK-security, dest=root, sender=fail2ban@asterisk]
# список IP адресов/подсетей, для которых все потенциально опасные события игнорируются:
ignoreip = 127.0.0.1/8
Теперь необходимо запустить (или перезапустить) fail2ban и (если это необходимо, например iptables еще не был запущен) iptables.
Для запуска iptables (его нужно запустить первым) выполните следующую команду:
/etc/init.d/iptables start
Для перезапуска fail2ban выполните следующую команду:
/etc/init.d/fail2ban restart
Для проверки, что fail2ban запущен успешно и правило загружено, выполните следующую команду:
fail2ban-client status asterisk-iptables
и (если есть второе правило)
fail2ban-client status asterisk-security-iptables
Для отображения списка правил iptables выполните следующую команду:
iptables -L -n
В случае, если Вы только что установили fail2ban / iptables, не забудьте убедиться, что они настроены у Вас стартовать автоматически при загрузке системы!
Главное в процессе проверки fail2ban – иметь под рукой другой компьютер (или локальный доступ к серверу asterisk), чтобы в случае, когда fail2ban заблокирует Ваш IP адрес, Вы смогли подключиться и удалить эту блокировку!
Необходимо обязательно проверить работу связки fail2ban + iptables, поскольку, даже если Вы все настроили (или скопировали) правильно, возможно множество комбинаций событий, в результате которых настренные Вами блокировки работать не будут.
Последовательность действий для проверки работы связки fail2ban + iptables:
enabled = false), например asterisk-security-iptables
service fail2ban statusservice iptables status
fail2ban-client status asterisk-iptablesfail2ban-client status asterisk-security-iptablesSorry but the jail 'asterisk-security-iptables' does not exist ,Status for the jail: asterisk-iptables
|- filter
| |- File list: /var/log/asterisk/messages
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
`- Total banned: 0
fail2ban-client status asterisk-iptables
Для этого Вам необходимо воспользоваться услугой iptables. Сначала мы выведем список правил на консоль, а затем выбрав нужные IP, удалим их из бана.
Для просмотра списка правил введите команду:
iptables -L -n
Вы увидите сообщение следующего вида:
Chain INPUT (policy ACCEPT)
target prot opt source destination
...
fail2ban-ASTERISK all -- 0.0.0.0/0 0.0.0.0/0
...
Chain fail2ban-ASTERISK
target prot opt source destination
DROP all -- 1.2.3.4 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
...
Нас интересует удалить из бана IP адрес 1.2.3.4, который (как мы видим) находится в цепочке правил (chain) под названием fail2ban-ASTERISK. Набираем команду:
iptables -D fail2ban-ASTERISK -s 1.2.3.4 -j DROP
В случае успешного выполнения команды никаких сообщений не появится, и если мы теперь снова запустим команду
iptables -L -n
то увидим, что IP адрес исчез из блокировки iptables (хотя и остался в блокировке fail2ban!). При этом мы снова можем подключаться к серверу asterisk
Для того, чтобы fail2ban не блокировал определенный IP адрес (или несколько IP адресов) независимо от того, сколько неудачных попыток подбора пароля (и прочих “неправомерных” действий) они совершили, необходимо произвести дополнительную настройку jails в файле /etc/fail2ban/jail.conf
В каждом правиле файла jail.conf может присутствовать параметр ignoreip, который задает список IP адресов, попадающих в “белый список” для этого правила. Поскольку правил у нас может быть два, обратите внимание, что Ваш IP необходимо прописывать в обоих правилах!
Параметр имеет следующий вид:
ignoreip = 127.0.0.1/8 192.168.0.0/16 1.2.3.4
То есть Вы можете прописывать как подсети, так и отдельные IP адреса (в данном случае в “белый список” попадают IP 127.0.0.1-127.0.0.255, 192.168.0.1-192.168.255.255 и 1.2.3.4).
Во время проверки правильности настройки fail2ban Вы неоднократно запускали SIP клиента для тестирования работы по блокировке будущих атак из интернета. И в процессе последующей работы Вам, возможно, также понадобится время от времени производить действия, последствиями которых может быть блокировка со стороны fail2ban / iptables. Хотелось бы не дожидаться, когда fail2ban “соизволит” разблокировать IP сам (а это может быть довольно долго – поскольку параметр bantime можно выставить хоть на час, хоть на день, хоть на год).
Существуют 2 пути решения подобной проблемы:
Вы можете проверить, как будет применяться фильтр fail2ban к тому или иному логу. Для этого можно запустить команду:
fail2ban-regex /var/log/asterisk/messages /etc/fail2ban/filter.d/asterisk.conf
Где /var/log/asterisk/messages – это пример пути к файлу с логами, который будет фильтроваться, а /etc/fail2ban/filter.d/asterisk.conf – сам фильтр, который содержит те фрагменты [сообщения об ошибках], которые должны быть в логе [чтобы забанить IP адреса атакующих].
И напоследок: вместо перезагрузки fail2ban с помощью service fail2ban restart можно выполнить следующую команду fail2ban-client reload

Iptables – это брандмауэр, который защищает компьютер от несанкционированных подключений (как от входящих подключений извне, так и несанкционированных подключений вовне с самого компьютера). Для астериска iptables дает возможность отключить подсети, из которых не должно быть подключений к asterisk, а также в связке с fail2ban iptables может закрыть сервер от подбора паролей к серверу (в частности, отключать тех, кто пытается подобрать пароли клиентов asterisk). Читать
IPv6 предлагает гораздо более широкую схему адресации, чем IPv4, что является одной из многих причин, по которым оно было разработано. Однако я видел редкие случаи, когда IPv6 вызывал проблемы с сетью.
Поскольку некоторые аппаратные средства не используют IPv6 (и большинство админов все еще работают с IPv4), временным и простым решением является отключить IPv6; протокол может быть повторно включен, когда придет время, когда проблема была окончательно решена.
Если у вас есть аппаратное обеспечение, которое отлично реализует IPv6 и программное обеспечение, которое его использует правильно, это не проблема. Но если у вас проблемы с сетью на серверах Linux или настольных компьютерах, и вы исчерпали все возможные области, вы можете попробовать отключить v6 сетевого протокола.
У меня было несколько случаев, когда связь между рабочим столом Linux и маршрутизатором ATT UVERSE постоянно снижалась, а отключение IPv6 было единственным решением, которое сработало. Через некоторое время я снова включил IPv6, чтобы проверить, разрешило ли обновление прошивки маршрутизатора (и обновление ОС настольного компьютера); в некоторых случаях он решил проблему, и IPv6 мог оставаться включенным, хотя в других случаях IPv6 пришлось бы отключить снова.
Я покажу вам, как отключить IPv6 на машине Linux. ( Примечание. Я рекомендую отключить IPv6 только тогда, когда вы исчерпали все остальные параметры. Также вы должны рассмотреть это временное исправление.)
Командная строка
Вы догадались, мы будем работать с командной строкой. Я покажу вам, как отключить IPv6 в дистрибутивах Red Hat и Debian.
Вот как отключить протокол в системе на основе Red Hat:
sysctl -w net.ipv6.conf.all.disable_ipv6 = 1
sysctl -w net.ipv6.conf.default.disable_ipv6 = 1
Чтобы снова включить IPv6, выполните следующие команды:
sysctl -w net.ipv6.conf.all.disable_ipv6 = 0 sysctl -w net.ipv6.conf.default.disable_ipv6 = 0
Вот как отключить протокол на машине на базе Debian.
sudo nano /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
Чтобы снова включить IPv6, удалите указанные выше строки из /etc/sysctl.conf и перезагрузите компьютер.
Предостережения
Если вы используете X Forwarding через ssh, отключение IPv6 может привести к поломке этой системы. Чтобы исправить эту проблему, вы должны открыть файл /etc/ssh/sshd_config и изменить #AddressFamily на любой адрес AddressFamily inet. Сохраните этот файл и перезапустите sshd.
Если вы используете Postfix, вы можете столкнуться с проблемами при запуске службы. Чтобы исправить это, вам придется использовать IPv4. Откройте файл /etc/postfix/main.cf, закомментируйте строку localhost и добавьте петлю IPv4 следующим образом:
#inet_interfaces = localhost inet_interfaces = 127.0.0.1
Это не идеальное решение, но иногда вам приходится проявлять творческий подход к устранению неполадок. Если вы столкнулись с нечетными сетевыми ошибками с серверами Linux и рабочими столами, попробуйте отключить IPv6, чтобы помочь вам в устранении неполадок или предоставить временное исправление.
Недавно я попал в ситуацию, когда все мои виртуальные машины не смогли добраться до WAN. После некоторого устранения неполадок я обнаружил, что по какой-то причине обновление маршрутизатора в моей сети вызывает отказ. Проблема возникла из-за неправильно настроенной проблемы с IPv6 в прошивке сетевого оборудования. Но что мне делать? Подождите, пока провайдер отправит обновление, чтобы исправить проблему? Нет. Вместо этого я отключил IPv6 на своих виртуальных машинах. В противном случае они будут нефункциональными до тех пор, пока провайдер не вытолкнет обновление, которое, зная провайдера, может занять слишком много времени. Однако у меня были разные дистрибутивы Linux как виртуальные машины, а это означало, что я должен был заботиться о каждой виртуальной машине, используя другой метод.
Я нашел более надежный метод, который работает во всех дистрибутивах Linux, которые используют загрузчик GRUB. Этот метод требует доступа sudo, редактирования файла и запуска команды, но стоит изучить, если вы окажетесь в подобной ситуации, и вы запускаете множество дистрибутивов Linux.
Этот файл является /etc/default/grub. Откройте этот файл в своем любимом текстовом редакторе (например, с помощью команды sudo nano /etc/default/grub). Внутри этого файла вы увидите две строки:
GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX=""
Вы можете обнаружить, что первая строка выглядит так:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Запись «quiet splash» приводит к отключению всех видов информации при отображении на экране при загрузке.
Измените приведенные выше строки, чтобы отобразить следующее:
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1" GRUB_CMDLINE_LINUX="ipv6.disable=1"
Или:
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash" GRUB_CMDLINE_LINUX="ipv6.disable=1"
Сохраните и закройте этот файл.
Обновление GRUB
Теперь мы должны обновить загрузчик GRUB, иначе система не заметит изменений. Вернитесь в окно терминала и выполните следующую команду:
sudo update-grub
После завершения этой команды перезагрузите компьютер (или виртуальную машину), а IPv6 будет отключен во время процесса загрузки. Если у вас возникли проблемы с сетью, из-за плохо настроенного IPv6 на маршрутизаторе ваша машина Linux больше не будет иметь проблем с получением глобальной сети.
К сожалению, некоторые провайдеры не выяснили, как настроить IPv6, чтобы он не вызывал проблем с определенными операционными системами. Если вы попадаете в эту категорию, вы можете обнаружить, что единственным решением является отключение IPv6, пока указанный поставщик не подталкивает обновление, которое устраняет проблему, которую они создали. Когда IPv6 работает, вы можете просто отменить этот процесс (удалите ipv6.disable = 1 записей), перезапустить sudo update-grub и перезагрузить.
Устанавливаем Asterisk:
apt install asterisk
После установки заходим в shell Asterisk:
asterisk -rv
Обратите внимание на ключи, c которыми запускается shell. Количество ключей «v» влияет на количество выводимой информации при звонке, их количество варьируется от 1 до 14.
Если установка прошла успешно и Астериск запустился, вы увидите вот такое приглашение:
asterisk*CLI>
Первое что вам требуется сделать — создать пиров в файле /etc/asterisk/sip.conf.
Открываем его:
mcedit /etc/asterisk/sip.conf
И сразу переходим в конец файла. Вставляем следующий текст:
[internal](!) type=friend insecure=invite,port context=office fromdomain=<имя домена или IP> host=dynamic disallow=all allow=alaw qualify=yes canreinvite=no nat=no [100](internal) secret=XXX [101](internal) secret=XXX
Мы завели двух внутренних пиров с номерами 100 и 101. Разберем эти настройки, так как их понимание — ключ к успешному внедрению Астериска.
[internal](!)
[internal], это имя шаблона, а (!) указатель шаблона.
Почему сразу начинаем использовать шаблоны? Потому что они сокращают время настройки и уменьшают количество текста с конфигурационном файле, а для понимания они очень просты.
type=friend
Доступные параметры: «peer», «user» и «friend». Очень часто встречается ошибочное мнение относительно того, чем они отличаются. Многие считают, что параметр «user» разрешает только исходящие, «peer» — только входящие звонки, а «friend» разрешает звонки в обе стороны. Это не так. Использование ключа «peer» отключает проверку соответствия имени пользователя и пароля при звонке. При использовании параметра «peer», Астериском проверяется только соответствие IP-адреса и номера порта источника вызова, при использовании «user» — проверяется поле username, а проверка адреса источника не производится. Параметр «friend» заставляет проверять поле username и IP-адрес источника.
insecure=invite,port invite — отключается аутентификация при входящем звонке. port — отключается проверка порта источника.
При первоначальной настройке пропишите оба ключа.
context=office
Контекст, в котором будут обрабатывается исходящие звонки от этого устройства. Подробности чуть ниже.
fromdomain=<имя домена или IP>
Имя SIP-домена. Для первоначальной настройки укажите IP адрес сервера с Астериском.
host=dynamic
IP-адрес пира. В случае использования авторизации по логину и паролю — ставьте dynamic. Конкретный IP указывается только в том случае, если настройки пира используются для транка без регистрации.
disallow=all allow=alaw
Указываем разрешенные кодеки.
В нашем примере первая строка запрещает использование всех кодеков, а вторая — разрешает g711-a. Настройки кодеков индивидуальны для каждого случая, однако, большинство Российских и Украинских провайдеров используют g711a и g729. Последний — пропиетарный, и Астериском поддерживается лишь в Passthrough-режиме (то есть, невозможен транскодинг).
qualify=yes
Эта строка заставляет Астериск опрашивать устройство или софтфон пакетами OPTIONS. Необходим для мониторинга и траблшутинга.
canreinvite=no
Запрещает пересылать медиа напрямую между устройствами. Рекомендую ставить «no», для упрощения настройки.
nat=no
Говорим Астериску, что пир не за натом. Описание ключей и вариантов их использования, если сервер за ним, выходит за рамки статьи. Про варианты обхода расскажу в следующей статье.
[100](internal) secret=XXX [101](internal) secret=XXX
Тут мы задаем имя пира и берем настройки из шаблона. Единственные уникальные параметры в нашем примере — имя пира и пароль.
На этом мы закончили настраивать внутренних пиров, перейдем к настройке стыка с операторами. Добавим 2 записи в конец sip.conf:
[operator1] fromdomain=<имя домена или IP> host=1.2.3.4 insecure=invite,port port=5060 qualify=yes type=friend username=YourLogin secret=YourPass disallow=all allow=alaw context=operator1
Не буду расписывать значения каждой строки, т.к. все настройки идентичны настройкам внутренних пиров, за исключением поля host. В том случае, если Астериск выступает в роли клиента (а для сервера оператора наш астериск является клиентом), нам нужно указать адрес сервера оператора или его dns-имя.
Добавим второго оператора:
[operator2] fromdomain=<имя домена или IP> host=5.6.7.8 insecure=invite,port port=5060 qualify=yes type=friend disallow=all allow=alaw. context=operator2
Отличий тоже никаких, за исключением отсутствия строк username и secret, так как, напомню, второй оператор не использует регистрацию.
Осталось настроить регистрацию на сервере оператора №1. Для этого в файле sip.conf, перед секцией описывающей настройки оператора вставим следующую строку:
register => udp://YourLogin:YourPass:YourLogin@1.2.3.4/YourLogin
Синтаксис, для неподготовленного человека, выглядит сложным, поэтому не заморачивайтесь и просто позвоните в саппорт провайдера и узнайте у них о том, как регистрироваться на сервере Астериском, либо попросите выслать настройки. Как правило, большинство операторов без проблем высылают пример конфигурации под свои софт-свитчи.
На этом настройка пиров закончена, ее достаточно для работы в минимальной конфигурации, сохраняем и закрываем файл и возвращаемся в шелл Астериска командой:
asterisk -rv
В шелле Астериска пишем команду:
sip reload
Теперь вы можете зарегистрировать на своем Астериске пользователей с логинами 100 и 101. Проверяется состояние регистрации следующей командой:
sip show peers
Если вы все настроили правильно, то увидите примерно вот такой вывод:
asterisk*CLI> sip show peers Name/username Host Dyn Forcerport Comedia ACL Port Status Description 100/100 10.0.0.52 D Yes Yes 59080 OK (1 ms) 101/101 10.0.0.57 D Yes Yes 49973 OK (1 ms) operator1 1.2.3.4 No No 5060 OK (22 ms) operator2 5.6.7.8 No No 5060 OK (22 ms)
Если вы это видите, то, поздравляю, ваши устройства или софтфоны успешно зарегистрировались и Астериск увидел сервера операторов.
Состояние регистрации проверяется командой:
sip show registry
Если регистрация прошла успешно, то вы должны увидеть вот такой вывод:
asterisk*CLI> sip show registry Host dnsmgr Username Refresh State Reg.Time 1.2.3.4:5060 N YourLogin 120 Registered 1 SIP registrations.
На этом настройка пиров закончена, перейдем к настройке диалплана. Диалплан — это сердце Астериска, с помощью него обрабатываются абсолютно все звонки. Астериск понимает несколько языков, но в нашем примере мы будем использовать стандартный, появившийся в самых первых релизах Астериска. Файл конфигурации хранится в файле /etc/asterisk/extensions.conf.
Откроем его командой:
mcedit /etc/asterisk/extensions.conf
В стандартных файлах конфигурации хранится много дефолтных правил. Они нам не нужны, поэтому очистим содержимое и пропишем следующее:
[general] static=yes writeprotect=no [globals]
Это параметры необходимые для нормального чтения диалплана, поэтому менять их не следует.
Начнем с простого. Нам нужно позвонить с номера 100, на номер 101. Для этого нужно прописать правило, сразу после секции globals:
[office]
exten => _1XX,1,Dial(SIP/${EXTEN})
Разберем эту строку.
[office] — имя контекста, в котором обрабатываются звонки от пира.
exten => — указатель начала шага.
_1XX — маска. На маске остановимся чуть подробнее. С помощью нее сортируются все звонки, попадающие в контекст диалплана.
Маска использует набор паттернов для сортировки звонков по caller-id:
X – любая цифра от 0-9 N – любая цифра от 2-9 [234-6] – цифры 2, 3, 4 и 6 . – любые возможные символы
Маска начинается с символа “_”, который означает что это шаблон. В случае, если вы забудете указать его, Астериск примет 1XX за вызываемый номер и передаст Dial-у паттерны вместо номера телефона, и звонок не состоится.
1 — номер действия.
Dial — это приложение. В диалплане можно использовать более 200 различных приложений, которые используются для манипуляций со звонками. Сейчас, в самом начале, мы будем использовать только одно приложение — Dial. Из названия понятно, что оно используется для совершения звонков.
(SIP/${EXTEN}) — аргументы для приложения. В нашем примере, для внутренних пиров мы используем протокол SIP, поэтому первый аргумент, который мы передаем dial-у — указывает на используемый протокол сигнализации. ${EXTEN} — текущий экстеншен, его значение берется из заголовка (из поля destination).
/ — разделитель для передаваемых аргументов.
Каждый из параметров разделяется запятыми. В нашем примере используются трехзначные номера, поэтому в маске должно быть 3 паттерна. В случае, если вы захотите использовать иную длину нумерации, то пишите в маске нужное количество паттернов. Теперь сохраняем файл, открываем шелл астериска и пишем команду:
dialplan reload
И снова перезагружаем диалплан через шелл Астериска.
Теперь пробуем звонить. Если вы все правильно настроили, то пир с номером 100 дозвонится до пира с номером 101. Сейчас мы можем звонить внутри офиса, между пирами, которые работают в контексте office. Для того что бы позвонить в город, нам нужно написать правило для исходящих звонков через первого оператора. Прописываем его в контекст office, выглядит оно так:
exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
Перезагружаем диалплан и пробуем звонить в город.
Теперь нам надо принять входящий звонок. Сделаем новый контекст в диалплане, пишем в конец файла:
[operator1] exten => s,1,Dial(SIP/100&SIP/101)
Поясню что означает «s». Это стандартная маска в Астериске, под которую попадают абсолютно все вызовы. То есть, если мы используем транк с регистрацией, входящий caller-id будет «s».
Сохраняемся и перезагружаем диалплан. Теперь мы можем принять входящий звонок через оператора, предоставляющего нам городской номер.
Сейчас нам понадобилось позвонить на сотовый телефон, с федеральным номером. Допишем еще одну строку в контекст [office]:
exten => _89XXXXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
Сохраняемся, перезагружаем диалплан и звоним. Все. Теперь мы можем полноценно использовать услуги оператора, предоставляющего городской номер.
Однако, тут кроется небольшая проблема, которая возникнет при звонке на сотовые телефоны других регионов. Так как номер телефона федеральный, то все звонки пойдут через первого оператора. Поэтому уместно уменьшить размер масок в диалплане. К примеру:
exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1)
exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1)
exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
С такой конструкцией все звонки на телефоны с кодами из диапазонов 890982XXXXX-890999XXXXX и 8901421XXXX-8901651XXXX пойдут через первого оператора. Не совсем удобно, соглашусь с этим. В будущих статьях выложу конфигурацию диалплана для автоматического выбора оператора в зависимости от направления звонка, так как подобное опять же выходит за рамки этой статьи.
Теперь нам осталось пустить междугородние звонки через второго оператора. Добавляем строку в контекст [office]:
exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567)
same => n,Dial(SIP/${EXTEN}@operator2)
Как вы заметили, тут появились новые приложения, которые обрабатывают звонки. Set(CALLERID(num)=74991234567) — так как мы используем транк без регистрации, то это значит что мы должны отсылать оператору caller-id. Этот номер не обязательно должен существовать. Тут мы просто представляемся провайдеру и не более. Какой номер подставлять — зависит от оператора. Некоторые предоставляют услугу подмены caller-id на номер другого оператора, для совершения исходящих вызовов по межгороду или для зоновуй связи. За подробностями обращайтесь к оператору. same => n — указатель, который позволяет не писать каждый раз маску и номер действия. К примеру:
exten => 78121234567,1,Answer exten => 78121234567,1,Set(CALLERID(name)=Trunk_1 exten => 78121234567,1,Dial(SIP/1000)
Можно заменить на:
exten => 78121234567,1,Answer same => n,Set(CALLERID(name)=Trunk_1 same => n,Dial(SIP/1000)
Во втором случае все гораздо проще, не так ли?
На этом все, мы настроили Астериск. Теперь мы можем звонить в город, на сотовые, по межгороду и у нас есть внутренняя связь между пирами. Получаем вот такой, вполне рабочий диалплан:
[general]
static=yes
writeprotect=no
[globals]
[office]
exten => _8909[89][2-9][1-3]XXXX,1,Dial(SIP/${EXTEN}@operator1)
exten => _8901[456][2-5]1XXXX,1,Dial(SIP/${EXTEN}@operator1)
exten => _[78][3-689]XXXXXXXXX,1,Set(CALLERID(num)=74991234567)
same => n,Dial(SIP/${EXTEN}@operator2)
exten => _XXXXXXX,1,Dial(SIP/${EXTEN}@operator1)
exten => _1XX,1,Dial(SIP/${EXTEN})
[operator1]
exten => s,1,Dial(SIP/100&SIP/101)
На этом базовая минимальная настройка завершена.