Грабли, или 5 типичных ошибок настройки Asterisk



    Статья ориентирована на начинающих пользователей 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 и абонентов, между которыми в разных конфигурациях существует трансляция адресов настолько обширна, что выходит за рамки этой статьи, но все же дам несколько полезных советов:

    1. Если нет звука, возьмите лист бумаги и изобразите как ходит трафик (не только SIP, но и RTP) между клиентами. Уже на этом шаге можно многое понять, особенно если вы знаете как работает NAT.
    2. Если клиенты потенциально находятся за натом, не давайте им делать reinvite (canreinvite=no в соответствующей секции sip.conf) и установите directmedia=nonat, если вам не нужно прохождение всего трафика через Asterisk, что может потребоваться для записи разговоров.
    3. Выберите что-нибудь одно — поддержку nat в Asterisk или поддержку SIP в брэндмауэре вашей ОС: в Windows ISA Server поддержка SIP, включенная параллельно поддержке nat в Asterisk, дает полное отсутствие звука, поэтому если не можете повлиять на ОС, задавайте nat=no в соответствующих секциях sip.conf
    4. Помните, что кроме трафика на порту 5060/udp, аудио данные передаются по протоколу RTP через udp порты, диапазон которых указан в rtp.conf (по умолчанию 100005) -20000)
    5. Если ничего не помогает, включайте debug в Asterisk и используйте tcpdump — это позволит вам увидеть куда уходят запросы и аудио-трафик, а понимание проблемы это 90% её решения.


    Удачи в освоении Asterisk!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 26

      0
      Пользуясь случаем и темой хотел бы узнать как отправить данные на сервер SIP? Пользуюсь программой Empathy в Ubuntu, оператор SIP — Мегафон (Мультифон). В стандартной Виндовской программе Мультифона есть пункт «Принимать звонки» на Телефон, Мультифон или на Телефон и Мультифон. А по умолчанию при подключении к SIP у Мегафона указана «Принимать звонки» на телефон.
        0
        Wireshark и исходники Empathy в помощь
        +2
        6. Реализовывая голосовое меню (донабор добавочного номера), вы разрешаете набирать в том числе и внешние номера (номерные емкости прозваниваются на предмет возможности донабора номера)
        7. Дорогие (МН) направления доступны в том числе и тем, кому они не нужны (по-умолчанию лучше их вообще отключать у провайдера связи от греха подальше)
        8. Вы разрешили перевод звонка (опции t и T в Dial() ) через features.conf для удаленных абонентов (со стороны ТфОП)
        9. Вы настроили ACL, но не настроили iptables
        10. Вы настроили iptables, но не настроили ACL.
        11. Вы настроили ACL и iptables, но на вашем сервере не стоит fail2ban с правилами для asterisk
          0
          12. Вы не используете опцию call-limit на SIP-пире или выставляете ее больше реальных возможностей устройства, которое будет на ней регистрироваться.
          13. Названия SIP-пир совпадают с их номером
            0
            > 13. Названия SIP-пир совпадают с их номером

            Упс. Я это делаю. Чем грозит?
              0
              Ну, во-первых, очевидно, что юзернеймы вида 101, 102, 103,… злоумышленник будет подбирать первым делом. Конечно, это несколько наивный подход, но, с учетом того, что каждая неудачная попытка играет против злоумышленника, оно того стоит.

              Во-вторых, есть тонкость, связанная с тем, как asterisk авторизует пиры. Признаться, я прямо сейчас не готов привести сценарий, в котором возникают проблемы в этом случае — он достаточно экзотичный, но, тем не менее, я стараюсь избегать такого.
                +1
                хм, это разве будет актуально при жестких acl и iptables и однозначной привязке номера к ip?
                  0
                  Ну, оно, конечно, излишне, однако в ситуации, когда за выходные через взломанный сервер может улететь трафика стоимостью, сопоставимой с годовой зарплатой его админа (случай из практики), достаточно трудно перестараться, не правда ли? :) Особенно если учесть, что никаких дополнительных телодвижений это, по сути не потребует, особенно с provisioning.

                  Ну и потом, никогда нельзя застраховаться от случаем, когда acl прописать забыли или ошиблись, iptables непостижимым образом оказались остановлены и т.д. VoIP в публичном интернете это реально война и спасает только глубокое эшелонирование обороны :)
                    0
                    ну с последним полностью согласен, так что делюсь:
                    acl и iptables генерируется автоматом. есть конечно ext вписанные вручную, но ручная правка конфигов при регулярной работе — удаление и добавление пользователя, изменение его параметров полностью исключена
                    в zabbix на iptables спец правило ( в агенте пинг на второй адрес zabbix-а и запрет пинга на него в iptables), так что выключение генерирует аварию

                    И есть ли тулза/скрипт, позволяющая находить и банить взломанных пользователей? типа
                    — лимитировать количество подключений с разных сетей
                    — лимитировать время и количество направлений
                    Такая политика успешно работала на порно серверах, где часто брутфорсили, а юзеры упорно ставили крайне простые пароли типа 123. А то бывало купят анлим и публикуют на форуме логин и пасс.
                      0
                      Насчет времени и направлений это, скорей, задача биллинга, нежели АТС. У нас, например, биллинг отслеживает резкое возрастание количества звонков на дорогие направления и высылает уведомление; плюс разумный дневной лимит по расходам на абонента, когда он заканчивается — бан и разбирательство.
            0
            7. По поводу МН направлений есть еще такая хитрая штука, что разрешив только +7 вы не ограничиваетесь Россией, внезапно Казахстан тоже +7.
            Было дело злоумышленники сбрутили пароль на одного из юзеров и похоже подцепили атску к какому-то своему шлюзу где шли всякие разные звонки в Казахстан, именно это МН направление интересовало. Наверное знают распространенную дыру в конфигах такую.
            Забавно было потом звонки послушать, благо call-limit не дал особо разорить контору ))
            0
            Спасибо за статью.
            Подскажите, плз.
            В trixbox по умолчанию анонимные звонки запрещены, тем неменее разрдажают вот такие деятели:
            log
            [Nov 5 16:51:04] VERBOSE[5489] logger.c: — Executing [s@from-sip-external:1] GotoIf(«SIP/XXX.XX.XX.X-0000009b», «0?from-trunk,5500972592264762,1») in new stack
            [Nov 5 16:51:06] VERBOSE[5490] logger.c: — Executing [55500972592264762@from-sip-external:1] NoOp(«SIP/XXX.XX.XX.X-0000009c», «Received incoming SIP connection from unknown peer to 55500972592264762») in new stack
            [Nov 5 16:51:06] VERBOSE[5490] logger.c: — Executing [55500972592264762@from-sip-external:2] Set(«SIP/XXX.XX.XX.X-0000009c», «DID=55500972592264762») in new stack
            [Nov 5 16:51:06] VERBOSE[5490] logger.c: — Executing [55500972592264762@from-sip-external:3] Goto(«SIP/XXX.XX.XX.X-0000009c», «s,1») in new stack
            [Nov 5 16:51:06] VERBOSE[5490] logger.c: — Executing [s@from-sip-external:1] GotoIf(«SIP/XXX.XX.XX.X-0000009c», «0?from-trunk,55500972592264762,1») in new stack
            [Nov 5 16:51:07] VERBOSE[5491] logger.c: — Executing [555500972592264762@from-sip-external:1] NoOp(«SIP/XXX.XX.XX.X-0000009d», «Received incoming SIP connection from unknown peer to 555500972592264762») in new stack
            [Nov 5 16:51:07] VERBOSE[5491] logger.c: — Executing [555500972592264762@from-sip-external:2] Set(«SIP/XXX.XX.XX.X-0000009d», «DID=555500972592264762») in new stack
            [Nov 5 16:51:07] VERBOSE[5491] logger.c: — Executing [555500972592264762@from-sip-external:3] Goto(«SIP/XXX.XX.XX.X-0000009d», «s,1») in new stack
            [Nov 5 16:51:07] VERBOSE[5491] logger.c: — Executing [s@from-sip-external:1] GotoIf(«SIP/XXX.XX.XX.X-0000009d», «0?from-trunk,555500972592264762,1») in new stack
            [Nov 5 16:51:48] VERBOSE[5533] logger.c: — Executing [5555500972592264762@from-sip-external:1] NoOp(«SIP/XXX.XX.XX.X-000000ad», «Received incoming SIP connection from unknown peer to 5555500972592264762») in new stack
            [Nov 5 16:51:48] VERBOSE[5533] logger.c: — Executing [5555500972592264762@from-sip-external:2] Set(«SIP/XXX.XX.XX.X-000000ad», «DID=5555500972592264762») in new stack
            [Nov 5 16:51:48] VERBOSE[5533] logger.c: — Executing [5555500972592264762@from-sip-external:3] Goto(«SIP/XXX.XX.XX.X-000000ad», «s,1») in new stack
            [Nov 5 16:51:48] VERBOSE[5533] logger.c: — Executing [s@from-sip-external:1] GotoIf(«SIP/XXX.XX.XX.X-000000ad», «0?from-trunk,5555500972592264762,1») in new stack
            [Nov 5 16:52:07] VERBOSE[5552] logger.c: — Executing [50000972592264762@from-sip-external:1] NoOp(«SIP/XXX.XX.XX.X-000000b5», «Received incoming SIP connection from unknown peer to 50000972592264762») in new stack
            [Nov 5 16:52:07] VERBOSE[5552] logger.c: — Executing [50000972592264762@from-sip-external:2] Set(«SIP/XXX.XX.XX.X-000000b5», «DID=50000972592264762») in new stack
            [Nov 5 16:52:07] VERBOSE[5552] logger.c: — Executing [50000972592264762@from-sip-external:3] Goto(«SIP/XXX.XX.XX.X-000000b5», «s,1») in new stack


            То есть trix рубит эти звонки, но все равно раздражает.
            Какой самый простой и быстрый способ выяснить IP адрес такого дозвонщика?

              +1
              Добавьте в этот контекст Noop(SIP packet from ${SIPCHANINFO(recvip)}) и в логах будете видеть IP, с которого приходят пакеты. Можно автоматизировать бан таких хостов с помощью фильтра в fail2ban.

              А чтобы жизнь сахаром не казалась, можно перед Hangup() сделать Wait(60).
                0
                Спасибо большое!
              0
              Кстати, для поиска уязвимостей в вашей АТС, можно воспользоваться SIPVicious
                0
                Картинку к посту надо было перевернуть :)
                  0
                  Ага… И палку добавить… :)
                  0
                  + я бы еще если это внутренний VoIP не выпускал его наружу, как минимум — VPN или шлюзы у местных gsm, тогда останется только донабор…
                    0
                    А как оставить allowguest=yes чтобы могли нам звонить по внутренний_номер@ip но сбрасывать входящие типа +79112792211@ip?
                      0
                      Уточните, малость, свой вопрос. Вам нужно разрешить лишь локальные гостевые вызовы и блокировать возможность набирать город?
                        0
                        Чтобы не проходил трюк описанный в статье «любой желающий, отправивший запрос на номер_телефона@ваш_домен сможет за ваш счет позвонить по межгороду», но можно было звонить из интернета нашим внутренним абонентам по 666@8.8.4.4 например. Тоесть надо блокироваь возможность принимать звонки вида 79112792211@8.8.4.4
                        а то в логе появляются подозрительные строки Executing [+9810972549304353@from-sip-external:1] NoOp(«SIP/наш.ip-00000066», «Received incoming SIP connection from unknown peer to +9810972549304353») in new stack
                          0
                          Ну если я верно понял, то звонки приходят в контекст [from-sip-external]. Попробуйте добавить туда такого вида диалплан:

                          [from-sip-external]
                          ...
                          exten => _6XX,1,NoOp(Local Call Accepted)
                          same => n,Dial(...)
                          ...
                          exten => s,1,NoOp(Other Call Blocked)
                          same => n,Background(...)
                          same => n,Hangup(...)
                          
                            0
                            Я гостевые звонки напрочь блокирую. А для тех кто ломится:

                            [default]
                            exten => i,1,Answer() 
                            	same => n,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} -- \\"${CUT(INVALID_EXTEN,-,2)}\\" -- \\"${CALLERID(num)}\\" ==\\> \\"${CUT(INVALID_EXTEN,-,1)}\\" >> /var/log/asterisk/forbidden.log)
                            	same => n,Wait(1) 
                            	same => n,Playback(invalid) 
                            	same => n,Hangup()
                            
                              0
                              Либо посмотрите что выводят переменные ${EXTEN} и ${CALLERID(all)} при таких «гостевых» звонках. А там можно логикой рубить по условию.
                          0
                          sngrep очень помогает в диагностике
                            +1
                            getccna, а можете ответить на вопрос когда Asterisk находится за NAT, также настроен WAN Failover (https://youtu.be/MMu6BWNXgHA).
                            И при переключении провайдеров часть транков упорно не хочет регистрироваться через резервного провайдера?

                            PFSense----LAN----asterisk----IP-Phones
                            |
                            |----WAN1
                            |----WAN2


                            Ну конечно если сбросить кеш соединений на pfsense и перезагрузить asterisk — то все переключится на резевного провайдера. Но как-то хочется чтобы это автоматически переключалось.

                            Only users with full accounts can post comments. Log in, please.