From fe92030438be83e94c36b3be1de253c183100104 Mon Sep 17 00:00:00 2001 From: Ruakij Date: Tue, 22 Apr 2025 11:50:01 +0200 Subject: [PATCH] Default route handling for IPv6 conversion --- README.md | 2 ++ cmd/app/main.go | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index db5e614..a35a6ab 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ The program will convert IPv4-only wireguard-interfaces to IPv6. It converts and IPv6-Adresses are generated based on the IPv4-Adress. +If not filtered out, then default routes (0.0.0.0/0) are handled specially and are converted to the IPv6 default route (::/0). + Beware: This program needs `NET_ADMIN` privileges for setting Adresses and to access the wireguard-daemon.
diff --git a/cmd/app/main.go b/cmd/app/main.go index 4baccd2..4d540d7 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -17,6 +17,7 @@ import ( var envRequired = []string{ "INTERFACE", } + var envDefaults = map[string]string{ "IPV6_FORMAT": "fc12::%02x%02x:%02x%02x/%d", "FILTER_PREFIX": "100.100", @@ -111,7 +112,7 @@ func main() { for _, peer := range wgDevice.Peers { // Create slice for 1 expected addition - var addAllowedIPs = make([]net.IPNet, 0, 1) + addAllowedIPs := make([]net.IPNet, 0, 1) // Loop through the allowed-ips and add the ones starting with 100.100 for _, allowedIP := range peer.AllowedIPs { @@ -162,6 +163,14 @@ func main() { } func convertIPv4ToIPv6(ipv6Format *string, ipv4 *net.IPNet) *string { + // Check if this is a default route (0.0.0.0/0) + if ipv4.IP.Equal(net.IPv4zero) { + if ones, _ := ipv4.Mask.Size(); ones == 0 { + defaultRoute := "::/0" + return &defaultRoute + } + } + CIDR, _ := ipv4.Mask.Size() // Run format ipv6Str := fmt.Sprintf(*ipv6Format, (*ipv4).IP[0], (*ipv4).IP[1], (*ipv4).IP[2], (*ipv4).IP[3], net.IPv6len*8-(net.IPv4len*8-CIDR))