Статья ориентирована на начинающих пользователей Asterisk, которые, тем не менее,
имеют знания о работе компьютерных сетей на уровне CCNA и которые изучали основы IP-телефонии без специализированных курсов.
1. Вы не отключили анонимные звонки и использовали контекст по умолчанию для плана нумерации
Проблема
По умолчанию, в Asterisk включены анонимные звонки, чтобы вам могли звонить из любой точки планеты напрямую, указывая номер@вашдомен в качестве назначения звонка и опираясь на работу DNS. Это очень полезная возможность, но она может сыграть с вами дурную шутку, если вы используете контекст по умолчанию для основной нумерации. Получится, что любой желающий, отправивший запрос на номер_телефона@ваш_домен сможет за ваш счет позвонить по межгороду, например.
Решение
Первое правило, которому следовать нужно всегда: не использовать контекст по умолчанию для нумерации. Запомните,
контекст default только для анонимных звонков из интернета, рассматривайте его как самый недоверенный из всех. Если вы не планируете принимать анонимные звонки, обязательно отключите их.
sip.conf
[general]
allowguest=no
2. Вы по-разному отвечаете на запрос регистрации с верным именем пользователя и неверным паролем и на запрос с несуществующим именем пользователя
Проблема
В интернете хватает желающих позвонить за чужой счет, поэтому надо максимально усложнять им жизнь. Asterisk, по умолчанию (до недавних пор, но вдруг у вас не совсем свежая версия), по-разному отвечает на попытки регистрации с неверным именем пользователя и с верным именем, но неверным паролем. Отсюда возникает возможность у атакующего выяснить существующие имена абонентов и уже целенаправленно подбирать пароли к ним.
Решение
sip.conf
[general]
alwaysauthreject = yes
3. Вы не используете списки доступа ACL и/или средства динамического ограничения доступа
Поскольку, несмотря на предпринятые в прошлом пункте усилия, все ещё сохраняется возможность подбора пароля, во всех случаях, когда возможно, следует использовать правила контроля доступа (acl)
sip.conf
[my_user]
deny=0.0.0.0/0
permit=172.16.0.0/12 ; указывайте сети, откуда может выполняться регистрация
Бывают случаи, когда невозможно использовать acl — абонент может регистрироваться из произвольной сети. В этом случае необходимо использовать средства динамической блокировки, например fail2ban — утилита для обработки логов Asterisk с целью выявления и блокировки адресов, с которых производилось много попыток неудачных регистрации.
4. В плане нумерации вы пропустили _ и удивляетесь тому, что звонки не идут
Довольно простая ошибка, но часто встречается среди начинающих.
Неправильно
[citycalls]
exten => XXXXXX,1,Dial(DAHDI/g1/${EXTEN})
Правильно
[citycalls]
exten => _XXXXXX,1,Dial(DAHDI/g1/${EXTEN})
В первом случае вы задали не шаблон, а звонок на номер XXXXXX (икс-икс-икс-икс-икс-икс). Просто не забывайте, что шаблоны задаются символом _
5. Вы используете nat и звук проходит только в одну сторону
Тема работы Asterisk и абонентов, между которыми в разных конфигурациях существует трансляция адресов настолько обширна, что выходит за рамки этой статьи, но все же дам несколько полезных советов:
- Если нет звука, возьмите лист бумаги и изобразите как ходит трафик (не только SIP, но и RTP) между клиентами. Уже на этом шаге можно многое понять, особенно если вы знаете как работает NAT.
- Если клиенты потенциально находятся за натом, не давайте им делать reinvite (canreinvite=no в соответствующей секции sip.conf) и установите directmedia=nonat, если вам не нужно прохождение всего трафика через Asterisk, что может потребоваться для записи разговоров.
- Выберите что-нибудь одно — поддержку nat в Asterisk или поддержку SIP в брэндмауэре вашей ОС: в Windows ISA Server поддержка SIP, включенная параллельно поддержке nat в Asterisk, дает полное отсутствие звука, поэтому если не можете повлиять на ОС, задавайте nat=no в соответствующих секциях sip.conf
- Помните, что кроме трафика на порту 5060/udp, аудио данные передаются по протоколу RTP через udp порты, диапазон которых указан в rtp.conf (по умолчанию 100005) -20000)
- Если ничего не помогает, включайте debug в Asterisk и используйте tcpdump — это позволит вам увидеть куда уходят запросы и аудио-трафик, а понимание проблемы это 90% её решения.
Удачи в освоении Asterisk!
Автор: getccna