Direkt zum Hauptinhalt

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()