>  기사  >  운영 및 유지보수  >  CentOS에서 tcpdump를 사용하여 네트워크 패킷을 캡처하는 방법

CentOS에서 tcpdump를 사용하여 네트워크 패킷을 캡처하는 방법

藏色散人
藏色散人앞으로
2021-01-04 14:26:533431검색

centos 튜토리얼 칼럼에서는 tcpdump를 사용하여 CentOS에서 네트워크 패킷을 캡처하는 방법을 소개합니다. 도움이 필요한 친구들에게 도움이 되기를 바랍니다!

CentOS에서 tcpdump를 사용하여 네트워크 패킷을 캡처하는 방법

tcpdump는 Linux에서 네트워크 데이터 패킷을 가로채고 분석하는 도구입니다. 시스템 성능을 최적화하기 위한 훌륭한 참고 가치가 있습니다.

Installation

tcpdump는 기본적으로 설치되지 않습니다. CentOS에서 설치:

yum install tcpdump

Ubuntu에서 설치:

apt-get install tcpdump
기본적으로 시작
tcpdump

일반적인 상황에서 tcpdump를 직접 시작하면 데이터의 첫 번째 네트워크 인터페이스에서 모든 흐름을 모니터링합니다. 패킷.

지정된 네트워크 인터페이스의 데이터 패킷을 모니터링하세요(네트워크 카드를 확인하세요)

tcpdump -i eth1

네트워크 카드를 지정하지 않으면 기본적으로 tcpdump는 첫 번째 네트워크 인터페이스(일반적으로 eth0)만 모니터링합니다. 네트워크 인터페이스를 지정하지 마세요.

지정된 호스트의 데이터 패킷을 모니터링합니다

일몰에 들어오거나 나가는 모든 데이터 패킷을 인쇄합니다.

tcpdump host sundown

IP를 지정할 수도 있습니다. 예를 들어 호스트 210.27.48.1

에서 주고받는 모든 데이터 패킷을 가로챌 수도 있습니다.
tcpdump host 210.27.48.1

Print 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 \)

사이의 통신을 가로채는 helios와 hot 또는 ace

tcpdump ip host ace and not helios

와 통신하는 데이터 패킷을 인쇄합니다. ace와 다른 호스트 사이에 통신되는 IP 데이터 패킷을 인쇄합니다. 그러나 helios에는 데이터 패킷이 포함되지 않습니다.

tcpdump ip host 210.27.48.1 and ! 210.27.48.2

호스트 210.27.48.2를 제외하고 호스트 210.27.48.1과 통신하는 모든 호스트의 IP 패킷을 얻으려면 다음 명령을 사용하십시오:

tcpdump -i eth0 src host hostname

hostname

tcpdump -i eth0 dst host hostname
가 보낸 모든 데이터를 차단합니다
호스트 이름 호스트로 전송되는 모든 데이터 패킷을 모니터링합니다. 호스트 이름
tcpdump tcp port 23 and host 210.27.48.1

지정된 호스트 및 포트의 데이터 패킷을 모니터링합니다

호스트 210.27.48.1에서 받거나 보내는 텔넷 패킷을 얻으려면 다음 명령을 사용하세요

tcpdump udp port 123
Udp 로컬 머신의 123 포트 ntp의 서비스 포트에 대한 123번 모니터
tcpdump net ucb-ether

지정된 네트워크의 패킷 모니터링

로컬 호스트와 Berkeley 네트워크의 호스트 사이의 모든 통신 패킷을 인쇄합니다(nt: ucb-ether, 여기서는 'Berkeley 네트워크'의 네트워크 주소로 이해하면 이 표현의 원래 의미는 다음과 같이 표현할 수 있습니다. 네트워크 주소가 ucb-ether인 모든 패킷을 인쇄합니다.

tcpdump 'gateway snup and (port ftp or ftp-data)'

게이트웨이 snup을 통과하는 모든 ftp 패킷을 인쇄합니다. 표현식은 작은 따옴표로 묶여 있어 쉘이 대괄호를 잘못 구문 분석하는 것을 방지합니다.)

tcpdump ip and not net localnet

소스 또는 대상 주소가 로컬 호스트인 모든 IP 패킷을 인쇄합니다

(로컬 네트워크가 게이트웨이를 통해 다른 네트워크에 연결된 경우, 다른 네트워크는 로컬 네트워크로 간주할 수 없습니다. (nt: 이 문장의 번역이 왜곡되어 보완이 필요함).localnet은 실제로 사용할 때 로컬 네트워크 이름으로 바꿔야 합니다.
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

의 데이터 패킷을 모니터링하세요. 지정된 프로토콜

TCP 세션 데이터 패킷의 시작과 끝을 인쇄하며, 데이터 패킷의 소스 또는 대상이 로컬 네트워크의 호스트가 아닙니다(nt: localnet, 로컬 이름으로 바꿔야 합니다. 실제로 사용시 네트워크))

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

인쇄 소스 또는 대상 포트는 모두 80, 네트워크 계층 프로토콜 IPv4이며 데이터를 포함하지 않는 SYN, FIN 및 ACK 전용 데이터 패킷이 아닌 데이터를 포함합니다. ipv6 버전의 표현을 연습으로 사용할 수 있습니다)

tcpdump 'gateway snup and ip[2:2] > 576'

(nt: ip[2:2 ]는 전체 IP 데이터 패킷의 길이를 나타냅니다. (ip[0]&0xf)<< 2) ip 데이터 패킷 헤더의 길이를 나타냅니다(ip[0]&0xf는 패킷의 IHL 필드를 나타내며 이 필드의 단위는 32bit입니다.

를 바이트 수로 변환하려면 4를 곱해야 합니다) 즉, 2만큼 왼쪽으로 이동합니다. (tcp[12]&0xf0)>>4는 tcp 헤더의 길이를 나타냅니다. 이 필드의 단위도 32비트입니다. 비트 수로 변환하면 ((tcp) [12]&0xf0) >> 4) &0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0은 전체 IP 패킷의 길이에서 ip 헤더의 길이에서

tcp 헤더를 뺀 값입니다. 길이가 0이 아닙니다. 이는 실제로 IP 패킷에 데이터가 있다는 의미입니다. ipv6 버전의 경우 '페이로드 길이'의 차이만 고려하면 됩니다. ipv6 헤더와 'tcp 헤더 길이' 및 'ip []' 표현식을 'ip6[]'로 바꿔야 합니다.)

길이가 576바이트를 초과하고 게이트웨이 주소가 snup

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
인 IP 패킷을 인쇄합니다. 모든 IP 계층 브로드캐스트 또는 멀티캐스트 패킷을 인쇄하지만 네트워크 계층에서 물리적 이더넷 브로드캐스트 또는 멀티캐스트 데이터그램은 인쇄하지 않습니다.

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

'에코 요청' 또는 '에코 응답' 유형 이외의 ICMP 데이터 패킷을 인쇄합니다(예를 들어 다음 표현식을 사용할 수 있습니다) ping이 아닌 프로그램에서 생성된 모든 데이터 패킷을 인쇄해야 할 때. (nt: 'echo reuqest' 및 'echo reply' 이 두 가지 유형의 ICMP 패킷은 일반적으로 ping 프로그램에서 생성됩니다.))
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 및 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으로 문의하시기 바랍니다. 삭제