分析freeswitch返回403 Forbidden的原因
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1、SIP協(xié)議的相關(guān)知識(shí)
403 Forbidden通常表示服務(wù)器理解請(qǐng)求,但拒絕執(zhí)行,常見(jiàn)原因包括認(rèn)證失敗、權(quán)限不足、IP地址被阻止等。(最后找到是因?yàn)闃?gòu)造的HA2生成的MD5碼導(dǎo)致認(rèn)證失?。?br />2、解析SIP響應(yīng)
在Go中處理SIP消息需要解析收到的響應(yīng),提取相關(guān)的頭部字段。根據(jù)每一個(gè)消息頭字段逐一排查。如何查看SIP消息的具體內(nèi)容REGISTER請(qǐng)求的結(jié)構(gòu),以及服務(wù)器返回的401和403響應(yīng)的各個(gè)字段。特別是要注意WWW-Authenticate頭中的參數(shù),如realm、nonce、qop等,這些在生成認(rèn)證響應(yīng)時(shí)非常關(guān)鍵。- 如果qop是"auth",則response = MD5(HA1:nonce:nc:cnonce:qop:HA2)
- 如果qop未指定,則response = MD5(HA1:nonce:HA2)
- qop是"auth",所以需要包括nonce計(jì)數(shù)器、客戶(hù)端nonce以及qop值。所以正確的response計(jì)算應(yīng)該包含這些參數(shù)
具體實(shí)現(xiàn):
設(shè)置過(guò)濾器,在過(guò)濾器中輸入sip進(jìn)行過(guò)濾,找到相關(guān)的SIP請(qǐng)求和響應(yīng)。然后,重點(diǎn)分析401和403響應(yīng)的細(xì)節(jié),比如頭部信息、認(rèn)證參數(shù)是否正確。比如nonce、cnonce、nc的值是否符合規(guī)范,或者哈希計(jì)算是否正確。需要指導(dǎo)他們?cè)赪ireshark中對(duì)比正常和異常的請(qǐng)求,查看Authorization頭中的各個(gè)參數(shù)是否正確。網(wǎng)絡(luò)通信問(wèn)題
Go程序通過(guò)UDP發(fā)送和接收數(shù)據(jù),需要正確讀取服務(wù)器的響應(yīng),并處理可能的超時(shí)或網(wǎng)絡(luò)錯(cuò)誤。NAT或防火墻導(dǎo)致的連接問(wèn)題,雖然返回的是403,但實(shí)際可能是服務(wù)器沒(méi)有正確接收到認(rèn)證請(qǐng)求,或者客戶(hù)端的Contact地址不可達(dá)。這時(shí)候需要檢查SIP消息中的Via和Contact頭部,確認(rèn)地址和端口是否正確,是否被服務(wù)器接受。
3、Wireshark分析403 Forbidden全流程
(1)加載抓包文件
打開(kāi)Wireshark → File → Open → 選擇抓包文件設(shè)置顯示過(guò)濾器(快速定位SIP流量):
sip || udp.port == 5060或者sip
(2)定位關(guān)鍵SIP事務(wù)
A.典型403錯(cuò)誤流程

B.關(guān)鍵幀分析
- 初始REGISTER請(qǐng)求
Via: SIP/2.0/UDP 192.168.0.0:5060;branch=z9hG4bKd4e5f6a7
Max-Forwards: 70
From: <sip:1000@192.168.0.1>;tag=abcd1234
To: <sip:1000@192.168.0.1>
Call-ID: a1b2c3d4@192.168.0.0
CSeq: 1 REGISTER
Contact: <sip:1000@192.168.0.0:5060;transport=udp>
- 檢查要點(diǎn):
Contact頭是否包含正確的客戶(hù)端地址
CSeq是否從1開(kāi)始遞增
- 401 Unauthorized響應(yīng)
Via: SIP/2.0/UDP 192.168.0.170:5060;received=192.168.0.170;branch=z9hG4bKd4e5f6a7;rport=5060
WWW-Authenticate: Digest realm="192.168.0.31", nonce="5e8f7g6h", qop="auth", algorithm=MD5
- 確認(rèn)參數(shù)完整性:
algorithm 是否為MD5
- 帶認(rèn)證的REGISTER請(qǐng)求
Authorization: Digest username="1000", realm="192.168.0.31",
nonce="5e8f7g6h", uri="sip:192.168.0.31",
response="d41d8cd98f00b204e9800998ecf8427e",
algorithm=MD5, qop=auth, nc=00000001,
cnonce="d4e5f6a7b8c9d0e1"

- 403 Forbidden響應(yīng)
nonce、cnonce、nc的值是否符合規(guī)范,或者哈希計(jì)算是否正確。需要指導(dǎo)他們?cè)赪ireshark中對(duì)比正常和異常的請(qǐng)求,查看Authorization頭中的各個(gè)參數(shù)是否正確。
- MD5的計(jì)算
ha2 := md5Hex(fmt.Sprintf("REGISTER:sip:%s:%d",freeswitchIP,freeswitchPort)))
response := md5Hex(fmt.Sprintf("%s:%s:%s:%s:%s:%s",ha1, nonce, nc, cnonce, "auth", ha2))