Layer2 Paket senden

Beschreibung: 

 Kleines python script mit dem man ein layer2 Datenpaket senden kann. 

 Bedienung: 

 sendframe -h

usage: sendframe.py [-h] -d DEVICE -m {senden,empfangen}

-d device = eth0 eth1 enp6s0 n2n0 etc

-m senden oder empfangen

Beispiel Ziel Computer im empfangsmodus zuerst starten :

./sendframe.py -d n2n0 -m empfangen

Dann auf dem Quellcomputer paket senden

./sendframe.py -d n2n0 -m senden

 

 Das Script auch zum sendframe.py 

 #!/usr/bin/python3

import socket

import sys

import argparse

import signal

def signal_handler(sig, frame):

 print('Programm wurde mit STRG+C beendet.')

 sys.exit(0)

def send_frame(iface):

 # Erstellt einen RAW-Socket

 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)

 # Bindet den Socket an die angegebene Schnittstelle

 s.bind((iface, 0))

 # Beispiel eines Ethernet-Frames mit einer leeren Nutzlast

 # Ethernet Header: Ziel MAC, Quelle MAC, Ethertype (0x0800 für IPv4)

 dst_mac = b'\xff\xff\xff\xff\xff\xff' # Broadcast MAC-Adresse

 src_mac = s.getsockname()[4]

 ethertype = b'\x08\x00'

 payload = b'Hello, network!'

 frame = dst_mac + src_mac + ethertype + payload

 # Sendet den Frame

 s.send(frame)

 print(f'Paket gesendet auf {iface}')

def receive_frame(iface):

 # Erstellt einen RAW-Socket

 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))

 # Bindet den Socket an die angegebene Schnittstelle

 s.bind((iface, 0))

 print(f'Warte auf Pakete auf {iface}...')

 while True:

 # Empfängt den Frame

 frame, addr = s.recvfrom(65535)

 src_mac = frame[6:12]

 print(f'Paket empfangen von MAC: {":".join(format(x, "02x") for x in src_mac)}')

def main():

 parser = argparse.ArgumentParser(description='Einfaches Skript zum Senden und Empfangen von Ethernet-Frames')

 parser.add_argument('-d', '--device', required=True, help='Netzwerkgerät (z.B. eth0)')

 parser.add_argument('-m', '--mode', required=True, choices=['senden', 'empfangen'], help='Modus: senden oder empfangen')

 args = parser.parse_args()

 # Registriert das STRG+C Interrupt-Signal

 signal.signal(signal.SIGINT, signal_handler)

 if args.mode == 'senden':

 send_frame(args.device)

 elif args.mode == 'empfangen':

 receive_frame(args.device)

if __name__ == '__main__':

 main()

 

  