[Asterisk-Users] Speaking of DS3s....

Terry Wilson otherwiseguy at gmail.com
Fri Feb 18 17:35:19 MST 2005


I would be very interested in the database table dumps, if you
wouldn't mind too much...


On Thu, 18 Nov 2004 23:45:46 -0600, Michael Shuler <mike at bwsys.net> wrote:
> SER is a stateless and/or stateless proxy.  SER by itself it not very useful
> but SER teamed with Asterisk is how you make Asterisk scale.  SER normally
> has nothing to do with the RTP stream.  Remember in the SIP world there are
> really 2 parts, 1 is the SIP messages and 2 is the RTP "voice" stream.  The
> SIP messages tell the 2 voice gateways (an ATA and a TNT for example) what
> codec, IP, port, etc. to pass the "voice" traffic on.
> 
> SER can be setup quite easily (after you get used to its config file) to
> handle simple STATELESS SIP message proxying.  Asterisk is a stateful proxy
> and is fully aware of the state of the call.  Asterisk is also considered to
> be a feature server, IVR, VM, etc. server.  But what Asterisk is most
> certainly not is a stateless proxy server.  In the IP world you can relate
> the job of a stateless proxy server to a IP router.  It knows what's
> attached to it and what path to send it.  It has no idea what is in what it
> is sending but it knows how to get it there.
> 
> At first this makes SER look quite inferior to Asterisk, but in reality they
> are very complimentary.
> 
> So below is some of my ser.cfg file that will give you an idea of how to
> make it work.  I originally wasn't going to disclose this but I've gotten
> about 100 emails on how to do this so I figure since the mailing lists
> helped me out when I first got started I might as well return the favor.
> IP's and stuff have been changed so substitute with your own.  Also, I do a
> lot of DB table combining to make life easier to SER and Asterisk share the
> same auth tables.  If you want them I can do a dump of the struct of my
> whole Asterisk DB.  Keep in mind its built for working with the res_data
> patch and SER.  Plain old Asterisk wont do any of this without the patch.
> Also, keep in mind I don't use the standard paths for install so my config
> points to non-standard places.  I also took out the SER register replication
> stuff because it made it way to confusing for your first time looking at a
> live config file.
> 
> AND, one final note about NAT.  SER handles NAT for the SIP messages but
> Asterisk handles NAT for the RTP packets.  It's a very odd setup but it will
> eliminate a point of failure if you tried to have SER run its mediaproxy or
> RTP portion of its nathelper module.  After all Asterisk insists on having
> the RTP stream go through it anyway.
> 
> I have no idea what res_config is but res_data does do it in real time.
> 
> ----------------------------------------
> 
> Michael Shuler
> 
> Ser.cfg:
> 
> debug=3         # debug level (cmd line: -dddddddddd)
> fork=yes
> log_stderror=no # (cmd line: -E)
> 
> # Uncomment these lines to enter debugging mode
> # debug=7
> # fork=no
> # log_stderror=yes
> 
> listen=123.123.123.123
> sip_warning=no
> 
> alias=ser
> alias=ser.mycompany.com
> alias=mycompany.com
> 
> advertised_address=123.123.123.123
> 
> reply_to_via=no
> check_via=no    # (cmd. line: -v)
> dns=no           # (cmd. line: -r)
> rev_dns=no      # (cmd. line: -R)
> port=5060
> children=4
> fifo="/tmp/ser_fifo"
> 
> # ------------------ module loading ----------------------------------
> 
> # Uncomment this if you want to use SQL database
> loadmodule "/software/ser/ser/lib/ser/modules/mysql.so"
> 
> loadmodule "/software/ser/ser/lib/ser/modules/sl.so"
> loadmodule "/software/ser/ser/lib/ser/modules/tm.so"
> loadmodule "/software/ser/ser/lib/ser/modules/rr.so"
> loadmodule "/software/ser/ser/lib/ser/modules/maxfwd.so"
> loadmodule "/software/ser/ser/lib/ser/modules/usrloc.so"
> loadmodule "/software/ser/ser/lib/ser/modules/registrar.so"
> loadmodule "/software/ser/ser/lib/ser/modules/nathelper.so"
> loadmodule "/software/ser/ser/lib/ser/modules/textops.so"
> loadmodule "/software/ser/ser/lib/ser/modules/xlog.so"
> 
> # Uncomment this if you want digest authentication
> # mysql.so must be loaded !
> loadmodule "/software/ser/ser/lib/ser/modules/auth.so"
> loadmodule "/software/ser/ser/lib/ser/modules/auth_db.so"
> 
> # ----------------- setting module-specific parameters ---------------
> 
> # -- usrloc params --
> # Flush every 60 sec
> modparam("usrloc", "db_mode", 1)
> modparam("usrloc", "db_url",
> "sql://Asterisk:Asterisk@mysql.mycompany.com/Asterisk")
> 
> # -- auth params --
> modparam("auth_db", "db_url",
> "sql://Asterisk:Asterisk@mysql.mycompany.com/Asterisk")
> modparam("auth_db", "user_column", "username")
> modparam("auth_db", "domain_column", "domain")
> modparam("auth_db", "calculate_ha1", 1)
> modparam("auth_db", "password_column", "password")
> 
> # -- replication auth param --
> modparam("auth", "secret", "mysecret")
> 
> # -- rr params --
> # add value to ;lr param to make some broken UAs happy
> modparam("rr", "enable_full_lr", 1)
> 
> # -------------------------  request routing logic -------------------
> 
> # main routing logic
> 
> route{
> 
>         # initial sanity checks -- messages with
>         # max_forwards==0, or excessively long requests
>         if (!mf_process_maxfwd_header("10")) {
>                 sl_send_reply("483","Too Many Hops");
>                 break;
>         };
>         if ( msg:len > max_len ) {
>                 sl_send_reply("513", "Message too big");
>                 break;
>         };
> 
>         # if(method != "REGISTER")
>         # {
>         #       xlog("L_INFO", "Got a %rm (URI = %ru) from %is");
>         # };
> 
>         # By default we are already responding to the learned IP:PORT that
> the message came from.
>         # This will properly fix the contact header.  Asterisk will fix the
> SDP (actually it learns it).
> 
>         force_rport();
>         fix_nated_contact();
> 
>         #
> ----------------------------------------------------------------------------
> --------------------
> 
>         # if the request is for other domain use UsrLoc
>         # (in case, it does not work, use the following command
>         # with proper names and addresses in it)
>         if(uri == myself || src_ip == ser.mycompany.com)
>         {
>                 if(method == "REGISTER")
>                 {
>                         # Make sure they are a valid user on our proxy
>                         if(!www_authorize("mycompany.com", "sipfriends"))
>                         {
>                                 # xlog("L_INFO", "Req Auth For %ct, URI =
> %ru");
>                                 www_challenge("mycompany.com", "1");
>                                 break;
>                         };
> 
>                         # xlog("L_INFO", "Registered Contact %ct,  URI =
> %ru");
>                         save("location");
> 
>                         break;
>                 };
>         };
> 
>         #
> ----------------------------------------------------------------------------
> --------------------
> 
>         # we record-route all messages -- to make sure that
>         # subsequent messages will go through our proxy; that's
>         # particularly good if upstream and downstream entities
>         # use different transport protocol
>         record_route();
>           # This will make the return path the VIRTUAL IP on a L4 switch
> instead of our REAL IP
>         # record_route_preset("111.222.333.444:5060");
> 
>         #
> ----------------------------------------------------------------------------
> --------------------
> 
>         # loose-route processing
>         if(loose_route())
>         {
>                 xlog("L_INFO", "loose_route(): Looking up %rm URI %ru from
> %is");
>                 lookup("location");
>                 xlog("L_INFO", "loose_route(): t_relay() %rm to URI %ru");
>                 t_relay();
>                 break;
>         };
> 
>         #
> ----------------------------------------------------------------------------
> --------------------
> 
>         # We only need to do load balancing on the INVITE.
>         # After the dest IP has been put in the message the servers will
> follow it on their own.
>         if(method == "INVITE")
>         {
> 
>                 # If it came from Asterisk send it to a TNT box for final
> routing if it can't be looked up
>                 # As of now its ast0 and ast1 which are 222.222.222.222 and
> 333.333.333.333 which fall within this subnet
>                 if(src_ip == 222.222.222.222 || src_ip == 333.333.333.333)
>                 {
>                         xlog("L_INFO", "%rm came from Asterisk server %is,
> URI = %ru");
> 
>                         # native SIP destinations are handled using our
> USRLOC DB
>                         if(lookup("location"))
>                         {
>                                 # Found a match, this is going to a VoIP
> phone
>                                 xlog("L_INFO", "Sending %rm (URI = %ru) to
> Contact (%ct)");
>                         }
>                         else
>                         {
>                                 # Lookup failed, assume that this is a phone
> number URL until I setup pattern matching
>                                 # Send to the TNT
>                                 xlog("L_INFO", "Sending URI (%ru) to TNT");
>                                 rewritehostport("tnt.mycompany.com:5060");
> 
>                         };
>                 }
> 
>                 # NOTE: I could have combine the following "else if" and
> "else" but I wanted to seperate them for debug purposes
>                 # If it came from a TNT send it to an Asterisk box for final
> routing
>                 # As of now TNT is 444.444.444.444 which falls within this
> subnet
>                 else if(src_ip == 444.444.444.444)
>                 {
>                         xlog("L_INFO", "%rm came from TNT (%is), sending to
> Asterisk (URI = %ru)");
>                         rewritehostport("ast.mycompany.com:5060");
>                                 # I cheated here because I made
> ast.mycompany.com a DNS round robing with a 5 sec experation.  It's not a
> load checking load balancer but its REALLY close.
>                 }
> 
>                 # Assume it came from one of our VoIP phones, all routing is
> done by Asterisk
>                 else
>                 {
>                         xlog("L_INFO", "%rm came from a VoIP phone (%is),
> attempting to authorize %fu");
> 
>                         # Make sure they are a valid user on our proxy
>                         if (!www_authorize("mycompany.com", "sipfriends"))
>                         {
>                                 www_challenge("mycompany.com", "0");
>                                 xlog("L_INFO", "Failed to authorize %fu
> (%is)");
>                                 break;
>                         };
> 
>                         # Found a match, this is going to a VoIP phone
>                         xlog("L_INFO", "Auth OK, sending URI %ru to Asterisk
> for routing");
>                         rewritehostport("ast.mycompany.com:5060");
>                 };
> 
>                 xlog("L_INFO", "INVITE New URI = %ru, t_relay()ing now");
>                 t_relay();
>                 # forward(uri:host, uri:port);
>                 break;
>         };
> 
>         #
> ----------------------------------------------------------------------------
> --------------------
> 
>         # forward to current uri now; use stateful forwarding; that
>         # works reliably even if we forward from TCP to UDP
>         lookup("location");
>         xlog("L_INFO", "Default t_relay() (method = %rm, URI = %ru, >From =
> %is)");
>         if(!t_relay())
>         {
>                 xlog("L_INFO", "Failed sending requesting %rm URI (%ru)");
>                 sl_reply_error();
>         };
> }
> 
> > -----Original Message-----
> > From: asterisk-users-bounces at lists.digium.com
> > [mailto:asterisk-users-bounces at lists.digium.com] On Behalf Of
> > Tracy R Reed
> > Sent: Thursday, November 18, 2004 7:08 PM
> > To: Asterisk Users Mailing List - Non-Commercial Discussion
> > Subject: Re: [Asterisk-Users] Speaking of DS3s....
> >
> >
> > On Thu, Nov 18, 2004 at 04:30:24PM -0600, Michael Shuler spake thusly:
> > > the VoIP devices and to the media gateways.  The SER
> > machines don't know
> > > what to do with a call they only know to hand it over to
> > Asterisk for
> > > routing/CLASS features or whatever you want the call to do.
> >  You then have a
> >
> > This is exactly what I am trying to figure out how to set up.
> > I am still a
> > bit confused by how the SER box can "hand it over" to the
> > Asterisk box. I
> > am pretty fluent in Asterisk by now and have written various code for
> > Asterisk so I would like to do my routing and accounting in
> > Asterisk, and
> > not SER which I understand requires coding in C to SER's API
> > (correct me
> > if I'm wrong here). Since SER is a proxy it does not handle the rtp
> > stream, right? But someone recently told me that SER
> > implements comfort
> > noise and other nice SIP things that asterisk does not and
> > that you really
> > don't want all of the media stream going through asterisk
> > because it won't
> > scale. Or maybe the media stream does have to go through
> > asterisk but SER
> > just balances the load but that doesn't jive with what I was
> > told about
> > comfort noise etc. We also are using asterisk to talk to
> > TNT's and that
> > part is working really slick. We have a few DS-3's and I
> > intend to have
> > asterisk least cost route traffic to the appropriate TNT etc.
> >
> > > Asterisk as media gateways in our setup we use the Lucent
> > TNTs but it
> > > accomplishes the same thing but on a much larger scale.  As
> > far as sharing
> > > the common configs we use
> > http://svn.asteriskdocs.org/res_data/ to read all
> > > of our configs (sip.conf, extensions.conf, etc.) live from
> > a MySQL database.
> > > Just apply the patch and go.
> >
> > Hmm...what's the difference between res_config and res_data? They both
> > seem to put all of the asterisk configs in a database. Does res_config
> > just read from the db once and res_data reads in real time?
> >
> > --
> > Tracy Reed    http://copilotcom.com
> > This message is cryptographically signed for your protection.
> > Info: http://copilotconsulting.com/sig
> >
> 
> _______________________________________________
> Asterisk-Users mailing list
> Asterisk-Users at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-users
>



More information about the asterisk-users mailing list