我的tcpdump日志中有两个数据包,我不知道第二列中的“P”和“In”是什么意思。有人能解释一下他们的意思吗?
00:43:44.896482 P 00:00:ac:12:80:01 ethertype IPv4 (0x0800), length 76: 172.18.128.1.ssh > 155.xx.xx.xx.56365: S 1308033114:1308033114(0) ack 1315850475 win 5792 <mss 1460,sackOK,timestamp 12196173 122040733,nop,wscale 8>
00:43:44.896482 In 00:00:ac:12:80:01 ethertype IPv4 (0x0800), length 76: 172.18.128.1.ssh > 155.yy.yy.yy.4242: S 1308033114:1308033114(0) ack 1315850475 win 5792 <mss 1460,sackOK,timestamp 12196173 122040733,nop,wscale 8>
请注意,由于此“P”事件,目标IP发生了变化。
答案 0 :(得分:5)
从Guy Harris的tcpdump-workers邮件列表中得到以下答案。
Linux“any”设备使用DLT_LINUX_SLL / LINKTYPE_LINUX_SLL链路层标头,其中包含从PF_PACKET套接字上的“recvfrom()”调用获得的信息,其中包括源地址,但不包括目标地址。数据包,因此您看到的唯一链路层地址是源地址。
它还包括一些标志,指示如何接收数据包:
“在”中 - 数据包是对主机的单播;
“B” - 数据包已播出;
“M” - 数据包未广播但是多播;
“P” - 数据包单播到某些其他主机,并且此主机收到它,因为网络适配器处于混杂模式;
“Out” - 数据包由主机发送并“缠绕”并传送到PF_PACKET套接字。
我认为Linux网络堆栈确定“In”,“B”,“M”和“P”之间的区别的方式是查看数据包的目标地址并查看它是否是广播地址(ff:ff:ff:ff:ff:使用IEEE MAC-48地址的网络上的ff),多播地址(在使用IEEE MAC-48地址的网络上设置“组”位)或适配器的地址它收到了。这是一个位令人惊讶的是它在“任意”设备上检测到一个混合接收的数据包,因为“任何”设备本身不能进入混杂模式,但可能是特定的接口,由于某些其他原因,收到的数据包处于混杂模式。