Python: 包头中显示错误的 ip

Python: wrong ip is shown in packet header

我正在通过我的机器转发一台机器的数据包。我用 tcpdump host <machine_ip> 进行了测试,看看是否一切正常,确实如此。现在我需要捕获这些数据包。我选择使用 Python 来执行此操作。现在我正在尝试过滤数据包,但打印的 ip 与正确的不同。应该是 192.168.0.8:

import socket
from struct import *
print("Started")
with socket.socket(socket.AF_PACKET,socket.SOCK_RAW, socket.ntohs(0x0003)) as s:
        while True:
                packet=s.recvfrom(65565)
                content=packet[0]
                ip_header=unpack('!BBHHHBBH4s4s', content[:20])
                source_ip=socket.inet_ntoa(ip_header[8])
                print(source_ip)

打印出来的是 8.0.69.08.0.69.16,其中 none 符合预期的形式。

这是因为原始数据前面是MACheader。

如果您更改行:

ip_header=unpack('!BBHHHBBH4s4s', content[:20])

ip_header=unpack('!BBHHHBBH4s4s', content[14:34])

您可能会得到您的 IP 地址。我说可能是因为它真的取决于 link 层,因为可能存在 vlan 标记,从而进一步移动 ip header。