一、什麼是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'