本篇介紹如何使用 ngrep
這個 Linux 網路封包分析工具,以正規表示法等方式篩選與擷取封包資料。
ngrep
(network grep)是一個簡單易用且功能強大的網路封包分析工具,它有點類似 Linux 的 grep
指令,可以使用正規表示法來批配網路封包中的資料(payloads),抓取出實際含有指定資料的封包,對於熟悉 grep
、tcpdump
或 wireshark
的人來說,非常容易上手使用。
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'
若要加上時間戳記,可以使用 -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'