[Serusers] Problem with PSTN calls from Asterisk towards SIP clients registered in SER

Max Weltz max at opticall.se
Wed Oct 10 14:10:04 CEST 2007



     Hello,

   I am working on a project in which calls are placed from an  
Asterisk server towards the PSTN or SIP clients and then connected to  
another phone of the PSTN or another SIP client. Those calls are  
placed by a user (caller) through an interface. First a call is  
placed towards the caller from an extension in Asterisk and once the  
caller picks up the phone, the second call is placed and both are  
connected.

   In a first time all SIP clients were registered to Asterisk and  
there was no SER on the picture. Everything was working fine. But I  
have decided to use SER as SIP proxy now. So the SIP clients are  
registered with SER and Asterisk is still the originating point of  
all calls and provides the connection to the PSTN. Asterisk and SER  
are running on the same machine (Asterisk has port 5061 and SER port  
5060) and Asterisk is registered to SER:

==sip.conf==

[general]
port=5061
bindport=5061
bindaddr=0.0.0.0
disallow=all
;allow=gsm
allow=ulaw
allow=alaw
;context=bogon-calls
context=from-sip
autocreatepeer=yes

register=> asterisk:password at 192.168.1.24:5060/maxAS

[SERADDRESS]
type=friend
username=asterisk
secret=password
host=192.168.1.24
fromdomain=192.168.1.24

[maxAS]
type=friend
secret=password2
qualify=yes
nat=no
host=dynamic
canreinvite=no
context=from-sip


   Most things work fine:
* a user can ask Asterisk to call a SIP client and connect it to  
another SIP client: Asterisk finds its way to SER and both calls are  
happily connected.
* a user can also ask a call to be placed towards a SIP client and  
then this call is connected to a PSTN call, no problem either.

The problem is when the user wants a call towards the PSTN to be  
connected to a SIP client. Once the call going towards the PSTN has  
been answered, Asterisk attempts to contact a SIP client which is  
registered in SER but SER sees the call coming from "sip:(PSTN phone  
number of the first call)@hostIP". There is no such client in the  
database and it is therefore not allowed to connect. In the following  
example Zap/1-1 is the interface towards the PSTN, 0761111111 the  
phone number dialled, and 6644 an extension registered with SER. Here  
is the Asterisk output.

     > Channel Zap/1-1 was answered.
     -- Executing Answer("Zap/1-1", "") in new stack
     -- Executing Goto("Zap/1-1", "from-sip|6644|1") in new stack
     -- Goto (from-sip,6644,1)
     -- Executing Answer("Zap/1-1", "") in new stack
     -- Executing Dial("Zap/1-1", "SIP/6644 at SERADDRESS||r") in new stack
     -- Called 6644 at SERADDRESS
Oct 10 11:41:16 WARNING[4264]: chan_sip.c:7972 handle_response:  
Forbidden - wrong password on authentication for INVITE to  
'"0761111111" <sip:0761111111 at 192.168.1.24>;tag=as537d1ed7'
     -- SIP/SERADDRESS-50e7 is circuit-busy

Here is the portion of the Asterisk Dialplan that is relevant and the  
ser.cfg (which comes from http://siprouter.onsip.org/doc/ 
gettingstarted/):

==extensions.conf==
[context1]
exten => 666,1,Answer()
exten => 666,2,Goto(from-sip,6644,1)

[from-sip]
exten => _.,1,Answer
exten => _.,2,Dial(SIP/${EXTEN}@SERADDRESS,,r)
exten => _.,3,Hangup

==ser.cfg==
debug=3
fork=no
log_stderror=yes

listen=192.168.1.24   # INSERT YOUR IP ADDRESS HERE
port=5060
children=4

dns=no
rev_dns=no
fifo="/tmp/ser_fifo"
fifo_db_url="mysql://ser:password@192.168.1.26/ser"

loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so"
loadmodule "/usr/lib/ser/modules/tm.so"
loadmodule "/usr/lib/ser/modules/rr.so"
loadmodule "/usr/lib/ser/modules/maxfwd.so"
loadmodule "/usr/lib/ser/modules/usrloc.so"
loadmodule "/usr/lib/ser/modules/registrar.so"
loadmodule "/usr/lib/ser/modules/auth.so"
loadmodule "/usr/lib/ser/modules/auth_db.so"
loadmodule "/usr/lib/ser/modules/uri_db.so"

modparam("auth_db|uri_db|usrloc", "db_url", "mysql:// 
ser:password at 192.168.1.26/ser")
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
modparam("usrloc", "db_mode", 2)
modparam("rr", "enable_full_lr", 1)

route {

   # -----------------------------------------------------------------
   # Sanity Check Section
   # -----------------------------------------------------------------
   if (!mf_process_maxfwd_header("10")) {
     sl_send_reply("483", "Too Many Hops");
     break;
   };

   if (msg:len > max_len) {
     sl_send_reply("513", "Message Overflow");
     break;
   };

   # -----------------------------------------------------------------
   # Record Route Section
   # -----------------------------------------------------------------
   if (method!="REGISTER") {
     record_route();
   };

   # -----------------------------------------------------------------
   # Loose Route Section
   # -----------------------------------------------------------------
   if (loose_route()) {
     route(1);
     break;
   };

   # -----------------------------------------------------------------
   # Call Type Processing Section
   # -----------------------------------------------------------------
   if (uri!=myself) {
     route(1);
     break;
   };

   if (method=="ACK") {
     route(1);
     break;
   } if (method=="INVITE") {
     route(3);
     break;
   } else  if (method=="REGISTER") {
     route(2);
     break;
   };

   lookup("aliases");
   if (uri!=myself) {
     route(1);
     break;
   };


   if (!lookup("location")) {
     sl_send_reply("404", "User Not Found");
     break;
   };

   route(1);
}

route[1] {

   # -----------------------------------------------------------------
   # Default Message Handler
   # -----------------------------------------------------------------
   if (!t_relay()) {
     sl_reply_error();
   };
}

route[2] {

   # -----------------------------------------------------------------
   # REGISTER Message Handler
   # ----------------------------------------------------------------
   sl_send_reply("100", "Trying");

   if (!www_authorize("192.168.1.24","subscriber")) {
     www_challenge("192.168.1.24","0");
     break;
   };

   if (!check_to()) {
     sl_send_reply("401", "Unauthorized");
     break;
   };

   consume_credentials();

   if (!save("location")) {
     sl_reply_error();
   };
}

route[3] {
   # -----------------------------------------------------------------
   # INVITE Message Handler
   # -----------------------------------------------------------------
   if (!proxy_authorize("192.168.1.24","subscriber")) {
     proxy_challenge("192.168.1.24","0");
     break;
   } else if (!check_from()) {
     sl_send_reply("403", "Use From=ID");
     break;
   };

   consume_credentials();

   lookup("aliases");
   if (uri!=myself) {
     route(1);
     break;
   };

   if (!lookup("location")) {
     sl_send_reply("404", "User Not Found");
     break;
   };

   route(1);
}


I guess (but I am new to SER) that the idea is to make the call be  
placed as the SIP user "asterisk" and not as the SIP user  
"0761111111" but I don't know where to do that (inside asterisk  
before the SIP call is placed? inside ser.cfg?) or maybe just to skip  
the authentication for SIP URIs that look like a phone number. I also  
read in http://siprouter.onsip.org/doc/gettingstarted/ch09.html how  
to relay calls placed towards the PSTN from SER towards a gateway  
(Asterisk here) but I think it wouldn't do any good to send back the  
call to Asterisk. Asterisk would just end up placing another call  
towards the PSTN and that's not what I want.

Any suggestion will be greatly appreciated,

Thanks,

//Max



More information about the sr-users mailing list