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

Dav*_*lie 4 voip sip kamailio

我有一个OpenSIPS服务器,可以监听多个IP.如果我将呼叫路由回到下一个点,我想确保所有信令和媒体来自最初登陆的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
Run Code Online (Sandbox Code Playgroud)

然后修改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")
Run Code Online (Sandbox Code Playgroud)

下一位为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")
Run Code Online (Sandbox Code Playgroud)

然后在标准(发货)配置的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);
Run Code Online (Sandbox Code Playgroud)

小智 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 &
Run Code Online (Sandbox Code Playgroud)

您需要将其与独立的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();
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

这种方法的缺点是当前的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'
Run Code Online (Sandbox Code Playgroud)

在您的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();
Run Code Online (Sandbox Code Playgroud)

听起来你可能会因为特殊需要而获得rtpproxy更好的运气.