SIP穿越NAT的rport機制

摩西2016發表於2017-09-13

除錯asterisk時發現從公網發來的INVITE的響應都不能正常返回到客戶端,抓包發現響應都發到via頭域中寫明的那個port上去了,而實際asterisk是從NAT轉換後的地址和埠接收的INVITE請求。最終發現需要在via中加入rport欄位,使得asterisk使用rport機制路由響應。


具體的RFC文件參見RFC3581。


RPORT機制:


  1. 客戶端需要在top most via上帶上rport引數
  2. 服務端發現via中有rport引數時,將此via中加入received引數和rport引數,引數帶的值分別是服務端看到的訊息來源地址和埠(如果有NAT等地址轉換裝置,則即為轉換後的IP和port)。
  3. 當有需要傳送的響應時,按照rport中的埠傳送SIP 響應。也就是說IP和埠均完全遵照從哪裡來的,發回哪裡去的原則。(如果沒有rport欄位時,服務端的策略是IP使用UDP包中的地址,即從哪裡來回哪裡去,但是埠使用的via中的埠)

RFC文件中的例子:


客戶端傳送INVITE形如:
INVITE sip:user@example.com SIP/2.0
Via: SIP/2.0/UDP 10.1.1.1:4540;rport;branch=z9hG4bKkjshdyff

服務端收到後根據自己所得到的源地址和埠,重寫via,如有必要新增自己的via轉發
INVITE sip:user@example.com SIP/2.0
Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77
Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

當需要給此請求傳送響應時,發往received,rport兩個引數記錄的IP和PORT。NAT裝置再把發往轉換後地址192.0.2.1的包發往10.1.1.1地址。
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff


轉載自http://blog.csdn.net/irwin_chen/article/details/20463189

相關文章