[SR-Users] Integrating Kamailio 4.x with Freeswitch using Postgresql

Errol Samuels ewsamuels at gmail.com
Tue Aug 20 17:12:20 CEST 2013


Hello All,

I have been following bits of this guide
http://kb.asipto.com/freeswitch:kamailio-3.3.x-freeswitch-1.2.x-sbc and
bits from other posts to get Kamailio 4.0 integrated with FusionPBX &
Freeswitch 1.2.12 using Postgres instead of MySQL.

My reason for using Postgres is simply because Freeswitch now supports
Postgres natively and FusionPBX also uses Postgres for its backend DB.  So
it made sense to keep things consistent.

The main functions of Kamailio in this scenario are as follows:

- NAT Traversal
- Security, Anti-flood, some DDOS attack protection
- Load-balancing in future

So far I have the registrations working somewhat and the registrations are
visible in the Kamailio locations table but I also Freeswitch also needs to
have access to these registrations as well so that we have access to the
functionality within FusionPBX.

Here are the relevant bits of my script with the real public IPs
substituted:

#######

# *** Value defines - IDs used later in config
#!ifdef WITH_PGSQL
#!define DBURL "postgres://kamailio:kamailiorw@localhost/kamailio"
#!endif
.
.
#!ifdef WITH_FREESWITCH
#!define DBFSURL "postgres://fusionpbx:fusionpbx@1.2.3.4:5432/fusionpbx"
#!endif
.
.
#!ifdef WITH_FREESWITCH
freeswitch.bindip = "1.2.3.4" desc "FreeSWITCH IP Address"
freeswitch.bindport = "5060" desc "FreeSWITCH Port"
#
kamailio.bindip = "2.2.2.2" desc "Kamailio IP Address"
kamailio.bindport = "5065" desc "Kamailio Port"
#!endif
.
.
#!ifdef WITH_POSTGRES
loadmodule "db_postgres.so"
#!endif
.
.
.
# ----- usrloc params -----
/* enable DB persistency for location entries */
#!ifdef WITH_USRLOCDB
modparam("usrloc", "db_url", "postgres://kamailio:kamailiorw@localhost
/kamailio")
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", MULTIDOMAIN)
#!endif


# ----- auth_db params -----
#!ifdef WITH_AUTH
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "load_credentials", "")

#!ifdef WITH_FREESWITCH
modparam("auth_db", "user_column", "extension")
modparam("auth_db", "password_column", "password")
modparam("auth_db", "domain_column", "user_context")
modparam("auth_db", "db_url", DBFSURL)
modparam("auth_db", "version_table", 0)
modparam("auth_db", "use_domain", MULTIDOMAIN)
#!else
modparam("auth_db", "db_url", DBURL)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "use_domain", MULTIDOMAIN)
#!endif
.
.
# authentication
        route(AUTH);

        # record routing for dialog forming requests (in case they are
routed)
        # - remove preloaded route headers
        remove_hf("Route");
        if (is_method("INVITE|SUBSCRIBE"))
                record_route_preset("2.2.2.2");

        # account only INVITEs
        if (is_method("INVITE"))
        {
                setflag(FLT_ACC); # do accounting
        }

        # dispatch requests to foreign domains
        route(SIPOUT);

        # handle presence related requests
        route(PRESENCE);

        # handle registrations
        route(REGISTRAR);

        if ($rU==$null)
        {
                # request with no Username in RURI
                sl_send_reply("484","Address Incomplete");
                exit;
        }
.
.
.
# Authentication route
route[AUTH] {
#!ifdef WITH_AUTH

#!ifdef WITH_FREESWITCH
        # do not auth traffic from FreeSWITCH - trusted!
        if(route(FROMFREESWITCH))
                return;
#!endif

#!ifdef WITH_IPAUTH
        if((!is_method("REGISTER")) && allow_source_address())
        {
                # source IP allowed
                return;
        }
#!endif

        if (is_method("REGISTER") || from_uri==myself)
        {
                # authenticate requests
#!ifdef WITH_FREESWITCH
                if (!auth_check("$fd", "v_extensions", "1")) {
#!else
                if (!auth_check("$fd", "subscriber", "1")) {
#!endif
                        auth_challenge("$fd", "0");
                        exit;
                }
                # user authenticated - remove auth header
                if(!is_method("REGISTER|PUBLISH"))
                        consume_credentials();
        }
        # if caller is not local subscriber, then check if it calls
        # a local destination, otherwise deny, not an open relay here
        if (from_uri!=myself && uri!=myself)
        {
                sl_send_reply("403","Not relaying");
                exit;
        }

#!endif
        return;
}
.
.
.
# Routing to foreign domains
route[SIPOUT] {
        if (!uri==myself)
        {
                append_hf("P-hint: outbound\r\n");
                route(RELAY);
        }
}
.
.
.
# Handle SIP registrations
route[REGISTRAR] {
        if (is_method("REGISTER"))
        {
                if(isflagset(FLT_NATS))
                {
                        setbflag(FLB_NATB);
                        # uncomment next line to do SIP NAT pinging
                        setbflag(FLB_NATSIPPING);
                }
                # without param, here would allows multiple contacts, with
0x04 param, last register wins (fifo)
                #if (!save("location"))
                if (!save("location", "0x04"))
                        sl_reply_error();

#!ifdef WITH_FREESWITCH
                route(REGFWD);
#!endif

                exit;
        }
}
.
.
.
#######

I hope I haven't missed anything important.

With my current config I am able to dial feature code in FusionPBX and also
make outbound calls but not able to dial between extensions because as far
as Freeswitch is concerned the extensions are not registered.

Any assistance would be greatly appreciated.

Thanks

Errol
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20130820/af965e5b/attachment.html>


More information about the sr-users mailing list