背景
opensips作為服務(wù)端拙友,SIP客戶端向其注冊遗契,但是注冊時帶的contact是一個非法的地址
這種情況一般常見于web端使用jsSIP的客戶端
opensips注冊完后涉瘾,你可以在location表里看到如下記錄
注意這里received是空的负敏。
現(xiàn)象
注冊端無法發(fā)起INVITE呼叫,opensips報如下錯誤
字面上來看,就是這個xxx.invalid的host是找不到的。
問題根因
注冊端發(fā)起INVITE呼叫時,opensips通過location表找到該條記錄源织,然后根據(jù)contact里的信息來指定接下來的路由,由于xxx.invalid是非法地址囊颅,所以opensips也不知道該往哪里路由嗅骄,所以產(chǎn)生了錯誤窑眯。
解決方案
在register消息的處理流程中添加fix_nated_register
if (is_method("REGISTER")) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "0");
exit;
}
if (isflagset(SRC_WS)) {
setbflag(DST_WS);
}
# fixing nat for register message in order that
# 'received' field can be stored in location
fix_nated_register();
if (!save("location","f")){
sl_reply_error();
exit;
}
exit;
}
該函數(shù)會處理register消息中的nat地址,在調(diào)用save同時僧叉,nat轉(zhuǎn)換后的外網(wǎng)地址會寫到received字段