#!/usr/bin/env python import sys import socket import threading import socket import time import os class MacDevReceiver(threading.Thread): def __init__(self, macdev, ipdev): self.macdev = macdev self.ipdev = ipdev threading.Thread.__init__(self) def run(self): while True: r=self.macdev.recv(2000) sys.stdout.write("[TCP] TX %d bytes.\n"%len(r)) self.ipdev.sendall(r) class IpDevReceiver(threading.Thread): def __init__(self, macdev, ipdev): self.macdev = macdev self.ipdev = ipdev threading.Thread.__init__(self) def run(self): while True: r = self.ipdev.recv(10000) if (len(r) <= 1518): sys.stdout.write("[MAC] TX %d bytes.\n"%len(r)) self.macdev.send(r) else: sys.stdout.write("[MAC] Dropping %d bytes long frame.\n"%len(r)) mode = sys.argv[1] dev = sys.argv[2] port = int(sys.argv[3]) print("Setting IF to promisc mode...") os.system("sudo ip link set promisc on dev {}".format(dev)) ETH_P_ALL=3 m=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL)) m.bind((dev, 0)) # TODO: IP Frames w/ MTU > 1500 # Make sure to disable TCP segmentation offloading to use this: # https://www.baeldung.com/linux/tcp-offload-disable s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if (mode == "s"): s.bind(('localhost', port)) s.listen(1) print("Waiting for TCP connection on port {}...".format(port)) conn, addr = s.accept() else: s.connect(("localhost", port)) conn = s print("Forwarding data...") macdev_r = MacDevReceiver(m, conn) macdev_r.start() macdev_s = IpDevReceiver(m, conn) macdev_s.start() while True: time.sleep(1)