一、說明
在分析了wireshark使用方法后,其表達式書寫基本沒什么問題,但在linux上使用的更多是tcpdump。
tcpdump自大學就開始在用了,但一直沒搞懂其表達式的書寫規律,基本每次使用都得查、每次用后都會忘。
二、安裝
yum install tcpdump -y
三、使用
tcpdump命令用法如下,可概括為“tcpdump + 選項 + 表達式”;表達式用於指示過濾哪些數據包,選項用於指示如何處理表達式過濾出來的這些數據包。
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] [ -P in|out|inout ] [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
3.1 選項
選項也沒什么說的,看上邊的寫法也大概能猜出選項的意思,如果不能那就“man tcpdump”看一下具體的意思。提一下最常用的三個參數
-A----以可打印字符形式打印包的所有內容。在想查看應用層(如http)內容這個選項很有用。
-i----用於指定要捕獲數據包的網卡。如eth1。
-r----可以從指定的文件中讀入數據包。
-w----將捕獲的數據包存入到文件。一般保存成.pcap方便使用wireshark打開。
3.2 表達式
tcpdump使用pcap-filter語法,詳情可以查看"man pcap-filter",下邊是對man手冊的一些總結。當然另外還要說明,tcpdump有一些高級的用法,不一定都符合下邊的規律。
與wireshark表達式相較而言,雖然tcpdump也不叫難,但總體還是wireshark表達式更簡單明了一些。
3.2.1 基本表達式
一條基本的表達式寫法如下:
[proto] [dir] [type] [value]
proto----protocol,流量協議。可以為ether(數據鏈路層), ip, ip6, arp, rarp, decnet, tcp 及 udp。另外也可以是fddi, tr, wlan但這三個都是數據鏈路層在不同數據鏈路層協議的叫法,與ether相互之間等價。tcpdump不支持應用層協議,只能借助端口實現某種應用層協議的過濾。
dir----direction,流量方向。可以為src, dst, src or dst 及 src and dst。另外也可以是ra, ta, addr1, addr2, addr3 及 addr4但這幾個只適用於wlan數據鏈路層。
type----過濾項的值的類型。可以為host(ip或可解析的域名/主機名), net(網段) , port(端口或/etc/services可解析的服務) 及 portrange(端口范圍)。
# 示例一 # 過濾ip協議(proto)----目的(dir)----ip(type-host)----為192.168.220.128(value)的數據包 tcpdump ip dst host 192.168.220.128 # 當然我們前邊用了中括號,意味着在沒有歧義情下況某些字段是可以省略的,如這里proto字段可省略,等價於 # tcpdump dst host 192.168.220.128 # 示例二 # 過濾ip協議(proto)----目的(dir)----網段(type-net)----為192.168.220(value)的數據包 tcpdump ip dst net 192.168.220 # 示例三 # 過濾tcp協議(proto)----目的(dir)----端口(type-port)----為3306(value)的數據包 tcpdump tcp dst port 3306 # port支持/etc/services可解析的服務,3306對應mysql,所以等價於 # tcpdump tcp dst port mysql # 示例四 # 過濾tcp協議(proto)----目的(dir)----端口范圍(type-portrange)----為3306-3308(value)的數據包 tcpdump tcp dst portrange 3306-3308
3.2.2 復合表達式
非----!或not。最高優先級。
與----&&或and。次優先級。
或----||或or。最低優先級。
改變運算優先級----大括號。
# 過濾ip協議(proto)----目的(dir)----ip(type-host)----為192.168.220.128(value)且 # tcp協議(proto)----目的(dir)----端口(type-port)----為3306(value)的數據包 tcpdump ip dst host 192.168.220.128 and tcp dst port 3306 # 過濾tcp協議(proto)----目的(dir)----端口(type-port)----為3306或3308(value)的數據包 tcpdump tcp dst port 3306 or tcp dst port 3308 # 另外也支持以下單引號寫法 # tcpdump tcp dst port '(3306 or 3308)'