From fabae4938e1a9aad25dd41ede9b18966b6e828da Mon Sep 17 00:00:00 2001 From: Simon Moser Date: Fri, 1 Oct 2021 13:14:02 +0200 Subject: [PATCH] README started --- README.assets/overview.png | Bin 0 -> 20292 bytes README.md | 74 +++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 README.assets/overview.png diff --git a/README.assets/overview.png b/README.assets/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..f090400300fd7435f3fb1e275dddbdb5932bc37b GIT binary patch literal 20292 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�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 Z!j#xX`&WB-JKj052ht+%?`yyKKL8olKZyVU literal 0 HcmV?d00001 diff --git a/README.md b/README.md index da49935..d00c9f6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,76 @@ # eaas-vde-proxy +## Overview + +![overview](README.assets/overview.png) + +## Pseudocode + +```python +class vde_proxy: + def handle_frame(frame): + try: + frame.mac = self.new_mac + except NameError: + self.new_mac = random_mac() + self.new_ip = do_dhcp(new_mac) + finally: + frame.mac = self.new_mac + frame.packet = handle_packet(frame.packet) + packet = frame.get_packet() + packet.ip = self.new_ip + + def handle_packet(packet): + protocols = { + "ip" : handle_ip, + "arp": handle_arp, + } + return protocols[packet.protocol](packet) + + def handle_ip(packet): + # Todo: Check DHCP lease and get new one if necessary + packet.ip = self.new_ip + if is_dhcp(packet): + packet = handle_dhcp(packet) + return packet + + def handle_arp(packet): + pass + + def handle_dhcp(packet): + pass + + def do_dhcp(mac): + # Do DHCP + return ip +``` + + + +## Problematic protocols + +Important: + +* DHCP +* ARP + +Nice to have: + +* NetBEUI / NetBIOS + +Keep in mind: + +* IPv6 (NDP, Interface Identifier, ...) +* IPSec +* 802.1X + +## Library support + +### Go: + +* Internet layer packet modification: https://github.com/google/gopacket / https://pkg.go.dev/github.com/google/gopacket +* Link layer frame modification: https://github.com/mdlayher/ethernet / https://pkg.go.dev/github.com/mdlayher/ethernet (not recently updated, alternative?) + +### Rust: + +* https://docs.rs/etherparse/0.9.0/etherparse