以下对Linux中抓包与网络分析相关的netstat、ss、lsof、tcpdump命令,以及/proc/[pid]/fd目录进行了说明。
1. 前言
相关内容如下:
Windows抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104609924
Linux抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104616502
Java程序网络连接分析方法总结:https://blog.csdn.net/a82514921/article/details/104616519
iptables模拟网络连接问题并分析:https://blog.csdn.net/a82514921/article/details/104616548
2. Linux环境
以下使用Linux版本为2.6.32-642.6.2.el6.x86_64。
2.1 netstat
man netstat的说明为“打印网络连接,路由表,接口统计信息,伪装连接和多播成员资格”。
2.1.1 常用选项
l -a, --all
显示监听和非监听套接字。
l -l, --listening
仅显示监听状态的套接字。
-a会覆盖-l选项。
l --numeric , -n
显示数字地址,而不是尝试确定符号主机,端口或用户名。
当不使用-n选项时,地址可能以主机名形式显示,端口可能以协议名称形式显示,如“localtest:http”。
当使用-n选项时,地址会显示为数字形式的IP,端口也以数字形式显示,如“127.0.0.1:80”。
l -p, --program
显示每个套接字所属程序的PID和名称。
需要root权限才能看到全部进程信息。
l --tcp|-t
仅查看TCP连接。
-a不会覆盖-t选项。
2.1.2 使用示例
执行“netstat -anp|grep :80”,查看全部连接,IP端口使用数字形式,展示连接对应的进程信息,结果如下:
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 17685/nginx tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN - tcp 0 0 :::8000 :::* LISTEN 29482/./node/bin/no tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 9187/java tcp 0 0 ::ffff:127.0.0.1:8007 :::* LISTEN 29457/java tcp 0 0 :::8011 :::* LISTEN 9187/java tcp 0 0 :::8090 :::* LISTEN 9187/java |
执行“netstat -lnpt”,查看TCP监听状态的连接,IP端口使用数字形式,展示连接对应的进程信息,结果如下:
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN - |
2.2 ss
man ss的说明为“ss用于转储套接字统计信息,允许显示与netstat类似的信息,可以显示比其他工具更多的TCP和状态信息”。
以下使用的ss版本为“ss utility, iproute2-ss091226”(使用“ss -v”查看)。
2.2.1 常用选项
l -4, --ipv4
只显示IPv4的套接字(-f inet的别名)。
l -6, --ipv6
只显示IPv4的套接字(-f inet6的别名)。
l -a, --all
显示所有的套接字。
l -e, --extended
显示详情的套接字信息。
包含-o选项显示的时间信息。
l -l, --listening
显示监听状态的套接字。
-a选项不会覆盖-l选项。
l -n, --numeric
不尝试解析服务名称。
当不使用-n选项时,地址可能以主机名形式显示,端口可能以协议名称形式显示,如“localtest:http”。
当使用-n选项时,地址会显示为数字形式的IP,端口也以数字形式显示,如“127.0.0.1:80”。
l -o, --options
显示时间信息。
l -p, --processes
显示使用套接字的进程信息。
当缺少权限时,会导致无法显示套接字的进程信息。
l -s, --summary
显示汇总数据。
l -t, --tcp
只显示TCP套接字。
-a选项会覆盖-t选项。
2.2.2 过滤器
ss命令支持使用过滤器对显示结果进行过滤。
ss命令可以使用state对套接字状态进行过滤,支持过滤的状态包括established、syn-sent、syn-recv、fin-wait-1、fin-wait-2、time-wait、closed、close-wait、last-ack、listening、closing。
state过滤器使用格式为“state TCP-STATE”,如“ss state established”。
src/dst可以分别对本地/远程的IP地址或端口进行过滤,可以仅根据IP地址或端口进行过滤,也可以同时根据IP地址与端口进行过滤。
src/dst过滤器的使用格式如下:
格式示例 | 说明 |
src/dst [IP] | 仅根据本地/远程的IP地址过滤 |
src/dst :[端口] | 仅根据本地/远程的端口地址过滤 |
src/dst [IP]:[端口] | 根据本地/远程的IP地址与端口过滤 |
多个src/dst过滤器之间还可以使用and/or条件。
src/dst过滤器可以直接使用,也可以使用“'( )'”包含起来,如以下用法均支持(当使用“'( )'”包含起来,单引号与括号需要为半角,括号与其中的内容需要有空格)。
ss '( dst 192.168.0.1:8080 )' |
ss '( dst 192.168.0.1:8080 or dst 192.168.0.1:80 )' |
ss dst 192.168.0.1:8080 |
ss dst 192.168.0.1:8080 or dst 192.168.0.1:80 |
sport/dport过滤器可以分别对本地/远程的端口进行过滤。
sport/dport过滤器的使用格式为“sport/dport [运算符] :[端口]”(运算符前后的空格不能省略)。
运算符 | 说明 |
eq或= | 等于 |
gt或\> | 大于 |
lt或\< | 小于 |
多个sport/dport过滤器之间还可以使用and/or条件。
sport/dport过滤器可以直接使用,也可以使用“'( )'”包含起来,如以下用法均支持(当使用“'( )'”包含起来,单引号与括号需要为半角,括号与其中的内容需要有空格)。
ss '( dport = :8080 )' |
ss '( dport = :8080 or dport = :80 )' |
ss dport = :8080 |
ss dport = :8080 or dport = :80 |
2.2.3 使用示例
执行“ss -4elntp|cat”,查看IPv4,状态为监听,协议为TCP的套接字信息,显示套接字详情信息,不尝试解析服务名称,显示套接字对应的进程信息,结果如下:
执行“ss -4antp state established|cat”,查看IPv4,状态为连接成功,协议为TCP的全部套接字信息,不尝试解析服务名称,显示套接字对应的进程信息,结果如下:
Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.0.1:1000 192.168.0.1:4728 0 0 192.168.0.1:8080 192.168.0.2:6917 0 0 192.168.0.1:5506 192.168.0.2:1911 0 0 192.168.0.1:4812 192.168.0.2:1234 users:(("mysql",28741,3)) |
执行“ss -antp sport lt :1000|cat”,查看协议为TCP,本地端口小于1000的全部套接字信息,不尝试解析服务名称,显示套接字对应的进程信息,结果如下:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::111 :::* users:(("rpcbind",1104,11)) LISTEN 0 128 *:111 *:* users:(("rpcbind",1104,8)) LISTEN 0 128 *:80 *:* users:(("nginx",31982,6),("nginx",31983,6)) LISTEN 0 128 *:443 *:* users:(("nginx",31982,7),("nginx",31983,7)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:9994 users:(("nginx",31983,17)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:34664 users:(("nginx",31983,31)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:34662 users:(("nginx",31983,22)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:34660 users:(("nginx",31983,20)) |
执行“ss -antp sport lt :1000 and dport gt :30000|cat”,查看协议为TCP,本地端口小于1000,远程端口大于30000的全部套接字信息,不尝试解析服务名称,显示套接字对应的进程信息,结果如下:
State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.1:443 192.168.0.2:46870 users:(("nginx",31983,37)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:38786 users:(("nginx",31983,19)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:52576 users:(("nginx",31983,13)) ESTAB 0 0 192.168.0.1:443 192.168.0.2:33737 users:(("nginx",31983,44)) |
执行“ss -antp src 192.168.0.1 and dst 192.168.0.2:80|cat”,查看协议为TCP,本地IP为192.168.0.1,远程IP为192.168.0.2,远程端口为80的全部套接字信息,不尝试解析服务名称,显示套接字对应的进程信息,结果如下:
State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 ::ffff:192.168.0.1:58266 ::ffff:192.168.0.2:80 users:(("java",24293,159)) ESTAB 0 0 ::ffff:192.168.0.1:47018 ::ffff:192.168.0.2:80 users:(("java",3233,154)) ESTAB 0 0 ::ffff:192.168.0.1:58664 ::ffff:192.168.0.2:80 users:(("java",29704,112)) ESTAB 0 0 ::ffff:192.168.0.1:47022 ::ffff:192.168.0.2:80 users:(("java",3233,156)) |
ss命令-s选项可以查看套接字汇总数据,包括各类协议的套接字总数,TCP协议各种状态的套接字数量,“ss -s”执行结果如下所示:
Total: 472 (kernel 498) TCP: 343 (estab 255, closed 36, orphaned 0, synrecv 0, timewait 35/0), ports 311
Transport Total IP IPv6 * 498 - - RAW 0 0 0 UDP 13 7 6 TCP 307 178 129 INET 320 185 135 FRAG 0 0 0 |
2.2.4 结合其他命令
ss输出信息各列的间隔很宽,不便于查看,如下图所示:
当ss命令使用“-p”选项显示进程信息时,进程信息会显示在下一行,不便于查看与统计,如下图所示:
使用cat或column命令,可以优化ss的输出格式,使各列的间隔变窄,进程信息在同一行显示。
执行“ss -np|cat”,结果如下所示:
执行“ss -np|column -t”,结果如下所示:
watch命令可以按照指定周期执行程序,全屏显示执行结果,直到出现中断。
-n选项可以指定周期秒数,-d/--differences选项可以高亮发生变化的内容。
如“watch -d -n 1 ss -s”,可以每秒执行一次“ss -s”,查看套接字汇总数据,并高亮发生变化的内容,可用于监控当前机器的连接情况。
如“watch -n 1 ss -aentp src :80 dst 192.168.0.1”,每秒执行一次ss命令,可用于监控特定端口与IP的连接情况。
2.3 lsof
man lsof的说明为“列出进程打开的打开文件信息。打开的文件可以是常规文件,目录,块特殊文件,字符特殊文件,执行文本引用,库,流或网络文件(Internet套接字,NFS文件或UNIX域套接字)。”。
lsof命令只能查看当前用户拥有权限的文件信息,若需要查看全部用户的文件信息,需要使用root权限执行。
以下使用的lsof版本为“4.82”(使用“lsof -v”查看)。
2.3.1 查看网络信息相关选项
使用lsof命令可以查看套接字(也是文件)信息,以下为查看网络信息时可能使用的相关选项。
l -i
此选项选择网络地址与指定的地址匹配的文件列表,如果未指定地址,则选择所有的因特网与x.25(HP-UX)网络文件的列表。
-i选项的格式为“[46][protocol][@hostname|hostaddr][:service|port]”。
46:指定IP版本,4代表IPv4,6代表IPv6;
protocol:指定协议名称,如TCP,UDP;
hostname:指定主机名;
hostaddr:指定点状的数字因特网IPv4地址;
service:指定服务名称,如smtp,或服务名称的列表;
port:指定端口,或端口列表。
l -P
禁止将网络文件的端口由数字形式转换为对应的名称。
当不使用-n选项时,端口可能以协议名称形式显示,如“:http”。
当使用-n选项时,端口以数字形式显示,如“:80”。
l -n
禁止将网络文件的地址由数字形式转换为主机名
当不使用-P选项时,地址可能以主机名形式显示,如“localtest”。
当使用-P选项时,地址会显示为数字形式的IP,如“127.0.0.1”。
l -p
根据PID选择或排除需要列出的文件。
当指定的PID以“^”开头时,代表需要排除对应PID的文件;否则代表需要选择对应PID的文件。
各PID之间使用半角逗号进行分隔,如“123,^456”。
l -u
根据用户名或用户ID选择或排除需要列出的文件。
当指定的用户名或用户ID以“^”开头时,代表需要排除对应用户名或用户ID的文件;否则代表需要选择对应用户名或用户ID的文件。
用户名或用户ID之间使用半角逗号进行分隔,如“548,root”。
l -r
以重复模板运行lsof。
-r选项的格式为“+|-r [t[m<fmt>]]”。
+r代表当指定条件的文件不存在时,自动结束执行。-r代表lsof会一直执行,直到收到中断或退出信号。
t代表执行的时间间隔秒数。
m<fmt>代表每次输出时末尾的标志信息,<fmt>为末尾的标志信息,默认的标志信息为“========”。
lsof重复运行时,会滚动输出,之前输出的内容也会在屏幕保留。
例如“-r '1m--'”,代表一直重复执行lsof,每秒执行一次,末尾的标志信息为“--”。
l -a
使不同选项之间为“与”的关系,即全部选项都满足时,才输出对应的结果。
对于上述-i,-p,-u等选项,若只需要输出满足全部条件的结果,需要使用-a选项。
当使用了多个选项,但未使用-a选项时,输出的结果可能不是满足全部条件的结果,可能与预期不一致。
2.3.2 使用示例
执行“lsof -a -i -nP -p 18816”,查看PID为18816的进程打开的网络文件,不尝试解析服务及端口名称,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 18816 app 32u IPv6 2163659618 0t0 TCP 192.168.0.1:846 (LISTEN) java 18816 app 44u IPv6 2163659623 0t0 TCP *:371 (LISTEN) java 18816 app 45u IPv6 2163659624 0t0 TCP *:842 (LISTEN) java 18816 app 46u IPv6 2163659626 0t0 TCP *:291 (LISTEN) java 18816 app 51u IPv6 2163659683 0t0 TCP *:843 (LISTEN) java 18816 app 58u IPv6 2163660260 0t0 TCP 127.0.0.1:841 (LISTEN) java 18816 app 59u IPv6 2163968614 0t0 TCP 192.168.0.1:242->192.168.0.2:911 (ESTABLISHED) java 18816 app 167u IPv6 2163660198 0t0 TCP 192.168.0.1:914->192.168.0.2:911 (ESTABLISHED) java 18816 app 174u IPv6 2163660134 0t0 TCP 192.168.0.1:774->192.168.0.2:876 (ESTABLISHED) java 18816 app 175u IPv6 2163660199 0t0 TCP 192.168.0.1:526->192.168.0.2:911 (ESTABLISHED) java 18816 app 182u IPv6 2163660168 0t0 TCP 192.168.0.1:780->192.168.0.2:876 (ESTABLISHED) |
执行“lsof -a -nP -i 4 -i TCP -u app”,查看用户app打开的IPv4的TCP网络文件,不尝试解析服务及端口名称,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 3622 app 3u IPv4 2161485807 0t0 TCP 192.168.0.1:12345->192.168.0.2:45734 (ESTABLISHED) sshd 5695 app 3u IPv4 2140552384 0t0 TCP 192.168.0.1:12345->192.168.0.2:55602 (ESTABLISHED) java 15545 app 40u IPv4 522873567 0t0 TCP 127.0.0.1:391 (LISTEN) |
执行“lsof -nP -i@192.168.0.2”,查看IP为“192.168.0.2”的网络文件,不尝试解析服务及端口名称,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1166 app 153u IPv6 598097027 0t0 TCP 192.168.0.1:35512->192.168.0.2:1234 (ESTABLISHED) java 1166 app 154u IPv6 598097028 0t0 TCP 192.168.0.1:35514->192.168.0.2:1234 (ESTABLISHED) java 1166 app 155u IPv6 598097029 0t0 TCP 192.168.0.1:35516->192.168.0.2:1234 (ESTABLISHED) |
执行“lsof -nP -i :1234”,查看端口为1234的网络文件,不尝试解析服务及端口名称,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1166 app 148u IPv6 598097003 0t0 TCP 192.168.0.1:35502->192.168.0.2:1234 (ESTABLISHED) java 1166 app 149u IPv6 598097023 0t0 TCP 192.168.0.1:35504->192.168.0.2:1234 (ESTABLISHED) java 1166 app 150u IPv6 598097024 0t0 TCP 192.168.0.1:35506->192.168.0.2:1234 (ESTABLISHED) |
执行“lsof -a -nP -p 1166 -i@192.168.0.2:1234”,查看PID为1166进程打开的,IP为192.168.0.2,端口为1234的网络文件,不尝试解析服务及端口名称,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1166 app 151u IPv6 598097025 0t0 TCP 192.168.0.1:35508->192.168.0.2:1234 (ESTABLISHED) java 1166 app 152u IPv6 598097026 0t0 TCP 192.168.0.1:35510->192.168.0.2:1234 (ESTABLISHED) java 1166 app 153u IPv6 598097027 0t0 TCP 192.168.0.1:35512->192.168.0.2:1234 (ESTABLISHED) |
执行“lsof -r 1 -nP -a -i 4 -u app”,查看用户app打开的IPv4网络文件,不尝试解析服务及端口名称,重复执行,每秒执行一次,结果如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 14757 app 4u IPv4 208971711 0t0 TCP 192.168.0.1:303 (LISTEN) redis-ser 14764 app 5u IPv4 208971742 0t0 TCP *:304 (LISTEN) redis-ser 14764 app 6u IPv4 389318856 0t0 TCP 192.168.0.1:374->192.168.0.1:203 (ESTABLISHED) redis-ser 14764 app 8u IPv4 298593527 0t0 TCP 192.168.0.1:214->192.168.0.1:528 (ESTABLISHED) java 21637 app 99u IPv4 598615690 0t0 TCP *:505 (LISTEN) ======= ... |
2.4 /proc/[pid]/fd
2.4.1 proc文件系统说明
proc文件系统是进程信息伪文件系统,用作内核数据结构的接口。它通常挂载为“/proc”路径。其中大多数内容是只读的,但有些文件允许更改内核变量。
man proc可以查看proc文件系统的说明。
2.4.2 /proc/[pid]/fd目录说明
/proc/[pid]/fd是一个子目录,包含了当前进程打开的文件,每个文件有一个条目,以文件描述符命名,以及链接到实际文件的符号。
0代表标准输入文件,1代表标准输出文件,2代表标准错误文件,如下所示:
lrwx------ 1 app apps 64 Jan 21 15:26 0 -> /dev/null l-wx------ 1 app apps 64 Jan 21 15:26 1 -> /data/app/logs/xxx/xxx.out l-wx------ 1 app apps 64 Jan 21 15:26 2 -> /data/app/logs/xxx/xxx.out |
2.4.3 /proc/[pid]/fd目录的网络文件
/proc/[pid]/fd目录中也包含了当前进程打开的网络文件信息。
进入某个进程的/proc/15089/fd目录目录,执行“ls -l|grep socket”,仅查看当前进程的socket信息,如下所示:
lrwx------ 1 app apps 64 Jan 21 15:27 192 -> socket:[601279716] lr-x------ 1 app apps 64 Jan 21 15:26 95 -> socket:[601272931] lrwx------ 1 app apps 64 Jan 21 15:26 96 -> socket:[601272288] |
可以看到socket文件名的形式为“socket:[xxx]”,xxx为套接字的索引节点编号。
使用ss或lsof命令,可以根据套接字的索引节点编号获得该socket的文件信息。如下所示。
ss命令的-e选项可以查看套接字的详情信息,其中的ino属性为套接字在虚拟文件系统中的索引节点编号(见http://man7.org/linux/man-pages/man8/ss.8.html)。
执行“ss -anpe|grep 15089|grep 601279716”命令,查看属于PID为15089进程的,索引节点编号为601279716的套接字信息,如下所示:
State Recv-Q Send-Q Local Address:Port Peer Address:Port |
ESTAB 0 0 ::ffff:192.168.0.1:4826 ::ffff:192.168.0.2:1911 users:(("java",15089,192)) uid:6001 ino:601279716 sk:ffff8800370b8800 |
通过ss命令,可以根据套接字的索引节点信息查看套接字详情信息。
执行“lsof -a -p 15089 -i -nP|grep 601279716”命令,查看属于PID为15089进程的,索引节点编号为601279716的套接字信息,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEz |
java 15089 app 192u IPv6 601279716 0t0 TCP 192.168.0.1:4826->192.168.0.2:1911 (ESTABLISHED) |
通过lsof命令,可以根据套接字的索引节点信息查看套接字详情信息。
2.5 tcpdump
man tcpdump的说明为“在网络接口捕获数据,并打印出满足表达式的数据包内容”。
tcpdump的使用说明可参考http://www.tcpdump.org/manpages/tcpdump.1.html。
执行tcpdump命令时需要有root权限。
2.5.1 常用选项
l -c
当使用-c选项时,tcpdump会在接收到指定次数的数据包后自动退出;若不使用-c选项,则需要手工退出。
使用方式为“-c [次数]”。
l -D
打印当前系统中tcpdump可以捕获到数据包的网络接口列表。对于每个网络接口,显示编号和接口名称,如果可能的话显示接口的文字描述。
l -e
在每个转储行打印链接级头信息。该选项可用于打印以太网及IEEE 802.11等协议的MAC地址。
l -i
指定需要监听的网络接口。
如果未指定-i选项,tcpdump在系统接口列表中搜索编号最小的已配置接口(不包括环回地址接口)并使用。
在Linux 2.2或更高的内核版本的系统,可以使用“any”参数对所有接口的数据包进行捕获。“any”无法在混杂模式下使用。
如果支持-D选项,可以使用-D选项打印的接口编号用于-i选项的接口参数。
使用方式为“-i [接口]”。
l -n
不将地址转换为名称,该选项可以避免DNS解析。
当不使用-n选项时,地址可能以主机名形式显示,如“localtest”。
当使用-n选项时,地址会显示为数字形式的IP,如“127.0.0.1”。
l -nn
不将地址及端口转换为名称。
当不使用-nn及-n选项时,地址可能以主机名形式显示,端口可能以协议名称形式显示,如“localtest:http”。
当使用-nn选项时,地址会显示为数字形式的IP,端口也以数字形式显示,如“127.0.0.1:80”。
l -s
设置捕获数据包的大小,默认值为65535。超过该大小的数据包会被截断。
将该选项值设置为0会使用默认值65535,以便与最近的旧版本进行兼容(旧版本中捕获数据包大小默认值为68或96,0代表捕获整个数据包)。
使用方式为“-s [捕获长度]”。
l -w
设置将原始数据包保存至文件,而不是解析并打印出来。
使用方式为“-w [文件名]”。
数据包文件可以使用Wireshark等工具打开进行分析查看。
l -X
在解析和打印时,除了打印每个数据包的标题外,还十六进制和ASCII格式打印每个数据包的数据(隐藏链接级别头)。
2.5.2 表达式
选择要转储的数据包。如果没有指定表达式,则网络上的所有数据包都将被转储。否则,只会转储表达式为真的数据包。
tcpdump的表达式与Wireshark的捕获过滤器的语法相同,参考前文Wireshark相关内容。
2.5.3 使用示例
执行“tcpdump -D”,查看支持进行捕获的网络接口列表,如下所示:
1.eth0 2.usbmon1 (USB bus number 1) 3.any (Pseudo-device that captures on all interfaces) 4.lo |
执行“tcpdump -i eth0 -c 5 -nn”或“tcpdump -i 1 -c 5 -nn”,对“eth0”网络接口进行数据捕获,捕获到5个数据包后自动退出,不将地址及端口转换为名称,如下所示:
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 20:53:20.140344 IP 192.168.0.1.300 > 192.168.0.2.4422: Flags [P.], seq 550528428:550528620, ack 2069444384, win 185, options [nop,nop,TS val 2443051418 ecr 1954557451], length 192 20:53:20.141284 IP 192.168.0.1.356 > 192.168.0.2.1911: Flags [.], ack 2018722143, win 757, options [nop,nop,TS val 2443051419 ecr 2971111350], length 0 20:53:20.141314 IP 192.168.0.1.300 > 192.168.0.2.4422: Flags [P.], seq 192:416, ack 1, win 185, options [nop,nop,TS val 2443051419 ecr 1954557451], length 224 20:53:20.142316 IP 192.168.0.1.300 > 192.168.0.2.4422: Flags [P.], seq 416:784, ack 1, win 185, options [nop,nop,TS val 2443051420 ecr 1954557451], length 368 20:53:20.142409 IP 192.168.0.1.552 > 192.168.0.2.1911: Flags [.], ack 3785506361, win 757, options [nop,nop,TS val 2443051420 ecr 2971126768], length 0 5 packets captured 5 packets received by filter 0 packets dropped by kernel |
执行“tcpdump -i any -c 5 -nn -e tcp and host 192.168.0.2 and port 1234”,对全部网络接口进行数据捕获,捕获到5个数据包后自动退出,不将地址及端口转换为名称,显示MAC地址,仅捕获协议为TCP且地址为“192.168.0.2”且端口为1234的数据包,如下所示:
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 20:57:17.225255 Out 52:xx:xx:xx:xx:03 ethertype IPv4 (0x0800), length 77: 192.168.0.1.5280 > 192.168.0.2.1234: Flags [P.], seq 110374823:110374844, ack 1115179185, win 24572, length 21 20:57:17.225808 In fe:xx:xx:xx:xx:6a ethertype IPv4 (0x0800), length 67: 192.168.0.2.1234 > 192.168.0.1.5280: Flags [P.], seq 1:12, ack 21, win 1338, length 11 20:57:17.225827 Out 52:xx:xx:xx:xx:03 ethertype IPv4 (0x0800), length 56: 192.168.0.1.5280 > 192.168.0.2.1234: Flags [.], ack 12, win 24572, length 0 20:57:17.225980 Out 52:xx:xx:xx:xx:03 ethertype IPv4 (0x0800), length 136: 192.168.0.1.5280 > 192.168.0.2.1234: Flags [P.], seq 21:101, ack 12, win 24572, length 80 20:57:17.226488 In fe:xx:xx:xx:xx:6a ethertype IPv4 (0x0800), length 543: 192.168.0.2.1234 > 192.168.0.1.5280: Flags [P.], seq 12:499, ack 101, win 1338, length 487 5 packets captured 7 packets received by filter 0 packets dropped by kernel |
当使用-e参数显示MAC地址后,可查看ifconfig命令显示的各网卡的MAC地址,确认对应的数据包通过哪块网卡。
执行“tcpdump -nn -X port 80”,对默认网络接口进行数据捕获,不自动退出,不将地址及端口转换为名称,仅捕获端口为80的数据包,打印数据包内容,如下所示:
20:50:30.286195 IP 192.168.0.2.80 > 192.168.0.1.35224: Flags [P.], seq 1:128, ack 454, win 8372, length 127 0x0000: 4500 00a7 7a62 4000 3806 afb7 a9fe 0004 E...zb@.8....... 0x0010: 0a6b 63ca 0050 8998 61b3 75ba 3dcd 3eb0 .kc..P..a.u.=.>. 0x0020: 5018 20b4 e7b7 0000 4854 5450 2f31 2e31 P.......HTTP/1.1 0x0030: 2032 3030 204f 4b0d 0a43 6f6e 6e65 6374 .200.OK..Connect 0x0040: 696f 6e3a 2063 6c6f 7365 0d0a 436f 6e74 ion:.close..Cont 0x0050: 656e 742d 4c65 6e67 7468 3a20 3639 0d0a ent-Length:.69.. 0x0060: 0d0a 7b22 7265 7475 726e 5661 6c75 6522 ..{"returnValue" 0x0070: 3a30 2c22 7265 7475 726e 436f 6465 223a :0,"returnCode": 0x0080: 302c 226d 7367 223a 224f 4b22 2c22 7365 0,"msg":"OK","se 0x0090: 7122 3a38 3437 3639 3430 3931 3938 3332 q":8476940919832 0x00a0: 3437 3033 3932 7d 470392} |
执行“tcpdump -w test.cap 'tcp and tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'”,对默认网络接口进行数据捕获,不自动退出,仅捕获协议为TCP且SYN与ACK标志均存在(TCP握手第二阶段)的数据包,将数据包内容保存至test.cap文件,结果略。