From 32b78a84f98b034ee731c6cd3b35cfcab90d4cbe Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Mon, 18 May 2026 22:14:21 +0200 Subject: [PATCH] f-28: fix: add proper dhcp handle Signed-off-by: GnomeZworc --- internal/ebtables/ebtables.go | 22 +++++++++++---------- internal/subnet/create.go | 36 +++++++++++++++++++---------------- internal/subnet/delete.go | 23 +++++++++++++--------- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/internal/ebtables/ebtables.go b/internal/ebtables/ebtables.go index 31e276b..40ea0f0 100644 --- a/internal/ebtables/ebtables.go +++ b/internal/ebtables/ebtables.go @@ -13,46 +13,48 @@ func deleteRule(args ...string) error { return exec.Command("ebtables", append([]string{"-D"}, args...)...).Run() } -func DropARPToGateway(bridge, gatewayIP string) error { +func DropARPToGateway(iface, ip string) error { if err := addRule("FORWARD", - "--out-interface", bridge, + "--out-interface", iface, "-p", "arp", "--arp-op", "Request", - "--arp-ip-dst", gatewayIP, + "--arp-ip-dst", ip, "-j", "DROP"); err != nil { return fmt.Errorf("ebtables arp rule: %w", err) } return nil } -func DropDHCP(bridge string) error { +func DropDHCP(iface, ip string) error { if err := addRule("FORWARD", - "--out-interface", bridge, + "--out-interface", iface, "-p", "IPv4", "--ip-protocol", "udp", "--ip-source-port", "67:68", "--ip-destination-port", "67:68", + "--ip-source", ip, "-j", "DROP"); err != nil { return fmt.Errorf("ebtables dhcp rule: %w", err) } return nil } -func DeleteARPToGateway(bridge, gatewayIP string) error { +func DeleteARPToGateway(iface, ip string) error { return deleteRule("FORWARD", - "--out-interface", bridge, + "--out-interface", iface, "-p", "arp", "--arp-op", "Request", - "--arp-ip-dst", gatewayIP, + "--arp-ip-dst", ip, "-j", "DROP") } -func DeleteDHCP(bridge string) error { +func DeleteDHCP(iface, ip string) error { return deleteRule("FORWARD", - "--out-interface", bridge, + "--out-interface", iface, "-p", "IPv4", "--ip-protocol", "udp", "--ip-source-port", "67:68", "--ip-destination-port", "67:68", + "--ip-source", ip, "-j", "DROP") } diff --git a/internal/subnet/create.go b/internal/subnet/create.go index e660814..f161d98 100644 --- a/internal/subnet/create.go +++ b/internal/subnet/create.go @@ -81,27 +81,31 @@ func createSubnet(db *badger.DB, subnetName string, d subnetData) error { switch d.mode { case "vxlan": if err := netns.Call(d.vpc, func() error { - return netif.AddrAdd(d.bridge, d.interfaceIP) + if err := netif.AddrAdd(d.bridge, d.interfaceIP); err != nil { + return fmt.Errorf("add addr: %w", err) + } + if err := netif.RouteAdd(d.bridge, d.cidr); err != nil { + return fmt.Errorf("add route: %w", err) + } + if err := ebtables.DropARPToGateway(vethI, d.interfaceIP.String()); err != nil { + return err + } + return ebtables.DropDHCP(vethI, d.interfaceIP.String()) }); err != nil { - return fmt.Errorf("add addr to bridge in netns: %w", err) + return fmt.Errorf("configure netns: %w", err) } + case "bridge": if err := netns.Call(d.vpc, func() error { - return netif.RouteAdd(d.bridge, d.cidr) + if err := netif.AddrAdd(d.bridge, d.interfaceIP); err != nil { + return fmt.Errorf("add addr: %w", err) + } + if err := netif.RouteAdd(d.bridge, d.cidr); err != nil { + return fmt.Errorf("add route: %w", err) + } + return ebtables.DropDHCP(vethI, d.interfaceIP.String()) }); err != nil { - return fmt.Errorf("add route in netns: %w", err) + return fmt.Errorf("configure netns: %w", err) } - case "bridge": - } - - switch d.mode { - case "vxlan": - if err := ebtables.DropARPToGateway(d.bridge, d.interfaceIP.String()); err != nil { - return err - } - if err := ebtables.DropDHCP(d.bridge); err != nil { - return err - } - case "bridge": } return startDHCP(db, subnetName, d) diff --git a/internal/subnet/delete.go b/internal/subnet/delete.go index abe2fdf..0ae30b5 100644 --- a/internal/subnet/delete.go +++ b/internal/subnet/delete.go @@ -70,18 +70,18 @@ func stopDHCP(db *badger.DB, subnetName string, d subnetData) error { func deleteSubnetVxlan(d subnetData) error { vxlanIface := fmt.Sprintf("vxlan-%d", d.vxlanID) - - if err := ebtables.DeleteARPToGateway(d.bridge, d.interfaceIP.String()); err != nil { - return fmt.Errorf("delete ebtables arp rule: %w", err) - } - if err := ebtables.DeleteDHCP(d.bridge); err != nil { - return fmt.Errorf("delete ebtables dhcp rule: %w", err) - } + vethI := "v-" + d.subnetID + "-i" if err := netns.Call(d.vpc, func() error { + if err := ebtables.DeleteARPToGateway(vethI, d.interfaceIP.String()); err != nil { + return fmt.Errorf("delete ebtables arp rule: %w", err) + } + if err := ebtables.DeleteDHCP(vethI, d.interfaceIP.String()); err != nil { + return fmt.Errorf("delete ebtables dhcp rule: %w", err) + } return netif.DeleteLink(d.bridge) }); err != nil { - return fmt.Errorf("delete bridge in netns: %w", err) + return fmt.Errorf("delete netns resources: %w", err) } if err := netif.DeleteLink(vxlanIface); err != nil { @@ -99,10 +99,15 @@ func deleteSubnetVxlan(d subnetData) error { } func deleteSubnetBridge(d subnetData) error { + vethI := "v-" + d.subnetID + "-i" + if err := netns.Call(d.vpc, func() error { + if err := ebtables.DeleteDHCP(vethI, d.interfaceIP.String()); err != nil { + return fmt.Errorf("delete ebtables dhcp rule: %w", err) + } return netif.DeleteLink(d.bridge) }); err != nil { - return fmt.Errorf("delete bridge in netns: %w", err) + return fmt.Errorf("delete netns resources: %w", err) } if err := netif.DeleteLink("v-" + d.subnetID + "-e"); err != nil {