Страница 1 из 2

Не проходят внутренние звонки между пирами Opensips

Добавлено: 28 фев 2015, 10:42
shaverdoff
Всем коллегам доброго дня.
Имеется Opensips 1.6.2/Asterisk 11 cert2/MysqlDB/Openvpn Server. Всего 4 сервера.
Opensips Регистрир, Агент присутствия и сообщений/ Asterisk Транки и диалплан/ MysqlDB Самособой держит базы для Opensips и Asterisk.
Openvpn из названия - Вход в локальную сеть где все эти сип сервера крутятся.
При подключении пользователей через впн на Opensips нет возможности звонить друг другу на короткие номера. По дебагу сипа звонки уходят на айпиадрес точки подключения клиента а дальше тишина. Звонки на ружу через транки идут успешно. Если подключаться к сети напрямую (вайфай) то звонки между собой на внутренние короткие номера проходят. Если убрать из схемы Opensisp и оставить чистый астериск то через впн и напрямую внутренние звонки совершаются. и при дебаге сипа точно так же звонок уходит на айпиадрес точки подключения клиента.

Внутренние звонки обрабатывает и отправляет на asterisk через функцию rewritehostport opensips.


Серия номеров 5 значная
192.168.5.16 - opensisp
192.168.5.8 - asterisk
192.168.5.4 MysqlDB

conf opensips

Код: Выделить всё

route                                                                                                                                                                           
{                                                                                                                                                                               
                                                                                                                                                                                
######## количество прыжков                                                                                                                                                     
        if (!mf_process_maxfwd_header("10"))                                                                                                                                    
        {                                                                                                                                                                       
            sl_send_reply("483","Too Many Hops");                                                                                                                               
            exit;                                                                                                                                                               
        }                                                                                                                                                                       
                                                                                                                                                                                
######## слишком большое сообщение                                                                                                                                              
        if (msg:len >=  2048 )                                                                                                                                                  
        {                                                                                                                                                                       
            sl_send_reply("513", "Message too big");                                                                                                                            
            exit;                                                                                                                                                               
        }                                                                                                                                                                       
                                                                                                                                                                                
        if (has_totag())                                                                                                                                                        
        {                                                                                                                                                                       
            if (loose_route())                                                                                                                                                  
            {                                                                                                                                                                   
                if (is_method("BYE"))                                                                                                                                           
                {                                                                                                                                                               
                    setflag(1); # do accounting ...                                                                                                                             
                    setflag(3); # ... even if the transaction fails                                                                                                             
                }                                                                                                                                                               
                else if (is_method("INVITE"))                                                                                                                                   
                {                                                                                                                                                               
                    record_route();                                                                                                                                             
                }                                                                                                                                                               
                route(1);                                                                                                                                                       
                }                                                                                                                                                               
                    if ( is_method("ACK") )                                                                                                                                     
                    {                                                                                                                                                           
                        if ( t_check_trans() )                                                                                                                                  
                        {                                                                                                                                                       
                            t_relay();                                                                                                                                          
                            exit;                                                                                                                                               
                        }                                                                                                                                                       
                    else                                                                                                                                                        
                    {                                                                                                                                                           
                            exit;                                                                                                                                               
                    }                                   
                   }                                                                                                                                                           
                        sl_send_reply("404","Not here");                                                                                                                        
                }                                                                                                                                                               
                exit;                                                                                                                                                           
        }                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                
######## обработка отмены                                                                                                                                                       
        # CANCEL processing                                                                                                                                                     
        if (is_method("CANCEL"))                                                                                                                                                
        {                                                                                                                                                                       
            if (t_check_trans())                                                                                                                                                
            t_relay();                                                                                                                                                          
            exit;                                                                                                                                                               
        }                                                                                                                                                                       
        t_check_trans();                                                                                                                                                        
                                                                                                                                                                                
#initial requests                                                                                                                                                               
                                                                                                                                                                                
        if (!method=="REGISTER")                                                                                                                                                
                record_route();                                                                                                                                                 
                                                                                                                                                                                
        if (loose_route()) {                                                                                                                                                    
                append_hf("P-hint: rr-enforced\r\n");                                                                                                                           
                route(1);                                                                                                                                                       
        }                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                             
        if (!is_uri_host_local())                                                                                                                                               
            {                                                                                                                                                                   
                if(is_from_local())                                                                                                                                             
                {                                                                                                                                                               
                append_hf("P-hint: outbound\r\n");                                                                                                                              
                                                                                                                                                                                
                    route(1);                                                                                                                                                   
                }                                                                                                                                                               
                else                                                                                                                                                            
                {                                                                                                                                                               
                    sl_send_reply("403","Not here");                                                                                                                            
                }                                                                                                                                                               
            }                                                                                                                                                                   
                                                                                                                                                                                
        if (!uri==myself)                                                                                                                                                       
        {                                                                                                                                                                       
            if(from_uri==myself) {                                                                                                                                              
                append_hf("P-hint: outbound\r\n");                                                                                                                              
                route(1);                                                                                                                                                       
            }                                                                                                                                                                   
            else                                                                                                                                                                
            {                                                                                                                                                                   
                sl_send_reply("403","You are not here");                                                                                                                        
            }                                                                                                                                                                   
        }                      
 if (uri==myself)                                                                                                                                                        
        {                                                                                                                                                                       
                                                                                                                                                                                
######## Пуликация присутсвтия                                                                                                                                                  
            if(is_method("PUBLISH|SUBSCRIBE"))                                                                                                                                  
            route(presence);      
                                                                                                                                                                                                                                                                                             
######## Авторизация по логину паролю взятые простым тесктом из базы и запись                                                                                                   
            if (method=="REGISTER")                                                                                                                                             
            {                                                                                                                                                                   
                # Uncomment this if you want to use digest authentication                                                                                                       
                if (!www_authorize("", "subscriber")) {                                                                                                                         
                        www_challenge("", "1");                                                                                                                                 
                        exit;                                                                                                                                                   
                }                                                                                                                                                               
                if (!db_check_to())                                                                                                                                             
                {                                                                                                                                                               
                    sl_send_reply("403","forbidden auth ID");                                                                                                                   
                }                                                                                                                                                               
                if(!save("location"))                                                                                                                                           
                    sl_reply_error();                                                                                                                                           
                    exit;                                                                                                                                                       
            }                                                                                                                                                                   
                                                                                                                                                                                
                                                                                                                                                                                
            if (is_method("INVITE"))                                                                                                                                            
            {                                                                                                                                                                   
                setflag(1); # do accounting                                                                                                                                     
                if (!uri=~"sip:\*\*")                                                                                                                                           
                {                                                                                                                                                               
                    route(toasterisk);                                                                                                                                          
                }                                                                                                                                                               
                else                                                                                                                                                            
                {                                                                                                                                                               
                    strip(2);                                                                                                                                                   
                }                                                                                                                                                               
            }                                                                                                                                                                   
                                                                                                                                                                                
                alias_db_lookup("dbaliases");                                                                                                                                   
                                                                                                                                                                                
                if (!lookup("location","m"))                                                                                                                                    
                {                                                                                                                                                               
                    switch ($retcode)                                                                                                                                           
                    {                                                                                                                                                           
                        case -1:                                                                                                                                                
                        case -3:                                                                                                                                                
                            t_newtran();                                                                                                                                        
                            t_reply("404", "Not Found");                                                                                                                        
                            exit;                                                                                                                                               
                        case -2:                                                                                                                                                
                            sl_send_reply("405","Method not Allowed");                                                                                                          
                            exit;                                                                                                                                               
                    }                                                                                                                                                           
                }                                                                                                                                                               
                append_hf("P-hint: usrloc applied\r\n");                                                                                                                        
        } ### конец if (uri==myself) ########                                                                                                                                   
                                                                                                                                                                                
######## обработка неполных адресов                                                                                                                                             
        if ($rU==NULL) {                                                                                                                                                        
            sl_send_reply("484","Address Incomplite");                                                                                                                          
        }   
        setflag(2);                                                                                                                                                             
                                                                                                                                                                                
        t_on_failure("1");                                                                                                                                                      
                                                                                                                                                                                
        route(1);                                                                                                                                                               
}                                                                                                                                                                               
route[1]                                                                                                                                                                        
{                                                                                                                                                                               
          if (!t_relay())                                                                                                                                                             
    {                                                                                                                                                                           
        sl_reply_error();                                                                                                                                                       
    }                                                                                                                                                                           
        exit;                                                                                                                                                                   
}                                                                                                                                                                               
                                                                                                                                                                                
# presence handling route                                                                                                                                                       
route[presence]                                                                                                                                                                 
{                                                                                                                                                                               
    # absorb retransmissions                                                                                                                                                    
    if (! t_newtran())                                                                                                                                                          
    {                                                                                                                                                                           
        sl_reply_error();                                                                                                                                                       
        exit;                                                                                                                                                                   
    }                                                                                                                                                                           
                                                                                                                                                                                
        #handle presence requests                                                                                                                                               
    if(is_method("PUBLISH"))                                                                                                                                                    
    {                                                                                                                                                                           
        if($hdr(Sender)!= NULL)                                                                                                                                                 
        {                                                                                                                                                                       
            handle_publish("$hdr(Sender)");                                                                                                                                     
        }                                                                                                                                                                       
        else                                                                                                                                                                    
        {                                                                                                                                                                       
            handle_publish();                                                                                                                                                   
            #t_release();                                                                                                                                                       
        }                                                                                                                                                                       
    }                                                                                                                                                                           
    else                                                                                                                                                                        
    if(is_method("SUBSCRIBE"))                                                                                                                                                  
    {                                                                                                                                                                           
        handle_subscribe();                                                                                                                                                     
        #t_release();                                                                                                                                                           
    }                                                                                                                                                                           
        exit;                                                                                                                                                                   
}   

# asterisk services                                                                                                                                                             
route[toasterisk]                                                                                                                                                               
{                                                                                                                                                                               
    xlog("forwarding to asterisk\n");                                                                                                                                           
    # to asterisk                                                                                                                                                               
    rewritehostport("192.168.5.8:5060");                                                                                                                                        
    if (!t_relay())                                                                                                                                                             
    {                                                                                                                                                                           
        sl_reply_error();                                                                                                                                                       
    }                                                                                                                                                                           
        exit;                                                                                                                                                                   
}                                                                                                                                                                               
                                                                                                                                                                                
failure_route[1]                                                                                                                                                                
{                                                                                                                                                                               
    if (t_was_cancelled())                                                                                                                                                      
    {                                                                                                                                                                           
        exit;                                                                                                                                                                   
    }                                                                                                                                                                           
        # if the failure code is "408 - timeout" or "486 - busy",                                                                                                               
        # forward the calls to voicemail recording                                                                                                                              
        if (t_check_status("486|408"))                                                                                                                                          
        {                                                                                                                                                                       
            xlog("L_INFO", "failure_route - call forward to Voice Mail - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");                                                          
            rewritehostport("192.168.5.8:5060");                                                                                                                                
            #prefix("VMR_");                                                                                                                                                    
            #t_relay();                                                                                                                                                         
            exit;                                                                                                                                                               
        }                                                                                                                                                                       
}              



конфиг asterisk

Код: Выделить всё

exten => _1XXXX,1,Dial(SIP/**${EXTEN}@192.168.5.16,25)                                                                                                                          
same => n,Macro(voicemail,${$EXTEN}@jewy)                                                                                                                                       
same => n,HangUp

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 01 мар 2015, 12:15
Samael28
Лучше перенаправлять через $du.
Потом смотрите... У Вас все юзеры имеют адрес <username>@<opensips>. Но реальные адреса же другие. Почитайте, что такое usrloc и registrar, точнее функция location.
Вообще, при работе с opensips рекомендую вооружаться wireshark и смотреть-смотреть трейсы. Ну и увешать скрипт логированием.

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 01 мар 2015, 19:17
shaverdoff
странность то вся в том что в локальной сети если клиенты то внутренние звонки осуществляются..... а через впн нет

что за $du?
я как то не правильно location использую??

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 01 мар 2015, 20:07
Vlad1983
смотрите что в заголовках SIP

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 20:18
shaverdoff
#osipsconsole вот что говорит..... первый юзер 10000 с адресом точки впн... а должен быть айпи адрес впн сервера... не пойму как так получается.... если обычный астериск показывает адреса впн сервера при sip show peers

Domain:: location table=512 records=2
AOR:: 10000
Contact:: sip:10000@10.10.200.14:60119;ob Q=
Expires:: 889
Callid:: PRZv-i9gfuOv0cZ3KsjQFkmGNkPVI8pX
Cseq:: 49126
User-agent:: Bria iOS 3.3.4
State:: CS_DIRTY
Flags:: 0
Cflag:: 0
Socket:: udp:192.168.5.16:5060
Methods:: 8063
AOR:: 10001
Contact:: sip:10001@192.168.5.100:50884;ob Q=
Expires:: 575
Callid:: gJ8zxmAqh91u2-GjGG8MIMTgfsApwWOt
Cseq:: 1860
User-agent:: Bria iOS 3.3.4
State:: CS_SYNC
Flags:: 0
Cflag:: 0
Socket:: udp:192.168.5.16:5060
Methods:: 8063

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 21:20
shaverdoff

Код: Выделить всё

U 192.168.5.31:14232 -> 192.168.5.16:5060
SUBSCRIBE sip:10000@opensips.jewy.me SIP/2.0.
Via: SIP/2.0/UDP 10.10.200.14:58649;rport;branch=z9hG4bKPjVTb6LSMvoWHB2yOE2McCO90UChvFzrGC.
Max-Forwards: 70.
From: "Gerasim" <sip:10000@opensips.jewy.me>;tag=Tda6dROCVytF43LuNwlwXUgJSo702bd9.
To: "Gerasim" <sip:10000@opensips.jewy.me>.
Contact: "Gerasim" <sip:10000@10.10.200.14:58649;ob>.
Call-ID: svFcTaNCjkP2gKo88kJCHnBIn-BXeQfn.
CSeq: 1558 SUBSCRIBE.
Event: message-summary.
Expires: 3600.
Supported: replaces, 100rel, timer, norefersub.
Accept: application/simple-message-summary.
Allow-Events: presence, message-summary, refer.
User-Agent: Bria iOS 3.3.4.
Content-Length:  0.
почему обращение идет с нужного айпи а в поле VIA: SIP идет айпи адрес точки впн? куда ж еще капнуть то можно о usrloca почитал.. сайт опенсипс не изобилует подробностями.... модуля location вообще в описании не нашел 192.168.5.31 это локальный адрес впн сервера который наружу смотрит :(((

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 21:21
shaverdoff
а вот локальный клиент стучится

Код: Выделить всё

U 192.168.5.100:50884 -> 192.168.5.16:5060
SUBSCRIBE sip:10001@opensips.jewy.me SIP/2.0.
Via: SIP/2.0/UDP 192.168.5.100:50884;rport;branch=z9hG4bKPj815M2yncTvyilFutcAggA4c6IeQ2Bb5y.
Max-Forwards: 70.
From: "Gerasim" <sip:10001@opensips.jewy.me>;tag=lMG28.L1syDQrrlP0j1iA5UHzKf2QDrN.
To: "Gerasim" <sip:10001@opensips.jewy.me>.
Contact: "Gerasim" <sip:10001@192.168.5.100:50884;ob>.
Call-ID: 04OcG1zGmBl268KH2t71qvk3fDn7a6Rn.
CSeq: 11935 SUBSCRIBE.
Event: message-summary.
Expires: 3600.
Supported: replaces, 100rel, timer, norefersub.
Accept: application/simple-message-summary.
Allow-Events: presence, message-summary, refer.
User-Agent: Bria iOS 3.3.4.
Content-Length:  0.

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 21:42
shaverdoff
вот выхлоп обычной астериск и двух клиентов - так же один локально другой по опенвпн сидит и цепляется... звонки туда обратно идут.

Код: Выделить всё

U 192.168.5.31:52203 -> 192.168.5.7:5060                                                                               
REGISTER sip:sip.jewy.me SIP/2.0.                                                                                      
Via: SIP/2.0/UDP 10.10.200.14:58649;rport;branch=z9hG4bKPjJbYL9U9QpA97UuNUf0MCCo8vRkcBmRHZ.                            
Max-Forwards: 70.                                                                                                      
From: "gerasim" <sip:1000@sip.jewy.me>;tag=YGiLWt68EMpLjyLKTVGb-vuxO3mglLZo.                                           
To: "gerasim" <sip:1000@sip.jewy.me>.                                                                                  
Call-ID: UxC..o3ZNNnR-h0Y8BW3u-g4x6l4YooG.                                                                             
CSeq: 29886 REGISTER.                                                                                                  
User-Agent: Bria iOS 3.3.4.                                                                                            
Supported: outbound, path.                                                                                             
Contact: "gerasim" <sip:1000@10.10.200.14:58649;ob>;reg-id=1;+sip.instance="<urn:uuid:67D3EDBD59AF84F60A0D1A49366369F4E
Expires: 900.                                                                                                          
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS.                      
Content-Length:  0. 

Код: Выделить всё

U 192.168.5.100:50884 -> 192.168.5.7:5060                                                                              
REGISTER sip:sip.jewy.me SIP/2.0.                                                                                      
Via: SIP/2.0/UDP 192.168.5.100:50884;rport;branch=z9hG4bKPjSTqIhzoCdZ05MY61dF3IQszDWS.oVVMr.                           
Max-Forwards: 70.                                                                                                      
From: <sip:1003@sip.jewy.me>;tag=MSklStH7CV8AUTZQvV9eru1AcB5xEMZd.                                                     
To: <sip:1003@sip.jewy.me>.                                                                                            
Call-ID: J3QTMOECTSUZigdQLCCLD5khwQIbSg.z.                                                                             
CSeq: 10182 REGISTER.                                                                                                  
User-Agent: Bria iOS 3.3.4.                                                                                            
Supported: outbound, path.                                                                                             
Contact: <sip:1003@192.168.5.100:50884;ob>;reg-id=1;+sip.instance="<urn:uuid:30732414-CF28-412D-A87B-3B2918B4FA39>".   
Expires: 900.                                                                                                          
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS.                      
Content-Length:  0.                                                                                                    

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 21:48
ded
Resume: на Астериске клиенты NAT обрабатываются правильно, а на OpenSIPS - неправильно.

Re: Не проходят внутренние звонки между пирами Opensips

Добавлено: 20 июн 2015, 23:23
shaverdoff
как быть в той ситуации. поднять на опенсипсе натхелпер? или переходить на 2/0 версию? не ужели ни у кого подобных типов подключений и таких ситуаций не происходило?