2015-08-31 3 views
1

Очевидно, что мы легко можем понюхать сеть с розеткой, как:Определить ссылку типа слоя в питоне

socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x0003) 
socket.recv(65535) 

Я хотел бы определить тип link layer адреса при импорте только socket и struct, но канальный уровень не по очевидным причинам появляются в сокетах. Нужно ли писать общую библиотеку, которая обращается к нижнему уровню?

RFC 1122/1123 тип адресного слоя и адрес уровня ссылки.

Update:

Я знаю, что я могу читать его как PCAP и получить информацию канального уровня (т.е. dpkt есть функция pcap.datalink(), которая будет возвращать тип канального уровня, а не адрес канального уровня), но Я все еще не уверен, как читать его из необработанного порта (т.е. eth0), в python, для окон и/или linux.

+1

Добавлен тег 'rfc1122' для вас. –

ответ

2

Я думаю, вы не можете сделать это с помощью библиотеки, которая работает только в сетевых/транспортных слоях. Я бы сделал это с помощью scapy, он должен работать во всех системах python.

from scapy.all import * 
pkts = sniff(count = 1, ifcae = "eth1") 
pkt = pkts[0] 
layers = { 
scapy.layers.l2.Ether:"Link layer is Ethernet" 
#put other layers here, I can't test it in my PC 
} 
if type(pkt) == scapy.layers.l2.Ether: 
    print "Link layer of eth1 is Ethernet" 
+1

Будет ли это делать и другие типы слоев ссылок и скажите мне, что это такое, не глядя в заголовок ethernet, поскольку слой ссылки будет. (то есть идентифицировать кольцо Token или loopback вместо ethernet) в тех случаях, когда базовая структура отличается от уровня канала. (если ethertype является ip, но канальный уровень описывает кольцо Token) В большинстве случаев это не имеет значения из-за аппаратного заказа, но я просматриваю случаи, когда это возможно. – NationWidePants

+1

Это будет работать во всех протоколах scapy, но я думаю, что в некоторых случаях существует ограничение, так как scapy не может «видеть» L1, просто L2. Для L1 я думаю, вам нужно попросить os. –