f-28: fix: add proper dhcp handle

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
GnomeZworc 2026-05-18 22:14:21 +02:00
commit 32b78a84f9
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
3 changed files with 46 additions and 35 deletions

View file

@ -13,46 +13,48 @@ func deleteRule(args ...string) error {
return exec.Command("ebtables", append([]string{"-D"}, args...)...).Run() 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", if err := addRule("FORWARD",
"--out-interface", bridge, "--out-interface", iface,
"-p", "arp", "-p", "arp",
"--arp-op", "Request", "--arp-op", "Request",
"--arp-ip-dst", gatewayIP, "--arp-ip-dst", ip,
"-j", "DROP"); err != nil { "-j", "DROP"); err != nil {
return fmt.Errorf("ebtables arp rule: %w", err) return fmt.Errorf("ebtables arp rule: %w", err)
} }
return nil return nil
} }
func DropDHCP(bridge string) error { func DropDHCP(iface, ip string) error {
if err := addRule("FORWARD", if err := addRule("FORWARD",
"--out-interface", bridge, "--out-interface", iface,
"-p", "IPv4", "-p", "IPv4",
"--ip-protocol", "udp", "--ip-protocol", "udp",
"--ip-source-port", "67:68", "--ip-source-port", "67:68",
"--ip-destination-port", "67:68", "--ip-destination-port", "67:68",
"--ip-source", ip,
"-j", "DROP"); err != nil { "-j", "DROP"); err != nil {
return fmt.Errorf("ebtables dhcp rule: %w", err) return fmt.Errorf("ebtables dhcp rule: %w", err)
} }
return nil return nil
} }
func DeleteARPToGateway(bridge, gatewayIP string) error { func DeleteARPToGateway(iface, ip string) error {
return deleteRule("FORWARD", return deleteRule("FORWARD",
"--out-interface", bridge, "--out-interface", iface,
"-p", "arp", "-p", "arp",
"--arp-op", "Request", "--arp-op", "Request",
"--arp-ip-dst", gatewayIP, "--arp-ip-dst", ip,
"-j", "DROP") "-j", "DROP")
} }
func DeleteDHCP(bridge string) error { func DeleteDHCP(iface, ip string) error {
return deleteRule("FORWARD", return deleteRule("FORWARD",
"--out-interface", bridge, "--out-interface", iface,
"-p", "IPv4", "-p", "IPv4",
"--ip-protocol", "udp", "--ip-protocol", "udp",
"--ip-source-port", "67:68", "--ip-source-port", "67:68",
"--ip-destination-port", "67:68", "--ip-destination-port", "67:68",
"--ip-source", ip,
"-j", "DROP") "-j", "DROP")
} }

View file

@ -81,27 +81,31 @@ func createSubnet(db *badger.DB, subnetName string, d subnetData) error {
switch d.mode { switch d.mode {
case "vxlan": case "vxlan":
if err := netns.Call(d.vpc, func() error { 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 { }); 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 { 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 { }); 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) return startDHCP(db, subnetName, d)

View file

@ -70,18 +70,18 @@ func stopDHCP(db *badger.DB, subnetName string, d subnetData) error {
func deleteSubnetVxlan(d subnetData) error { func deleteSubnetVxlan(d subnetData) error {
vxlanIface := fmt.Sprintf("vxlan-%d", d.vxlanID) vxlanIface := fmt.Sprintf("vxlan-%d", d.vxlanID)
vethI := "v-" + d.subnetID + "-i"
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)
}
if err := netns.Call(d.vpc, func() error { 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) return netif.DeleteLink(d.bridge)
}); err != nil { }); 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 { if err := netif.DeleteLink(vxlanIface); err != nil {
@ -99,10 +99,15 @@ func deleteSubnetVxlan(d subnetData) error {
} }
func deleteSubnetBridge(d subnetData) error { func deleteSubnetBridge(d subnetData) error {
vethI := "v-" + d.subnetID + "-i"
if err := netns.Call(d.vpc, func() error { 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) return netif.DeleteLink(d.bridge)
}); err != nil { }); 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 { if err := netif.DeleteLink("v-" + d.subnetID + "-e"); err != nil {