Hi All,
Hope you are all well?
I am hoping you can help with a bit of syntax I am struggling to get working in the intended way. (We are using Kamailio 5.5.3 and using Kemi/python.)
The scenario is in AWS where we have separate Kamailio and RTPengine instances, with a cluster of FreeSWITCH EC2's on private addresses only.
In the current setup, all RTP routes via the NAT gateway and back to the private IP of the selected FreeSWITCH (and vice versa). This works in the current config, but I would want this traffic not going via the NAT gateway and use the private address and route internally on the VPC. (These EC'2 have only 1 network interface and that cannot be changed for this work.)
So anything between FreeSWITCH and Kamailio/RTPengine uses the private IP's for media, the rest use public IP's.
It is good to note that the RTPengine's are the same in each set (3 total RTPengine's), just using the public/private IP's based on set ID.
My first aim is to use KSR.permissions.allow_source_address() to check if the source address is from the FreeSWITCH cluster and set the rtpengine setID based on this. I have used this method for different parts of the config and it works.
I am failing at this first step it seems, as no matter what I use in the function (below) it defaults and uses the public IP's in SDP. (No matter if I use the same setID in each set)
kamailio.cfg snippet:
# ----- rtpengine params ----- modparam("rtpengine", "setid_avp", "$avp()") # Public IP's ID 1: modparam("rtpengine", "rtpengine_sock", "1 == udp:5.5.5.5:2223 udp:6.6.6.6:2223 udp:7.7.7.7:2223") # Internal IP's ID 2: modparam("rtpengine", "rtpengine_sock", "2 == udp:10.0.0.1:2223 udp:10.0.0.2:2223 udp:10.0.0.3:2223")
Kemi file snippet:
# RTPengine Options for different SetID def ksr_route_rtpengine(self, msg): if KSR.textops.has_body_type("application/sdp") > 0 : # Source address is private subnet - use RTPengine set 2 (private IP's) if KSR.permissions.allow_source_address(400) == 1: KSR.rtpengine.set_rtpengine_set(2) KSR.rtpengine.rtpengine_manage( "RTP/AVP replace-session-connection replace-origin port-latching ICE=remove") else: # Source address is NOT private - use RTPengine set 1 (public) KSR.rtpengine.set_rtpengine_set(1) KSR.rtpengine.rtpengine_manage( "RTP/AVP replace-session-connection replace-origin port-latching ICE=remove") KSR.xlog.xlog("L_INFO", "RTPengine handling Block") return 1
Group 400 is the private subnet of the FreeSWITCH clusters we have behind on private addresses and the list contains the subnet of private IP's.
Using the above, the Kamailio starts fine and understands/loads each set of RTPengine's and calls work with audio. but regardless of the set number used (even only using set 2 in both) it defaults to public IP's in the SDP. (This is the only place in the config where this function is defined)
My SDP from FreeSWITCH egress to Kamailio/RTPengine has private IP's in the SDP.
The only thing I do not fully understand is the setid_avp - specifically $avp() block and if this needs to stay empty, or be duplicated with the set ID in each one.
Any help would be greatly appreciated in understanding where I am going wrong here.
Thanks,
John.
On 24/01/2023 06.05, [EXT] John Hardiman wrote:
...
So anything between FreeSWITCH and Kamailio/RTPengine uses the private IP's for media, the rest use public IP's.
It is good to note that the RTPengine's are the same in each set (3 total RTPengine's), just using the public/private IP's based on set ID.
...
# Public IP's ID 1:
modparam("rtpengine", "rtpengine_sock", "1 == udp:5.5.5.5:2223 udp:6.6.6.6:2223 udp:7.7.7.7:2223")
# Internal IP's ID 2:
modparam("rtpengine", "rtpengine_sock", "2 == udp:10.0.0.1:2223 udp:10.0.0.2:2223 udp:10.0.0.3:2223")
...
Using the above, the Kamailio starts fine and understands/loads each set of RTPengine's and calls work with audio. but regardless of the set number used (even only using set 2 in both) it defaults to public IP's in the SDP. (This is the only place in the config where this function is defined)
Rtpengine doesn't distinguish between which IP address you use to communicate with it, so using multiple sets to talk to the same rtpengine instances (just with different IPs) is pointless for this purpose.
Instead, what you want to do is list the interfaces you have available in rtpengine's config file with different names (e.g. "int" for just the private address, and "ext" for the same address but with the public address as "advertised address") and then use the `direction=` flags in your calls to rtpengine_manage to tell rtpengine which interfaces to use.
The first `direction=` corresponds to where the message is coming from (, the second corresponds to where it's going to. So for example, if the SDP has an internal/private address in it, and you know the outgoing SDP will go an external system requiring the public address, you would use `direction=int direction=ext`.
There's no need to have multiple rtpengine sets configured in Kamailio for this.
HTH
Cheers
Thanks for the advice Richard, I think I was focussing too much on the Kamailio config side rather than what actually sends the RTP.
I will give this a try and report on my findings.
Many Thanks, John.