Linux抓包与网络分析工具总结

以下对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

扫描二维码关注公众号,回复: 9567630 查看本文章

仅显示监听状态的套接字。

-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命令支持使用过滤器对显示结果进行过滤。

2.2.2.1     state过滤器

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”。

2.2.2.2     src/dst过滤器

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

2.2.2.3     sport/dport过滤器

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  结合其他命令

2.2.4.1     优化ss输出格式

ss输出信息各列的间隔很宽,不便于查看,如下图所示:

当ss命令使用“-p”选项显示进程信息时,进程信息会显示在下一行,不便于查看与统计,如下图所示:

使用cat或column命令,可以优化ss的输出格式,使各列的间隔变窄,进程信息在同一行显示。

执行“ss -np|cat”,结果如下所示:

执行“ss -np|column -t”,结果如下所示:

2.2.4.2     定时执行ss命令

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 [email protected]”,查看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 [email protected]: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的文件信息。如下所示。

2.4.3.1     使用ss命令查看网络文件信息

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命令,可以根据套接字的索引节点信息查看套接字详情信息。

2.4.3.2     使用lsof命令查看网络文件信息

执行“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  [email protected].......

    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文件,结果略。

发布了37 篇原创文章 · 获赞 0 · 访问量 2318

猜你喜欢

转载自blog.csdn.net/a82514921/article/details/104616502
今日推荐