4

複数の IP をリッスンする OpenSIPS サーバーがあります。コールを次のポイントに戻す場合、すべてのシグナリングとメディアがコールが最初に着地した IP から来るようにしたい (発信者と着信者に互いの IP アドレスを知られたくない)。

RTPProxy のようなものに必要なものがあると思います。

私の質問は、IP アドレスごとに 1 つの RTPProxy サーバーが必要ですか、それとも単一のサーバーを介して複数の IP をルーティングできますか? より良い解決策はありますか?

私はこれを自分で試してみますが、RTPProxy サーバーを正しく実行するのに苦労しています (RTPProxy に関する問題ではなく、私の無知です)。セットアップに時間を無駄にしているかどうかを誰かが知っているかどうかを確認するために、事前に尋ねました。

[アップデート]

興味のある人にとっては、これが私がどのように機能したかですが、これを最終的な解決策として実行したいかどうかはわかりません. さらにテストが必要です。トポロジの非表示と RTP プロキシを使用した 2 つの IP の場合。以下の回答とともに、誰かの役に立てば幸いです。

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 プロキシの 2 つのグループを作成します - 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 アドレスごとに 1 つの 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 が代替手段です。

ユーザー空間デーモンが RTP トラフィックを中継するのではなく、openser/opensips/kamailio は、JSON Web ポストを介して python MediaDispatcher に、使用可能な MediaRelay に接続して Linux カーネル レベルの conntrack トラフィック転送エントリをセットアップするように指示します。

このアプローチの欠点は、現在の python media-dispatcher と media-relay が /etc/mediaproxy/config.ini を読み取ることです。複数の config.ini ファイルを持つことができるように、python をハックして構成パラメーターを取得する必要があります。正しいリダイレクトをセットアップするために、インスタンスごとに 1 つ。

/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 に答える