Python 数据包嗅探仅使用原始套接字获取私有IP地址
我正在尝试编写一个包嗅探器,用于检测连接到我的wifi的设备访问的不同网站。问题是我只获得了私人IP,以下是我从1小时的嗅探中获得的IP数:Python 数据包嗅探仅使用原始套接字获取私有IP地址,python,networking,packet,packet-sniffers,raw-sockets,Python,Networking,Packet,Packet Sniffers,Raw Sockets,我正在尝试编写一个包嗅探器,用于检测连接到我的wifi的设备访问的不同网站。问题是我只获得了私人IP,以下是我从1小时的嗅探中获得的IP数: IPS Number_Of_Values 224.0.0.251 1068 192.168.1.255 387 255.255.255.255 32 224.0.0.22 28 224.0.0.1 28 192.168.1.111
IPS Number_Of_Values
224.0.0.251 1068
192.168.1.255 387
255.255.255.255 32
224.0.0.22 28
224.0.0.1 28
192.168.1.111 6
192.168.1.115 5
224.0.1.187 2
这是嗅探器的一部分,以太网\u帧获取mac地址和协议,ipv4\u数据包解压IP头并获取IP(源和目标),最后,获取数据包继续进行不同的解压:
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
def ipv4_packet(data):
version_header_length = data[0]
version = version_header_length >> 4
header_length = (version_header_length & 15) * 4
ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', data[:20])
return version, header_length, ttl, proto, ipv4(src), ipv4(target), data[header_length:]
def get__packets():
conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
raw_data, addr = conn.recvfrom(65536)
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
# 8 for ipv4
if eth_proto == 8:
(version, header_length, ttl, proto, src_ip, target_ip, data) = ipv4_packet(data)
为什么我只得到私人IP?如何获取网站IP?如果不可能,如何从TCP数据包中获取http头以获取url
(我正在我的raspberry pi 4-Linux上进行编码)您是否使用本地代理来处理web流量?然后,您将看不到数据包中的实际网站地址。如果您没有通过代理,传出的数据包应该有一个私有源地址和公共目的地,传入的backet应该是相反的。@Barmar Hi,不,我没有使用任何类型的代理,我只是连接到我的raspberry pi(数据包嗅探器正在其上运行)使用SSH(使用PuTTY)。RPi是否连接到交换机上的监控端口?如果没有,它将只看到进出RPi的数据包。如果RPi没有连接到Internet,它将看不到任何公共地址。如果它连接到监控端口,则需要将其以太网置于混杂模式,以便接收未发送到它的数据包。