У меня есть простой скрипт на python, который создает сокет AF_PACKET
, который анализирует все пакеты IPv4 и получает IP-адреса источника и назначения:
import socket
import struct
def get_ip(s):
return '.'.join([str(ord(symbol)) for symbol in s])
def main():
conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
pkt, addr = conn.recvfrom(65536)
proto = struct.unpack('! H', pkt[12:14])
eth_proto = socket.htons(proto[0])
print('eth_proto = ', eth_proto)
if eth_proto == 8:
src, target = struct.unpack('! 4s 4s', pkt[26:34])
source_ip = get_ip(src)
destination_ip = get_ip(target)
print('Source IP = ', source_ip)
print('Destination IP = ', destination_ip)
main()
Можно ли провести рефакторинг получения IP-адреса, чтобы он выглядел лучше и не использовал этот цикл:
'.'.join([str(ord(symbol)) for symbol in s])
Формат символов описан здесь:
https://docs.python.org/2/library/struct.html