一、什麼是sngrep?
sngrep 是專門用於 SIP 信令抓包和分析 的終端工具,比 tcpdump 更直觀,特別適合調試 VoIP、FreeSWITCH、Asterisk、Kamailio 等 SIP 系統
簡單來説:就是當你撥打 VoIP 電話時,電話的信令(比如誰打電話、誰接電話、如何建立連接、如何掛斷等)就是通過 SIP 協議來管理的。
二、sngrep的呼叫流程:
INVITE → 呼叫發起
↓
100 Trying → 服務器收到請求
↓
180 Ringing → 對方在響鈴
↓
200 OK → 對方接聽
↓
ACK → 確認接聽,建立通話
↓
BYE → 掛斷通話
三、常見SIP錯誤狀態碼:
|
錯誤碼 |
含義 |
可能原因 |
|
403 |
Forbidden(禁止訪問) |
認證失敗、權限不足 |
|
404 |
Not Found(未找到) |
目標號碼不存在、號碼格式錯誤、目標設備未註冊 |
|
480 |
Temporarily Unavailable(暫時無法使用) |
目標設備忙、無法連接網絡、設備離線 |
|
486 |
Busy Here(目標忙線) |
目標設備正在通話中 |
403:檢查賬號和密碼是否正確,確保用户有權限撥打此號碼。
404:確認目標號碼是否正確,確保該號碼已在服務器上註冊並存在。
480:目標設備可能忙線或不可達,檢查目標設備的狀態。
486:目標設備正在通話中,稍後再撥。
四、安裝sngrep
在 Debian 或 Ubuntu 系統上安裝sngrep
命令:
apt update
apt install sngrep
五、常用的命令
1.在默認網卡上抓所有 SIP 包
sngrep
2.抓指定端口(SIP 5060)
sngrep udp port 5060
3.抓 UDP 的 SIP(常用)
sngrep udp port 5060
4.抓某個網卡
sngrep -d ens33
5.抓 RTP(語音流)
sngrep 默認不顯示 RTP,但可以顯示呼叫的 RTP 信息。
sngrep -d any port 5060 or portrange 10000-20000
(FreeSWITCH 的 RTP 默認是 16384–32768)
6.保存為 pcap 供 Wireshark 分析
sngrep -O sip.pcap
三、常用的過濾方式
1.基於IP地址過濾
源 IP 地址過濾:
sngrep src host <IP 地址>
目標 IP 地址過濾:
sngrep dst host <IP 地址>
某一 IP 地址過濾:
sngrep host <IP 地址>
2. 基於端口過濾
源端口過濾:
sngrep src port <端口號>
目標端口過濾:
sngrep dst port <端口號>
某一端口過濾:
sngrep port <端口號>
3. 基於協議過濾
SIP 消息過濾:
sngrep -d sip
4. 基於請求類型過濾
可以根據 SIP 請求的類型來過濾消息
過濾 INVITE 請求:
sngrep 'INVITE'
過濾 BYE 請求:
sngrep 'BYE'
過濾 REGISTER 請求:
sngrep 'REGISTER'
5. 基於狀態碼過濾
過濾 200 OK 響應:
sngrep '200 OK'
過濾 404 Not Found 響應:
sngrep '404'
6. 時間範圍過濾
通過指定時間範圍來查看特定時間段內的 SIP 流量
sngrep -t '2025-11-27 08:00:00' -T '2025-11-27 09:00:00'
7. 基於會話過濾
過濾某個會話(會話 ID):
sngrep -s <會話ID>
8. 其他常用過濾選項
過濾某個特定用户代理:
sngrep 'User-Agent: <某個代理>'
9. 組合過濾
結合多個過濾條件來進一步縮小顯示的範圍,如:
過濾某個 IP 地址和特定請求類型:
sngrep host <IP 地址> 'INVITE'