From 9b4a320a9f98a4c2028625a43083f16f7ec69962 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sun, 14 Jun 2026 10:04:10 +0800 Subject: [PATCH] fix(listener/tun): parse routes from URL query string and bare CIDR (issue #735) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mdutil.GetStrings only matches []string and []any — a plain string from a URL query parameter (routes=0.0.0.0/0) returned nil, silently dropping the route. Added GetString fallback with comma-split, and bare-CIDR support that defaults to config.Gateway. Same fix applied to both tun and tungo listeners. --- listener/tun/metadata.go | 59 ++++++++++++++++++++++++-------------- listener/tungo/metadata.go | 59 ++++++++++++++++++++++++-------------- 2 files changed, 74 insertions(+), 44 deletions(-) diff --git a/listener/tun/metadata.go b/listener/tun/metadata.go index 069ec8a0..42057f00 100644 --- a/listener/tun/metadata.go +++ b/listener/tun/metadata.go @@ -60,30 +60,45 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) { } } - for _, s := range mdutil.GetStrings(md, "routes", "tun.routes") { - ss := strings.SplitN(s, " ", 2) - if len(ss) == 2 { - _, ipNet, _ := net.ParseCIDR(strings.TrimSpace(ss[0])) - if ipNet == nil { - continue - } - gw := net.ParseIP(ss[1]) - if gw == nil { - gw = config.Gateway - } - - gateway := "" - if gw != nil { - gateway = gw.String() - } - - l.routes = append(l.routes, &router.Route{ - Net: ipNet, - Dst: ipNet.String(), - Gateway: gateway, - }) + routeStrs := mdutil.GetStrings(md, "routes", "tun.routes") + if len(routeStrs) == 0 { + // Fall back to single string (e.g. from URL query parameter routes=0.0.0.0/0) + if s := mdutil.GetString(md, "routes", "tun.routes"); s != "" { + routeStrs = strings.Split(s, ",") } } + for _, s := range routeStrs { + s = strings.TrimSpace(s) + if s == "" { + continue + } + ss := strings.SplitN(s, " ", 2) + var cidr, gwStr string + if len(ss) == 2 { + cidr, gwStr = strings.TrimSpace(ss[0]), ss[1] + } else { + cidr = s + } + _, ipNet, _ := net.ParseCIDR(cidr) + if ipNet == nil { + continue + } + gw := net.ParseIP(gwStr) + if gw == nil { + gw = config.Gateway + } + + gateway := "" + if gw != nil { + gateway = gw.String() + } + + l.routes = append(l.routes, &router.Route{ + Net: ipNet, + Dst: ipNet.String(), + Gateway: gateway, + }) + } for _, v := range strings.Split(mdutil.GetString(md, "dns", "tun.dns"), ",") { if ip := net.ParseIP(strings.TrimSpace(v)); ip != nil { diff --git a/listener/tungo/metadata.go b/listener/tungo/metadata.go index c58b1085..d8374959 100644 --- a/listener/tungo/metadata.go +++ b/listener/tungo/metadata.go @@ -57,30 +57,45 @@ func (l *tunListener) parseMetadata(md mdata.Metadata) (err error) { } } - for _, s := range mdutil.GetStrings(md, "routes", "tun.routes") { - ss := strings.SplitN(s, " ", 2) - if len(ss) == 2 { - _, ipNet, _ := net.ParseCIDR(strings.TrimSpace(ss[0])) - if ipNet == nil { - continue - } - gw := net.ParseIP(ss[1]) - if gw == nil { - gw = config.Gateway - } - - gateway := "" - if gw != nil { - gateway = gw.String() - } - - l.routes = append(l.routes, &router.Route{ - Net: ipNet, - Dst: ipNet.String(), - Gateway: gateway, - }) + routeStrs := mdutil.GetStrings(md, "routes", "tun.routes") + if len(routeStrs) == 0 { + // Fall back to single string (e.g. from URL query parameter routes=0.0.0.0/0) + if s := mdutil.GetString(md, "routes", "tun.routes"); s != "" { + routeStrs = strings.Split(s, ",") } } + for _, s := range routeStrs { + s = strings.TrimSpace(s) + if s == "" { + continue + } + ss := strings.SplitN(s, " ", 2) + var cidr, gwStr string + if len(ss) == 2 { + cidr, gwStr = strings.TrimSpace(ss[0]), ss[1] + } else { + cidr = s + } + _, ipNet, _ := net.ParseCIDR(cidr) + if ipNet == nil { + continue + } + gw := net.ParseIP(gwStr) + if gw == nil { + gw = config.Gateway + } + + gateway := "" + if gw != nil { + gateway = gw.String() + } + + l.routes = append(l.routes, &router.Route{ + Net: ipNet, + Dst: ipNet.String(), + Gateway: gateway, + }) + } for _, v := range strings.Split(mdutil.GetString(md, "dns", "tun.dns"), ",") { if ip := net.ParseIP(strings.TrimSpace(v)); ip != nil {