我有一个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更好的运气.