首頁 > 運維 > CentOS > CentOS下如何使用tcpdump網路抓包

CentOS下如何使用tcpdump網路抓包

藏色散人
發布: 2021-01-04 14:26:53
轉載
3539 人瀏覽過

下面由centos教學專欄介紹給大家CentOS#下使用tcpdump網路抓包的方法,希望對需要的朋友有所幫助!

CentOS下如何使用tcpdump網路抓包

tcpdump是Linux下的截獲分析網路封包的工具,對最佳化系統效能有很大參考價值。

安裝

tcpdump不是預設安裝的,在CentOS下安裝:

yum install tcpdump
登入後複製

在Ubuntu下安裝:

apt-get install tcpdump
登入後複製
預設啟動
tcpdump
登入後複製

普通情況下,直接啟動tcpdump將監視第一個網路介面上所有流過的封包。

監視指定網路介面的封包(一定要查看網卡)

tcpdump -i eth1
登入後複製

如果不指定網卡,預設tcpdump只會監視第一個網路接口,一般是eth0,下面的例子都沒有指定網路介面。

監視指定主機的封包

列印所有進入或離開sundown的封包.

tcpdump host sundown
登入後複製

也可以指定ip,例如截取所有210.27.48.1 的主機收到的和發出的所有的資料包

tcpdump host 210.27.48.1
登入後複製

列印helios 與hot 或與ace 之間通訊的資料包

tcpdump host helios and \( hot or ace \)
登入後複製

截取主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊

tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
登入後複製

列印ace與任何其他主機之間通訊的IP 封包, 但不包括與helios之間的封包.

tcpdump ip host ace and not helios
登入後複製

如果想要取得主機210.27.48.1除了和主機210.27.48.2以外所有主機通訊的ip包,使用指令:

tcpdump ip host 210.27.48.1 and ! 210.27.48.2
登入後複製

截獲主機hostname發送的所有資料

tcpdump -i eth0 src host hostname
登入後複製

監視所有送到主機hostname的封包

tcpdump -i eth0 dst host hostname
登入後複製
監視指定主機和連接埠的封包

如果想要取得主機210.27.48.1接收或發出的telnet封包,使用下列指令

tcpdump tcp port 23 and host 210.27.48.1
登入後複製

對本機的udp 123 埠進行監視123 為ntp的服務連接埠

tcpdump udp port 123
登入後複製
監視指定網路的封包

列印本機主機與Berkeley網路上的主機之間的所有通訊封包(nt: ucb-ether, 此處可理解為'Berkeley網路'的網路位址,此表達式最原始的意義可表達為: 列印網路位址為ucb-ether的所有資料包)

tcpdump net ucb-ether
登入後複製

列印所有透過網關snup的ftp資料包(注意, 表達式被單引號括起來了, 這可以防止shell對其中的括號進行錯誤解析)

tcpdump 'gateway snup and (port ftp or ftp-data)'
登入後複製

列印所有來源位址或目標位址是本機的IP封包

# (如果本地網路透過網關連到了另一個網路, 則另一個網路並不能算作本地網路.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網路的名字)

tcpdump ip and not net localnet
登入後複製
監視指定協定的封包

列印TCP會話中的開始和結束封包, 且封包的來源或目的不是本地網路上的主機.(nt: localnet, 實際使用時要真正替換成本地網絡的名字))

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
登入後複製

打印所有源或目的端口是80, 網絡層協議為IPv4, 並且含有數據,而不是SYN,FIN以及ACK-only等不含數據的封包.(ipv6的版本的表達式可做練習)

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
登入後複製

(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 []'.)

列印長度超過576位元組, 且網關位址是snup的IP封包

tcpdump 'gateway snup and ip[2:2] > 576'
登入後複製

列印所有IP層廣播或多重播放的封包, 但不是實體以太網層的廣播或多播資料報

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
登入後複製

列印除'echo request'或'echo reply'類型以外的ICMP資料包( 例如,需要列印所有非ping 程式產生的資料包時可用到此表達式.
(nt: 'echo reuqest' 與'echo reply' 這兩種類型的ICMP封包通常由ping程式產生))

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
登入後複製
tcpdump 與wireshark

Wireshark (以前是ethereal)是Windows下非常簡單好用的抓包工具。但在Linux下很難找到一個好用的圖形化抓包工具。
還好有Tcpdump。我們可以用Tcpdump Wireshark 的完美組合實作:在 Linux 裡抓包,然後在Windows 裡分析套件。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
登入後複製

使用tcpdump抓取HTTP包

tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
登入後複製

tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

1、抓取回环网口的包:tcpdump -i lo

2、防止包截断:tcpdump -s0

3、以数字显示主机及端口:tcpdump -n

第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&;或运算 是'or' ,'||';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。

普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

# tcpdump 
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
                       0000 0000 0080 0000 1007 cf08 0900 0000
                       0e80 0000 902b 4695 0980 8701 0014 0002
                       000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
                       ffff 0060 0004 ffff ffff ffff ffff ffff
                       0452 ffff ffff 0000 e85b 6d85 4008 0002
                       0640 4d41 5354 4552 5f57 4542 0000 0000
                       0000 00
登入後複製

使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
使用-c参数指定要监听的数据包数量,
使用-w参数指定将监听到的数据包写入文件中保存
A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

#tcpdump host 210.27.48.1
登入後複製

B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用 括号时,一定要

#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
登入後複製
登入後複製

C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
登入後複製
登入後複製
登入後複製

D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

#tcpdump tcp port 23 host 210.27.48.1
登入後複製
登入後複製

E 对本机的udp 123 端口进行监视 123 为ntp的服务端口

# tcpdump udp port 123
登入後複製

F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:

#tcpdump -i eth0 src host hostname
登入後複製

G 下面的命令可以监视所有送到主机hostname的数据包:

#tcpdump -i eth0 dst host hostname
登入後複製

H  我们还可以监视通过指定网关的数据包:

#tcpdump -i eth0 gateway Gatewayname
登入後複製

I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:

#tcpdump -i eth0 host hostname and port 80
登入後複製

J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
登入後複製
登入後複製
登入後複製

K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
:(在命令行中适用 括号时,一定要

#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
登入後複製
登入後複製

L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
登入後複製
登入後複製
登入後複製

M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

#tcpdump tcp port 23 host 210.27.48.1
登入後複製
登入後複製

第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。

#tcpdump –i eth0 host hostname and dst port 80  目的端口是80
登入後複製

或者

#tcpdump –i eth0 host hostname and src port 80  源端口是80  一般是提供http的服务的主机
登入後複製

如果条件很多的话  要在条件之前加and 或 or 或 not

#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
登入後複製

如果在ethernet 使用混杂模式 系统的日志将会记录
May  7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May  7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May  7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

# tcpdump   -i eth1 src  host 211.167.237.199
00:02:03.096713 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010208:2010352(144) ack 33377 win 8576
00:02:03.096951 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010352:2010496(144) ack 33377 win 8576
00:02:03.100928 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010496:2010640(144) ack 33377 win 8576
00:02:03.101165 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010640:2010784(144) ack 33377 win 8576
00:02:03.102554 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010784:2010928(144) ack 33425 win 8576
登入後複製

表明在00:02:03点的时候,211.167.237.199通过ssh源端口连接到221.216.165.189的1467端口

#tcpdump -i eth1 src host 211.167.237.199 and dst port 1467
00:09:27.603075 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180400:180544(144) ack 2833 win 8576
00:09:27.605631 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180544:180688(144) ack 2881 win 8576
登入後複製

截获所有由eth0进入、源地址(src)为192.168.0.5的主机(host),并且(and)目标(dst)端口(port)为80的数据包

观看网卡传送、接收数据包的状态

$ netstat  -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500  0  14639   0      0      0    5705    119    0     0   BMRU

Iface:  网卡
RX-OK RX-ERR RX-DRP RX-OVR : 网卡正确接收数据包的数量以及发生错误、流失、碰撞的总数
TX-OK TX-ERR TX-DRP TX-OVR : 网卡正确发送数据包的数量以及发生错误、流失、碰撞的总数
登入後複製

以上是CentOS下如何使用tcpdump網路抓包的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板