使用OpenSIPS/Kamailio/OpenSER进行RTP代理

使用OpenSIPS/Kamailio/OpenSER进行RTP代理,sip,voip,kamailio,Sip,Voip,Kamailio,我有一个OpenSIPS服务器,可以监听多个IP。 如果我将呼叫路由回下一点,我希望确保所有信令和媒体都来自呼叫最初到达的IP(我不希望呼叫者和被呼叫者知道对方的IP地址) 我相信我需要的是RTPProxy 我的问题是每个IP地址需要一个RTPProxy服务器,还是可以通过一个服务器路由多个IP?有更好的解决办法吗 我将亲自尝试,但我正在努力使RTPProxy服务器正常运行(我的无知,而不一定是RTPProxy的任何问题)。我提前问了一下,只是想看看有没有人知道我是不是在浪费时间设置它 [更新]

我有一个OpenSIPS服务器,可以监听多个IP。 如果我将呼叫路由回下一点,我希望确保所有信令和媒体都来自呼叫最初到达的IP(我不希望呼叫者和被呼叫者知道对方的IP地址)

我相信我需要的是RTPProxy

我的问题是每个IP地址需要一个RTPProxy服务器,还是可以通过一个服务器路由多个IP?有更好的解决办法吗

我将亲自尝试,但我正在努力使RTPProxy服务器正常运行(我的无知,而不一定是RTPProxy的任何问题)。我提前问了一下,只是想看看有没有人知道我是不是在浪费时间设置它

[更新]

对于任何感兴趣的人来说,这就是我如何让它工作的,尽管我不确定我是否想将其作为最终解决方案运行。需要更多的测试。对于2个IP,使用拓扑隐藏和RTP代理。除了下面的答案,我希望它能帮助一些人

加载rtpproxy进程-

rtpproxy -l _your_public_ip_1_ -s udp:localhost:7722
rtpproxy -l _your_public_ip_2_ -s udp:localhost:7723
然后修改kamailio.cfg文件-

loadmodule "/usr/local/lib64/kamailio/modules/topoh.so"
modparam("topoh", "mask_key", "Your_key_here")
modparam("topoh", "mask_ip", "10.0.0.1")
下一位为RTP代理创建两个组-1和2-

#!ifdef WITH_NAT
    # ----- rtpproxy params -----
    modparam("rtpproxy", "rtpproxy_sock", "1 == udp:127.0.0.1:7722")
    modparam("rtpproxy", "rtpproxy_sock", "2 == udp:127.0.0.1:7723")
然后在标准(shipped)配置的NAT部分中,根据入站呼叫到达的IP选择代理中要使用的组。rtp_proxy_manage是force_和unforce_命令的高级版本。基本上,它只是启动,为你做一切-

route[NATMANAGE] {
    #!ifdef WITH_NAT
        ....
        if($Ri=="X.X.X.1")
            set_rtp_proxy_set("1");

        if($Ri=="X.X.X.2")
            set_rtp_proxy_set("2");

        rtpproxy_manage("",$Ri);

如果使用RTPProxy,则每个IP地址需要一个RTPProxy服务器。您可以使用'-l'参数指定要侦听的IP:

# /usr/sbin/rtpproxy -l 10.10.10.10 -s unix:/var/run/rtpproxy/rtpproxy1.sock -u rtpproxy rtpproxy -p /var/run/rtpproxy/rtpproxy1.pid &
# /usr/sbin/rtpproxy -l 10.10.10.11 -s unix:/var/run/rtpproxy/rtpproxy2.sock -u rtpproxy rtpproxy -p /var/run/rtpproxy/rtpproxy2.pid &
您需要将其与独立的opensips/openser/kamailio实例相匹配:

listen=udp:10.10.10.10:5060
...
loadmodule "rtpproxy.so"

modparam("rtpproxy", "rtpproxy_sock", "unix:/var/run/rtpproxy/rtpproxy1.sock")

...
unforce_rtp_proxy();
...
force_rtp_proxy();

如果您对C有一定的经验,可以考虑修改rtpproxy模块以了解多个rtpproxy实例

此外,如果通过用户空间中继RTP的想法困扰您,那么MediaProxy是另一种选择

openser/opensips/kamailio通过JSON web post通知python MediaDispatcher联系可用的MediaRelay以设置linux内核级conntrack流量转发条目,而不是中继RTP流量的用户空间守护进程

这种方法的缺点是当前的python媒体调度程序和媒体中继读取/etc/mediaproxy/config.ini——您需要破解python以获取一个配置参数,这样您就可以有多个config.ini文件,每个实例一个,以设置正确的重定向

示例/etc/mediaproxy/config.ini可能如下所示:

[Relay]
dispatchers = 10.10.10.10:25060

[Dispatcher]
socket_path = /var/run/mediaproxy/dispatcher.sock
listen = 10.10.10.10:25060
listen_management = 10.10.10.10:25061

[OpenSIPS]
socket_path = '/var/run/opensips/socket'
在opensips配置文件中:

modparam("mi_datagram", "socket_name", "/var/run/opensips/socket")

...

loadmodule "mediaproxy.so"

# ----- mediaproxy params -----
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy/dispatcher.sock")
#modparam("mediaproxy", "disable", 1)
#modparam("mediaproxy", "natping_interval", 60)

...
engage_media_proxy();
...
end_media_session();

听起来,对于您的特殊需求,使用rtpproxy可能会更幸运。

谢谢。我接受这个答案。因为我需要几个代理才能在几十个IP上运行,所以我不相信使用这种方法可以从Kamailio/OpenSIPS获得更好的性能,因为我使用的是非常精简的Freeswitch版本,它具有内置的代理媒体模式。当然,这一切都需要测试,我将测试这两种方法。感谢您如此详细的回答。我还注意到我在问题中特别提到了OpenSIPS——我应该说我正在试用OpenSIPS和Kamailio。尽管它们来自相同的代码库,但它们有一些不同的模块。为疏忽道歉,没问题。上面的rtp_代理示例来自kamailio安装,而上面的mediaproxy示例来自OpenSIPS安装(出于遗留原因,我们将两者混合运行)。
modparam("mi_datagram", "socket_name", "/var/run/opensips/socket")

...

loadmodule "mediaproxy.so"

# ----- mediaproxy params -----
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy/dispatcher.sock")
#modparam("mediaproxy", "disable", 1)
#modparam("mediaproxy", "natping_interval", 60)

...
engage_media_proxy();
...
end_media_session();