经常使用tcpdump进行抓包的同学可以忽略了,这篇偏于使用扫盲;首先,tcpdump抓包目的IP显示为hostname,如果端口是知名端口,显示为协议名而不是端口号。这种默认其实略有问题的:
如果我们使用默认的hostname:localhost.localdomain,那么很容易误认为是本地回环地址请求:一个远程IP访问了本地回环地址,这就很怪;还是显示IP地址爽利:IPv4还是IPv6也是一目了然。那么怎么明确显示IP地址和端口号呢?使用-n和-nn参数,使用举例如下:
# 抓包21端口的包(不限制源和目的)
tcpdump -i ens192 port 21
15:40:49.542333 IP 192.168.1.190.46108 > xxxx-229.ftp: Flags [S]
15:40:49.542395 IP xxxx-229.ftp > 192.168.1.190.46108: Flags [S.]
# -n :显示ip地址,而不是hostname
tcpdump -i ens192 -n port 21
15:23:56.952026 IP 192.168.1.190.36944 > 192.168.1.229.ftp: Flags [S]
15:23:56.952133 IP 192.168.1.229.ftp > 192.168.1.190.36944: Flags [S.]
# -nn :显示端口号而不是协议名
tcpdump -i ens192 -n -nn port 21
15:23:45.333967 IP 192.168.1.190.36840 > 192.168.1.229.21: Flags [S]
15:23:45.334036 IP 192.168.1.229.21 > 192.168.1.190.36840: Flags [S.]
扩展
-
过滤源IP地址:
bashCopy codesudo tcpdump -i eth0 src host 192.168.1.2
这将捕获源IP地址为192.168.1.2的流量。
-
过滤目的IP地址:
bashCopy codesudo tcpdump -i eth0 dst host 192.168.1.2
这将捕获目的IP地址为192.168.1.2的流量。
-
过滤源和目的IP地址:
bashCopy codesudo tcpdump -i eth0 src host 192.168.1.2 and dst host 192.168.1.3
这将捕获源IP地址为192.168.1.2且目的IP地址为192.168.1.3的流量。
-
过滤特定协议:
bashCopy codesudo tcpdump -i eth0 icmp
这将捕获 ICMP 协议的流量。你可以替换
icmp
为其他协议名,如tcp
、udp
。 -
过滤源和目的IP地址以及特定协议:
bashCopy codesudo tcpdump -i eth0 src host 192.168.1.2 and dst host 192.168.1.3 and icmp
这将捕获源IP地址为192.168.1.2、目的IP地址为192.168.1.3且协议为 ICMP 的流量。
-
过滤特定源端口:
bashCopy codesudo tcpdump -i eth0 src port 8080
这将捕获源端口为8080的流量。
-
过滤特定目的端口:
bashCopy codesudo tcpdump -i eth0 dst port 80
这将捕获目的端口为80的流量。
-
过滤特定源和目的端口:
bashCopy codesudo tcpdump -i eth0 src port 8080 and dst port 80
这将捕获源端口为8080且目的端口为80的流量。
-
过滤除特定端口之外的流量:
bashCopy codesudo tcpdump -i eth0 not port 22
这将捕获除端口22之外的所有流量。