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

时间:2012-10-03 12:02:28

标签: sip voip kamailio

我有一个侦听多个IP的OpenSIPS服务器。 如果我将呼叫路由回到下一个点,我想确保所有信令和媒体来自最初登陆的IP(我不希望呼叫者和被呼叫者知道彼此的IP地址)。

我相信我需要的东西,如RTPProxy。

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

我将自己尝试一下,但我正在努力让RTPProxy服务器正常运行(我的无知,而不是RTPProxy的任何问题)。我提前询问是否有人知道我是否在浪费时间设置它。

[UPDATE]

对于任何感兴趣的人来说,这就是我如何运作,尽管我不确定我是否希望以此作为最终解决方案。需要更多测试。对于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")

然后在标准(附带)配置的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);

1 个答案:

答案 0 :(得分:7)

如果您使用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();

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

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

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

如果您对C有一些经验,可以想象修改rtpproxy模块以了解多个rtpproxy实例。

此外,如果通过用户空间转发RTP的想法困扰您,MediaProxy是另一种选择。

您的openser / opensips / kamailio通过JSON Web帖子告诉python MediaDispatcher,而不是用户空间守护程序中继RTP流量,而是联系可用的MediaRelay来设置Linux内核级别的conntrack流量转发条目。

这种方法的缺点是当前的python媒体调度程序和媒体中继读取/etc/mediaproxy/config.ini - 你需要破解python来获取配置参数,这样你可以想象有多个配置。 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更好的运气。