tcpdump抓取TCP協議、GRE協議數據

tcpdump抓取tcp數據
1、tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:15:42.714678 IP 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: P 3445320732:3445320750(18) ack 3456192260 win 46 <nop,nop,timestamp 1322201171 1322174386>
        0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122
        0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04
        0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053
        0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000
        0x0040:  0000 0000 0000

2、根據協議二進制字段過濾
1) tcpdump ‘tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net x.x.x.x’
打印TCP會話中的的開始和結束數據包, 並且數據包的源或目的不是本地網絡上的主機.(nt: x.x.x.x, 實際使用時要真正替換成本地網絡的名字))
2) tcpdump ‘tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)’
打印所有源或目的端口是80, 網絡層協議爲IPv4, 並且含有數據,而不是SYN,FIN以及ACK-only等不含數據的數據包.(ipv6的版本的表達式可做練習)(nt: 可理解爲, ip[2:2]表示整個ip數據包的長度, (ip[0]&0xf)<<2)表示ip數據包包頭的長度(ip[0]&0xf代表包中的IHL域, 而此域的單位爲32bit, 要換算成字節數需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp頭的長度, 此域的單位也是32bit, 換算成比特數爲 ((tcp[12]&0xf0) >> 4) << 2, 
即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整個ip數據包的長度減去ip頭的長度,再減去tcp頭的長度不爲0, 這就意味着, ip數據包中確實是有數據.對於ipv6版本只需考慮ipv6頭中的’Payload Length’ 與 ‘tcp頭的長度’的差值, 並且其中表達方式’ip[]’需換成’ip6[]’.)
3) tcpdump ‘gateway snup and ip[2:2] > 576’
打印長度超過576字節, 並且網關地址是snup的IP數據包
4) tcpdump ‘ether[0] & 1 = 0 and ip[16] >= 224’
打印所有IP層廣播或多播的數據包, 但不是物理以太網層的廣播或多播數據報
5)tcpdump ‘icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’
打印除’echo request’或者’echo reply’類型以外的ICMP數據包( 比如,需要打印所有非ping 程序產生的數據包時可用到此表達式 .
(nt: ‘echo reuqest’ 與 ‘echo reply’ 這兩種類型的ICMP數據包通常由ping程序產生))
3、根據數據部分過濾
1)計算數據的起始位置
ip首部的長度爲((ip[0]&0xf)<<2))即ip[0]=0x45,即長度爲20,所以IP頭部到第二行的0115結束,後面就是具體傳送協議的數據了,這裏是tcp數據。
tcp首部的長度 ((tcp[12]&0xf0)>>2)),其中tcp[12]=0x80,計算長度爲20,所以tcp頭部的長度是20,從8018開始數20字節到c7b2結束。
所以tcp數據開始的地方是tcp[12+tcp首部長度]=tcp[20],即從0e00開始。
2)根據數據過濾,比如數據第一個字節tcp[32]==0xe,這樣添加過濾條件過濾即可。

[root@IM-SJ01-Server21 ~]# tcpdump -i eth0 port 11751 and tcp[32] == 0xe -x -s0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:15:42.714678 IP 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: P 3445320732:3445320750(18) ack 3456192260 win 46 <nop,nop,timestamp 1322201171 1322174386>
        0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122
        0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04
        0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053
        0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000
        0x0040:  0000 0000 0000

tcpdump抓取GRE協議
協議字段參數:’proto gre’

[root@os-network01 ~]# tcpdump -i eth0 'proto gre' -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:44:37.834041 IP 135.251.218.247 > 135.251.218.249: GREv0, key=0x1, length 110: IP 10.5.5.2 > 10.5.5.1: ICMP echo request, id 12339, seq 48, length 64
13:44:37.834101 IP 135.251.218.249 > 135.251.218.247: GREv0, key=0x1, length 110: IP 10.5.5.1 > 10.5.5.2: ICMP echo reply, id 12339, seq 48, length 64
13:44:37.834722 IP 135.251.218.247 > 135.251.218.249: GREv0, key=0x1, length 174: IP 10.5.5.2.ssh > 10.0.0.9.39707: Flags [P.], seq 43897986:43898082, ack 2815899572, win 106, options [nop,nop,TS val 1088018784 ecr 1220705304], length 96
13:44:37.834766 IP 135.251.218.249 > 135.251.218.247: GREv0, key=0x1, length 78: IP 10.0.0.9.39707 > 10.5.5.2.ssh: Flags [.], ack 96, win 501, options [nop,nop,TS val 1220706287 ecr 1088018784], length 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章