记录一次奇怪的tcpdump

tmpdump在我们日常的工作中经常使用,先介绍一下基本使用

tcpdump -i eth0 icmp

-i 是指定网卡, icmp是协议。
还有一些其他常用参数譬如
-b在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。tcpdump -b arp 将只显示网络中的arp即地址转换协议信息;

-l使标准输出变为缓冲行形式,如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中;

-n不进行IP地址到主机名的转换;

-v输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;

-vv输出详细的报文信息;
再举例一些常用的,

抓取包含特点主机的数据包

tcpdump -i eth0 -vnn host 10.10.10.10
如果是源地址 src host 
如果是目的地址 dst host
还可以通过 and  or 组合多个条件

特定端口

tcpdump -i eth0 -vnn port 22

特定协议

tcpdump -i eth0 -vnn icmp/udp/ip/arp

保存或者读取文件

tcpdump –i eth0 -vnn -w  /tmp/fil1 -c 100
tcpdump –i eth0 -vnn -r  /tmp/fil1 ( 筛选主机追加:host  10.10.10.10

介绍完tcpdump的基本使用后,我们回到今天抓包的奇怪现象,在抓包的时候回会出现,我在抓包DNS时候发现

sudo tcpdump -i eth0 -vvv -nn udp dst port 53
 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
 17:04:48.145904 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 61)
 10.0.0.2.56497 > 10.0.0.1.53: [bad udp cksum 0x8f54 -> 0xb8fc!] 30234+ AAAA? www.twitter.com. (33)
 17:04:48.145925 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 61)
 10.0.0.2.56497 > 10.0.0.1.53: [bad udp cksum 0x224d -> 0x2604!] 30234+ AAAA? www.twitter.com. (33)

虽然域名能解析但出现了一些bad udp之类的数据包,很奇怪,后来深入了解了一下网卡的checksum offloading 机制,它是负责计算需要发送或者接收到的TCP/UDP消息的校验和,从而节省CPU的计算开销的一种机制,CheckSum Offload实际上是将传输层的一部分工作交给了硬件完成,以节约系统的CPU资源。微软的测试表明它可以最多节约30%的CPU资源。
对于Tx,设置Checksum Offload有效之后,传输层将随机填充TCP校验和,因此在本机上抓取的数据包是Bad CheckSum。然后,网卡会自动计算正确的校验码然后发送,因此对方收到的仍然是正确的TCP/UDP包。
对于Rx,设置Checksum Offload有效之后,网卡在接收数据时,会填充一个NDIS_TCP_IP_CHECKSUM_PACKET_INFO 结构并设置标志位;如果由于某种原因失败,则不设置标志位,由TCP/IP协议栈来完成数据校验。

可以查看一下

sudo ethtool -k eth0 | grep on
 rx-checksumming: on
 tx-checksumming: on
 scatter-gather: on
 generic-segmentation-offload: on
 generic-receive-offload: on
 rx-vlan-offload: on
 tx-vlan-offload: on

关闭后再测试一下

sudo ethtool -K eth0 tx off rx off

udo tcpdump -i eth0 -vvv -nn udp dst port 53
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:06:09.355411 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 57)
10.0.0.2.18964 > 10.0.0.1.53: [udp sum ok] 292+ AAAA? twitter.com. (29)
17:06:09.355431 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 57)
10.0.0.2.18964 > 10.0.0.1.53: [udp sum ok] 292+ AAAA? twitter.com. (29)

就没有发现这个问题了。当然这个功能还是需要开启,毕竟通过网络分担cpu的部分计算是非常好的设计

### 使用 `tcpdump` 每分钟捕获一次网络数据包 为了实现每分钟仅捕获一个数据包的目标,可以利用 Linux 的定时任务工具 `cron` 结合 `tcpdump` 来完成此操作。具体方法如下: #### 利用 cron 定时执行命令 通过编辑 crontab 文件来设置定时任务,使得系统每隔一分钟运行一次特定的 `tcpdump` 命令。 ```bash * * * * * /usr/sbin/tcpdump -c 1 -w /path/to/save/capture_$(date +\%F_\%T).pcap ``` 这条指令表示每一分钟触发一次 `tcpdump` 抓包动作,并且只抓取单个数据包 `-c 1`,并将结果保存到指定路径下的文件中,文件名包含了日期时间戳以便区分不同时间段的数据[^1]。 对于更复杂的过滤条件或者不同的接口需求,则可以在上述基础上调整 `tcpdump` 参数。例如针对某个特定源地址进行监听: ```bash * * * * * /usr/sbin/tcpdump -i eth0 src host specific_hostname -c 1 -w /path/to/save/capture_$(date +\%F_\%T)_src.pcap ``` 这里指定了网卡名称 `-i eth0` 和源主机名为 `specific_hostname` 进行精确匹配并同样限制数量为一[-3]。 如果希望进一步限定协议类型或其他特性,比如 ICMP 请求,也可以加入相应的表达式: ```bash * * * * * /usr/sbin/tcpdump 'icmp and ether dst host MAC_ADDRESS' -c 1 -w /path/to/save/capture_icmp_$(date +\%F_\%T).pcap ``` 此处使用了复合条件 `'icmp and ... '` 对应于具体的硬件地址 (MAC ADDRESS)[^4]。 需要注意的是当网络流量非常大时,即使设置了 `-c 1` 只获取单一报文,仍可能存在因网卡过载而导致丢弃的情况;此时可考虑增加 `-s snaplen` 设置快照长度减少内存占用,或是优化服务器性能以应对高负载环境[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳清风09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值