4

我有一个侦听多个 IP 的 OpenSIPS 服务器。如果我将呼叫路由回下一个点,我想确保所有信令和媒体都来自呼叫最初登陆的 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")

然后在标准(已交付)配置的 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);
4

1 回答 1

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 不是中继 RTP 流量的用户空间守护进程,而是通过 JSON 网络帖子告诉 python MediaDispatcher 联系可用的 MediaRelay 以设置 linux 内核级 conntrack 流量转发条目。

这种方法的缺点是当前的 python media-dispatcher 和 media-relay 读取 /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 有更好的运气来满足您的特定需求。

于 2012-10-11T16:48:12.300 回答