本篇介紹如何使用 ngrep 這個 Linux 網路封包分析工具,以正規表示法等方式篩選與擷取封包資料。

ngrep(network grep)是一個簡單易用且功能強大的網路封包分析工具,它有點類似 Linux 的 grep 指令,可以使用正規表示法來批配網路封包中的資料(payloads),抓取出實際含有指定資料的封包,對於熟悉 greptcpdumpwireshark 的人來說,非常容易上手使用。


ngrep 支援各種常見的通訊協定,包含 IPv4/6、TCP、UDP、ICMPv4/6、IGMP 等,對於網路管理者來說,是一個非常實用的網管工具。

安裝 ngrep

大部分 Linux 發行版的套件庫都有收錄 ngrep 這個工具,若要安裝的話就執行各種 Linux 版本所對應的指令即可:

sudo apt install ngrep    # Debian/Ubuntu
sudo yum install ngrep    # RHEL/CentOS
sudo dnf install ngrep    # Fedora 22+

如果要查看它的原始碼,可以從 ngrep 的 GitHub 網站上查看。

使用 ngrep

ngrep 的使用方式很彈性,而基本的語法結構如下:

ngrep [參數] [批配規則] [BPF 規則]

其中批配規則可以使用正規表示法或是十六進為的資料,而BPF 規則則是指定封包的類型(例如協定種類或連接埠等),以下是一些常見的使用範例。

若要監看所有含有 HTTP 字樣的封包,可以執行:

# 監看含有 HTTP 字樣的封包
sudo ngrep -q 'HTTP'

監看含有 HTTP 字樣的封包

若要加上時間戳記,可以使用 -t 參數:

# 加上時間戳記
sudo ngrep -qt 'HTTP'

在查看封包內部的文字資料時,可以使用 -W 參數將換行模式指定為 byline,這樣可以讓版面更好閱讀:

# 保持原始資料的換行
sudo ngrep -q -Wbyline 'HTTP'

指定連接埠

若要監看所有 SMTP 郵件傳送(port 25)的封包,可以執行:

# 監看所有 port 25 的封包
ngrep -d any port 25

若要監看含有 error 字樣的 syslog 封包,可以執行:

# 監看含有 error 字樣的 syslog 封包
ngrep -d any 'error' port syslog

指定 IP 位址

若要篩選來源或目的 IP 位址為 192.168 開頭的封包,可以使用這樣的 BPF 規則:

# 來源或目的 IP 位址為 192.168 開頭的封包
sudo ngrep -q 'HTTP' 'host 192.168'

若只要篩選目的 IP 位址為 192.168 開頭的封包,則可以這樣寫:

# 目的 IP 位址為 192.168 開頭的封包
sudo ngrep -q 'HTTP' 'dst host 192.168'

若只要篩選來源 IP 位址為 192.168 開頭的封包,則可以這樣寫:

# 來源 IP 位址為 192.168 開頭的封包
sudo ngrep -q 'HTTP' 'src host 192.168'

指定通訊協定

若在查看封包時,只要篩選某一類通訊協定的封包,可以這樣寫:

# 篩選 TCP 封包
sudo ngrep -q 'HTTP' 'tcp'

# 篩選 UDP 封包
sudo ngrep -q 'HTTP' 'udp'

# 篩選 ICMP 封包
sudo ngrep -q 'HTTP' 'icmp'

儲存與讀取 pcap 封包檔案

若要將符合條件的封包資料儲存下來,可以使用 -O 參數指定儲存的 pcap 檔案:

# 儲存封包資料
sudo ngrep -O output.pcap -q 'HTTP'

若要從已經儲存下來的 pcap 檔案中,篩選出指定的內容,可以使用 -I 參數指定 pcap 檔案的位置:

# 從檔案讀取封包資料
ngrep -I input.pcap -qt 'HTTP'

參考資料:TecmintCoderwall