Integration with Asterisk/Trixbox

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Integration with Asterisk/Trixbox

James Lamanna
Hi,
I want to use OpenSIPs as the registrar (and NAT handler) for an
Asterisk/Trixbox installation.
I've got things partially working, but I've totally made a mess of my
config (I can post it if you would like).

Some things that I need:

I'm having problems with SIP<->SIP calls because I need asterisk to
stay in the media stream, so really the call has to be routed like:

phone1 <--> opensips <--> asterisk <--> opensips <--> phone2.

Does anyone have any configs that come close to this that I could stare at?
The ones I've found on the web are useful in some ways, but not in others.

Thanks.

-- James

_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: Integration with Asterisk/Trixbox

Iñaki Baz Castillo
2009/5/20 James Lamanna <[hidden email]>:

> Hi,
> I want to use OpenSIPs as the registrar (and NAT handler) for an
> Asterisk/Trixbox installation.
> I've got things partially working, but I've totally made a mess of my
> config (I can post it if you would like).
>
> Some things that I need:
>
> I'm having problems with SIP<->SIP calls because I need asterisk to
> stay in the media stream, so really the call has to be routed like:
>
> phone1 <--> opensips <--> asterisk <--> opensips <--> phone2.
>
> Does anyone have any configs that come close to this that I could stare at?

Set "canreinvite=no" for opensips peer in sip.conf.


> The ones I've found on the web are useful in some ways, but not in others.

This question is more related to Asterisk.


--
Iñaki Baz Castillo
<[hidden email]>

_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: Integration with Asterisk/Trixbox

James Lamanna
On Wed, May 20, 2009 at 7:46 AM, Iñaki Baz Castillo <[hidden email]> wrote:

> 2009/5/20 James Lamanna <[hidden email]>:
>> Hi,
>> I want to use OpenSIPs as the registrar (and NAT handler) for an
>> Asterisk/Trixbox installation.
>> I've got things partially working, but I've totally made a mess of my
>> config (I can post it if you would like).
>>
>> Some things that I need:
>>
>> I'm having problems with SIP<->SIP calls because I need asterisk to
>> stay in the media stream, so really the call has to be routed like:
>>
>> phone1 <--> opensips <--> asterisk <--> opensips <--> phone2.
>>
>> Does anyone have any configs that come close to this that I could stare at?
>
> Set "canreinvite=no" for opensips peer in sip.conf.
>
>
>> The ones I've found on the web are useful in some ways, but not in others.
>
> This question is more related to Asterisk.

Not really.
I'm using the basic NAT example with a little rewriting (as shown below).
The problem I have is that the SDP address is not being rewritten, so
on the asterisk box I see audio traces like this:
(x.x.x.x is the phone NAT IP address, y.y.y.y is the asterisk box address).
You'll notice that the first 2 lines are correct, but the second 2 are
not (asterisk sends to the private IP of the phone)

13:04:54.228511 IP (tos 0x0, ttl 118, id 8879, offset 0, flags [none],
proto: UDP (17), length: 200) x.x.x.x.47127 > y.y.y.y.12232: UDP,
length 172
13:04:54.228555 IP (tos 0x0, ttl  64, id 0, offset 0, flags [DF],
proto: UDP (17), length: 200) y.y.y.y.10536 > x.x.x.x.47128: UDP,
length 172
13:04:54.243209 IP (tos 0x0, ttl  54, id 22237, offset 0, flags
[none], proto: UDP (17), length: 200) x.x.x.x.47128 > y.y.y.y.10536:
UDP, length 172
13:04:54.243254 IP (tos 0x0, ttl  64, id 0, offset 0, flags [DF],
proto: UDP (17), length: 200) y.y.y.y.12232 > 10.20.200.219.49154:
UDP, length 172

When asterisk sends an INVITE to connect the called phone, the SDP
isn't getting rewritten for some reason.
How do I make that work?

The setup signaling looks like:


Calling phone sends INVITE --> opensips forwards to asterisk -->
asterisk sends INVITE ---> opensips forwards INVITE to called phone...

-- James

debug=3         # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)

# Uncomment these lines to enter debugging mode
fork=no
log_stderror=yes
#debug=4

check_via=no    # (cmd. line: -v)
dns=no           # (cmd. line: -r)
rev_dns=no      # (cmd. line: -R)
port=5060
children=4

listen=udp:z.z.z.z:5060
# ------------------ module loading ----------------------------------

#set module path
#mpath="/usr/local/lib/opensips/modules/"
mpath="/usr/local/lib64/opensips/modules/"

# Uncomment this if you want to use SQL database
#loadmodule "db_mysql.so"

loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "signaling.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "xlog.so"

# Uncomment this if you want digest authentication
# db_mysql.so must be loaded !
#loadmodule "auth.so"
#loadmodule "auth_db.so"

# !! Nathelper
loadmodule "nathelper.so"


# ----------------- setting module-specific parameters ---------------

# -- mi_fifo params --
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")

# -- usrloc params --
modparam("usrloc", "db_mode",   0)

# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
#modparam("usrloc", "db_mode", 2)

# -- auth params --
# Uncomment if you are using auth module
#modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#modparam("auth_db", "password_column", "password")

# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)

# !! Nathelper
modparam("usrloc","nat_bflag",6)
modparam("nathelper","sipping_bflag",8)
modparam("nathelper", "ping_nated_only", 1)   # Ping only clients behind NAT
modparam("nathelper", "rtpproxy_sock", "unix:/var/run/rtpproxy/rtpproxy.sock")

# -------------------------  request routing logic -------------------

# main routing logic

route{

^[
    xlog("L_INFO", "New request - Request/failure/branch routes: M=$rm
RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");

    # max_forwards==0, or excessively long requests
    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 (is_method("OPTIONS")) {
        sl_send_reply("200", "OK");
        exit;
    }

    # !! Nathelper
    # Special handling for NATed clients; first, NAT test is
    # executed: it looks for via!=received and RFC1918 addresses
    # in Contact (may fail if line-folding is used); also,
    # the received test should, if completed, should check all
    # vias for rpesence of received
    if (nat_uac_test("3")) {
        # Allow RR-ed requests, as these may indicate that
        # a NAT-enabled proxy takes care of it; unless it is
        # a REGISTER

        if (is_method("REGISTER") || !is_present_hf("Record-Route")) {
            xlog("L_INFO", "LOG:Someone trying to register from
private IP, rewriting\n");
            # This will work only for user agents that support symmetric
            # communication. We tested quite many of them and majority is
            # smart enough to be symmetric. In some phones it takes a
            # configuration option. With Cisco 7960, it is called
            # NAT_Enable=Yes, with kphone it is called "symmetric media" and
            # "symmetric signalling".

            # Rewrite contact with source IP of signalling
            fix_nated_contact();
            if ( is_method("INVITE") ) {
                xlog("L_INFO", "NAT: FIXING SDP");
                fix_nated_sdp("1"); # Add direction=active to SDP
            };
            };
            force_rport(); # Add rport parameter to topmost Via
            setbflag(6);    # Mark as NATed

            # if you want sip nat pinging
            # setbflag(8);
        };
    };

    # subsequent messages withing a dialog should take the
    # path determined by record-routing
    if (loose_route()) {
        # mark routing logic in request
        append_hf("P-hint: rr-enforced\r\n");
        route(1);
        exit;
    };

    # 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
    if (!is_method("REGISTER"))
        record_route();

    if (!uri==myself) {
        # mark routing logic in request
        append_hf("P-hint: outbound\r\n");
        route(1);
        exit;
    };

    # 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) {

        if (is_method("REGISTER")) {

            # Uncomment this if you want to use digest authentication
            #if (!www_authorize("siphub.org", "subscriber")) {
            #   www_challenge("siphub.org", "0");
            #   return;
            #};

            save("location");
            exit;
        };

        lookup("aliases");
        if (!uri==myself) {
            append_hf("P-hint: outbound alias\r\n");
            route(1);
            exit;
        };

        if (is_method("NOTIFY")) {
            route(2);
        }
        if(is_method("OPTIONS")) {
            # send reply for each options request
            sl_send_reply("200", "ok");
            exit;
        }


        if (from_uri =~ "sip:.*@y\.y\.y\..*") {
            log("request from asterisk\n");
            if (!lookup("location")) {
                sl_send_reply("404", "Not Found");
                exit;
            };
            #fix_nated_contact();
            #if (is_method("INVITE"))
            #   fix_nated_sdp("3");
            #force_rport(); # Add rport parameter to topmost Via
            #setbflag(6);    # Mark as NATed
        } else if (is_method("INVITE")) {
            #} else { #if (uri =~ "sip:1[0-9]{10,10}@z\.z\.z\.z") {
                rewritehostport("y.y.y.y:5061");
            #};
        }

        # native SIP destinations are handled using our USRLOC DB
        #if (!lookup("location")) {
        #   sl_send_reply("404", "Not Found");
        #   exit;
        #};
    };
    append_hf("P-hint: usrloc applied\r\n");

    route(1);
}

route[1]
{
    # !! Nathelper
    if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)" &&
!search("^Route:")){
        sl_send_reply("479", "We don't forward to private IP addresses");
        exit;
    };

    # if client or server know to be behind a NAT, enable relay
    if (isbflagset(6)) {
        force_rtp_proxy();
    };

    # NAT processing of replies; apply to all transactions (for example,
    # re-INVITEs from public to private UA are hard to identify as
    # NATed at the moment of request processing); look at replies
    t_on_reply("1");

    # send it out now; use stateful forwarding as it works reliably
    # even for UDP2TCP
    if (!t_relay()) {
        sl_reply_error();
    };
}

# !! Nathelper
onreply_route[1] {
    # NATed transaction ?
    if (isbflagset(6) && status =~ "(183)|2[0-9][0-9]") {
        fix_nated_contact();
        force_rtp_proxy();
    # otherwise, is it a transaction behind a NAT and we did not
    # know at time of request processing ? (RFC1918 contacts)
    } else if (nat_uac_test("1")) {
        fix_nated_contact();
    };
}

route[2] {
    if (!t_newtran()) {
        sl_reply_error();
        exit;
    };

    t_reply("200", "OK");
    exit;
}

_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
Reply | Threaded
Open this post in threaded view
|

Re: Integration with Asterisk/Trixbox

Iñaki Baz Castillo
El Miércoles, 20 de Mayo de 2009, James Lamanna escribió:
> I'm using the basic NAT example with a little rewriting (as shown below).
> The problem I have is that the SDP address is not being rewritten, so
> on the asterisk box I see audio traces like this:
> (x.x.x.x is the phone NAT IP address, y.y.y.y is the asterisk box address).
> You'll notice that the first 2 lines are correct, but the second 2 are
> not (asterisk sends to the private IP of the phone)

An easy options is forcing the media to always pass though Asterisk. For this,
just add "nat=yes" in opensips peer in sip.conf.
"nat=yes" enables Comedia Mode which means that Asterisk doesn't care about
the public or private address of the received SDP. Instead if waits the peer
to send RTP to Asterisk, and then Asterisk sends its RTP to the source address
of the RTP.

--
Iñaki Baz Castillo <[hidden email]>

_______________________________________________
Users mailing list
[hidden email]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users