From 9c39e6dccced35856719935743bb75c14f8ead56 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Mon, 27 Feb 2023 23:29:04 +0100 Subject: WIP: use first ULA address as DHCPv6 source address --- tunnel/tools/libwg-go/dhcp.go | 12 ++-------- tunnel/tools/libwg-go/service.go | 48 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 11 deletions(-) (limited to 'tunnel/tools') diff --git a/tunnel/tools/libwg-go/dhcp.go b/tunnel/tools/libwg-go/dhcp.go index 83a8c865..f6f25739 100644 --- a/tunnel/tools/libwg-go/dhcp.go +++ b/tunnel/tools/libwg-go/dhcp.go @@ -85,7 +85,7 @@ func isRelayMessageType(t dhcpv6.MessageType, tt ...dhcpv6.MessageType) nclient6 // func New() *dhcp { // } -func RunDhcp(ctx context.Context) ([]*gen.Lease, error) { +func RunDhcp(ctx context.Context, laddr, raddr netip.Addr) ([]*gen.Lease, error) { d := &dhcp{} d.linkAddr = net.ParseIP("fe80::101") @@ -95,25 +95,17 @@ func RunDhcp(ctx context.Context) ([]*gen.Lease, error) { d.fqdn = hostName + ".m7n.se" d.hwAddr = []byte{41, 42, 43, 44, 45, 46} - laddr, err := netip.ParseAddr("fd1c:a56b:a0d7:1260::101") - if err != nil { - return nil, err - } src := net.UDPAddr{IP: laddr.AsSlice(), Port: 0, // Use non-restrict UDP source port } - raddr, err := netip.ParseAddr("fd1c:a56b:a0d7:1260::1") - if err != nil { - return nil, err - } d.serverAddr = net.UDPAddr{IP: raddr.AsSlice(), Port: 547, } - err = d.Start(&src) + err := d.Start(&src) if err != nil { return nil, err } diff --git a/tunnel/tools/libwg-go/service.go b/tunnel/tools/libwg-go/service.go index 2c688e26..38601f14 100644 --- a/tunnel/tools/libwg-go/service.go +++ b/tunnel/tools/libwg-go/service.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net" + "net/netip" // "net/url" "os" @@ -256,7 +257,52 @@ func (e *LibwgServiceImpl) IpcSet(ctx context.Context, req *gen.IpcSetRequest) ( } func (e *LibwgServiceImpl) Dhcp(ctx context.Context, req *gen.DhcpRequest) (*gen.DhcpResponse, error) { - leases, err := RunDhcp(ctx) + var relayAddr netip.Addr + var sourceAddr netip.Addr + + source := req.GetSource() + if source != nil { + sourceAddr, _ = netip.AddrFromSlice(source.GetAddress()) + } + + if !sourceAddr.IsValid() || !sourceAddr.Is6() { + r := &gen.DhcpResponse{ + Error: &gen.Error{ + Message: fmt.Sprintf("DHCPv6 source address missing"), + }, + } + return r, nil + } + + relay := req.GetRelay() + if relay != nil { + relayAddr, _ = netip.AddrFromSlice(relay.GetAddress()) + } else { + // Construct relay address from source prefix + relayRaw := source.GetAddress()[:8] + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 0) + relayRaw = append(relayRaw, 1) + relayAddr, _ = netip.AddrFromSlice(relayRaw) + } + + if !relayAddr.IsValid() || !relayAddr.Is6() { + r := &gen.DhcpResponse{ + Error: &gen.Error{ + Message: fmt.Sprintf("DHCPv6 relay address calculation failed"), + }, + } + return r, nil + } + + e.logger.Verbosef("RunDhcp %v %v", sourceAddr, relayAddr) + + leases, err := RunDhcp(ctx, sourceAddr, relayAddr) if err != nil { r := &gen.DhcpResponse{ Error: &gen.Error{ -- cgit v1.2.3