2014-02-06 2 views
2

하나의 목적을 충족시키는 최소한의 SIP 프록시를 만들려고합니다 : 요청을 다른 도메인으로 리디렉션합니다. catch는 인증을 요구하는 리디렉션 도메인이므로 SIP 인증은 부분적으로 대상의 도메인 이름을 기반으로하므로 일부 SIP 특성을 다시 작성해야한다고 가정합니다.프록시를 통한 SIP 리디렉션 (SIP.js)

나는 302 리디렉션을 발급 할뿐 아니라 각 SIP 요청의 값을 단순히 프록시 처리하고 변경했지만 아무도 그 트릭을 종료하지 않는 것 같습니다. node.js 라이브러리 (sip.js)를 사용 중이며 리디렉션 및 프록시 모듈 (https://github.com/kirm/sip.js/blob/master/doc/api.markdown)을 사용해 보았습니다.

요청을 다른 도메인으로 리디렉션하고 해당 도메인에 대해 인증을 사용하도록 SIP 데이터를 수정해야하는 아이디어는 무엇입니까?

+0

SIP 프록시에서 자격 증명을 사용할 수 있습니까? 또는 클라이언트가 프록시에서 리디렉션 응답을 받으면 자체 저장된 자격 증명을 사용할 것으로 기대합니까? 후자는 보안 관점에서 문제가 될 수 있으므로 많은 성공을 거둘 수 있을지는 의문입니다. 귀하의 프록시가 프리미엄 번호로 리디렉션되어 고객에 대한 막대한 요금을 부과 할 수 있습니다. – sipwiz

+0

@sipwiz 사용자를 대신하여 인증 할 수있는 자격 증명을 사용할 수 있습니다. 방법을 모르겠습니다. – Dan

답변

6

다음은 자체 SIP 서버로 작업하는 기본 노드 스크립트입니다. 당신은 당신의 자신의 테스트에 대한 자격 증명과 IP 주소를 교체해야합니다.

프록시 스크립트는 클라이언트에 대한 리다이렉트 응답을 보내지 않지만 대신 클라이언트를 대신하여 서버에 대한 새 트랜잭션을 시작합니다. 이 모드에서 작동하는 SIP 서버는 B2BUA (Back-to-Back User Agent)라고합니다. 응답을 원래 클라이언트로 다시 전달하는 등 필요한 모든 기능을 추가하지 않았습니다. 거기에 관련된 일은 공정한 것입니다.

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")); 
    } 
});