3

要求を別のドメインにリダイレクトするという 1 つの目的を果たす最小限の SIP プロキシを作成しようとしています。キャッチは、リダイレクト先のドメインが承認を必要とすることです。そのため、SIP 承認は宛先のドメイン名に部分的に基づいているため、いくつかの SIP 属性を書き換える必要があると思います。

302 リダイレクトを発行するだけでなく、各 SIP 要求の値を単純にプロキシして変更しようとしましたが、うまくいかないものはありません。node.js ライブラリ (sip.js) を使用しており、リダイレクト モジュールとプロキシ モジュール ( https://github.com/kirm/sip.js/blob/master/doc/api.markdown ) を試しました。

リクエストを別のドメインにリダイレクトし、その別のドメインに対して認証を実行できるようにするために、SIP データを変更する必要がある正確な方法はありますか?

4

1 に答える 1

8

以下は、私が独自の SIP サーバーで動作するようになった基本的なノード スクリプトです。独自のテストから資格情報と IP アドレスを置き換える必要があります。

プロキシ スクリプトはクライアントにリダイレクト応答を送信しませんが、クライアントに代わってサーバーへの新しいトランザクションを開始します。このモードで動作する SIP サーバーは、より正確には Back-to-Back User Agent (B2BUA) と呼ばれます。元のクライアントに応答を照合して返すなど、必要なすべての機能を追加していません。それにかなりの作業が必要です。

var sip = require('sip');
var digest = require('sip/digest');
var util = require('util');
var os = require('os');
var proxy = require('sip/proxy');

var registry = {
  'user': { user: "user", password: "password", realm: "sipserver.com"},
};

function rstring() { return Math.floor(Math.random()*1e6).toString(); }

sip.start({
  address: "192.168.33.116", // If the IP is not specified here the proxy uses a hostname in the Via header which will causes an issue if it's not fully qualified.
  logger: { 
    send: function(message, address) { debugger; util.debug("send\n" + util.inspect(message, false, null)); },
    recv: function(message, address) { debugger; util.debug("recv\n" + util.inspect(message, false, null)); }
  }
},
function(rq) {
  try {
    if(rq.method === 'INVITE') {  

       proxy.send(sip.makeResponse(rq, 100, 'Trying'));

      //looking up user info
      var username = sip.parseUri(rq.headers.to.uri).user;    
      var creds = registry[username];

      if(!creds) {  
        proxy.send(sip.makeResponse(rq, 404, 'User not found'));
      }
      else {
        proxy.send(rq, function(rs) {

            if(rs.status === 401) {

                // Update the original request so that it's not treated as a duplicate.
                rq.headers['cseq'].seq++;
                rq.headers.via.shift ();
                rq.headers['call-id'] = rstring();

                digest.signRequest(creds, rq, rs, creds);

                proxy.send(rq);
            }
        });
      }
    }
    else {
      proxy.send(sip.makeResponse(rq, 405, 'Method Not Allowed'));
    }
  } catch(e) {
    util.debug(e);
    util.debug(e.stack);

   proxy.send(sip.makeResponse(rq, 500, "Server Internal Error"));
  }
});
于 2014-02-11T05:27:25.853 に答える