From 3a551b4e9a3dd8cd4b31326824c75d0578f09f97 Mon Sep 17 00:00:00 2001 From: Wenri JUSHI Date: Sun, 1 Feb 2026 22:09:49 +0100 Subject: [PATCH 1/2] fix: handle EAFNOSUPPORT in RouteList for Virtuozzo/OpenVZ kernels Virtuozzo/OpenVZ 3.10.x kernels do not support RTM_GETROUTE dump with AF_UNSPEC, returning EAFNOSUPPORT. This caused netclient to fail on interface configuration and default gateway detection, preventing the daemon from applying any peer updates. Add routeListAll and routeListFilteredAll helpers that try FAMILY_ALL first and fall back to querying FAMILY_V4 and FAMILY_V6 separately. Also set WG_QUICK_USERSPACE_IMPLEMENTATION in Dockerfile. Co-Authored-By: Claude Opus 4.5 --- Dockerfile | 2 ++ wireguard/wireguard_linux.go | 44 +++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6359e360..c30b1e3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,4 +31,6 @@ COPY --from=builder /app/netclient-app ./netclient COPY --from=builder /app/scripts/netclient.sh . RUN chmod 0755 netclient && chmod 0755 netclient.sh +ENV WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go + ENTRYPOINT ["/bin/bash", "./netclient.sh"] diff --git a/wireguard/wireguard_linux.go b/wireguard/wireguard_linux.go index ca612d66..1752ff78 100644 --- a/wireguard/wireguard_linux.go +++ b/wireguard/wireguard_linux.go @@ -117,7 +117,7 @@ func (nc *NCIface) ApplyAddrs() error { if err != nil { return err } - routes, err := netlink.RouteList(l, 0) + routes, err := routeListAll(l) if err != nil { return err } @@ -213,7 +213,7 @@ func GetDefaultGatewayIp() (ip net.IP, err error) { //build the gateway route, with Table ROUTE_TABLE_NAME, metric 1 tRoute := netlink.Route{Dst: nil, Table: RouteTableName} //Check if table ROUTE_TABLE_NAME existed - routes, _ := netlink.RouteListFiltered(netlink.FAMILY_ALL, &tRoute, netlink.RT_FILTER_TABLE) + routes, _ := routeListFilteredAll(&tRoute, netlink.RT_FILTER_TABLE) if len(routes) == 1 { return routes[0].Gw, nil } else if len(routes) > 1 { @@ -273,7 +273,7 @@ func GetDefaultGatewayV6() (gwRoute netlink.Route, err error) { func GetDefaultGateway() (gwRoute netlink.Route, err error) { //get the present route list - routes, err := netlink.RouteList(nil, netlink.FAMILY_ALL) + routes, err := routeListAll(nil) if err != nil { slog.Error("error loading route tables", "error", err.Error()) return gwRoute, err @@ -711,6 +711,44 @@ func restoreInternetGwV4() (err error) { return config.WriteNetclientConfig() } +// routeListAll returns routes for all address families. +// Some kernels (notably Virtuozzo/OpenVZ 3.10.x) do not support RTM_GETROUTE +// dump with AF_UNSPEC, returning EAFNOSUPPORT. In that case, query V4 and V6 +// separately and merge the results. +func routeListAll(link netlink.Link) ([]netlink.Route, error) { + routes, err := netlink.RouteList(link, netlink.FAMILY_ALL) + if err == nil { + return routes, nil + } + if !errors.Is(err, unix.EAFNOSUPPORT) { + return nil, err + } + v4, err4 := netlink.RouteList(link, netlink.FAMILY_V4) + if err4 != nil { + return nil, err4 + } + v6, _ := netlink.RouteList(link, netlink.FAMILY_V6) + return append(v4, v6...), nil +} + +// routeListFilteredAll is like netlink.RouteListFiltered but falls back to +// querying V4 and V6 separately when AF_UNSPEC is not supported. +func routeListFilteredAll(filter *netlink.Route, filterMask uint64) ([]netlink.Route, error) { + routes, err := netlink.RouteListFiltered(netlink.FAMILY_ALL, filter, filterMask) + if err == nil { + return routes, nil + } + if !errors.Is(err, unix.EAFNOSUPPORT) { + return nil, err + } + v4, err4 := netlink.RouteListFiltered(netlink.FAMILY_V4, filter, filterMask) + if err4 != nil { + return nil, err4 + } + v6, _ := netlink.RouteListFiltered(netlink.FAMILY_V6, filter, filterMask) + return append(v4, v6...), nil +} + // == private == type netLink struct { From 2e1b014a251ee5b4ef1aa5df4212e8a982105efb Mon Sep 17 00:00:00 2001 From: Bingchen Gong <6704443+Wenri@users.noreply.github.com> Date: Sat, 14 Feb 2026 19:08:33 +0100 Subject: [PATCH 2/2] Update Dockerfile Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c30b1e3b..6359e360 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,4 @@ COPY --from=builder /app/netclient-app ./netclient COPY --from=builder /app/scripts/netclient.sh . RUN chmod 0755 netclient && chmod 0755 netclient.sh -ENV WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go - ENTRYPOINT ["/bin/bash", "./netclient.sh"]