From e61eeae258065b32214630c053bff33c420a516b Mon Sep 17 00:00:00 2001 From: Kosta Date: Sun, 3 May 2026 00:56:47 +0400 Subject: [PATCH] Tunnel inbound: Fix panic when listening on UDS for Xray's internal services (e.g. API) (#6062) And API supports listening on UNIX domain socket directly Completes https://github.com/XTLS/Xray-core/pull/5693 --- app/commander/commander.go | 23 +++++++++++++++++++---- proxy/dokodemo/dokodemo.go | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/commander/commander.go b/app/commander/commander.go index 9ea71e6e..3b541f92 100644 --- a/app/commander/commander.go +++ b/app/commander/commander.go @@ -4,12 +4,14 @@ import ( "context" "net" "sync" + "strings" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/signal/done" core "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/outbound" + "github.com/xtls/xray-core/transport/internet" "google.golang.org/grpc" ) @@ -73,14 +75,27 @@ func (c *Commander) Start() error { } } + if len(c.listen) > 0 { - if l, err := net.Listen("tcp", c.listen); err != nil { + var addr net.Addr + + if strings.HasPrefix(c.listen, "/") || strings.HasPrefix(c.listen, "@") { + addr = &net.UnixAddr{Name: c.listen, Net: "unix"} + } else { + tcpAddr, err := net.ResolveTCPAddr("tcp", c.listen) + if err != nil { + errors.LogErrorInner(context.Background(), err, "API server failed to parse listen address ", c.listen) + return err + } + addr = tcpAddr + } + l, err := internet.ListenSystem(context.Background(), addr, nil) + if err != nil { errors.LogErrorInner(context.Background(), err, "API server failed to listen on ", c.listen) return err - } else { - errors.LogInfo(context.Background(), "API server listening on ", l.Addr()) - go listen(l) } + errors.LogInfo(context.Background(), "API server listening on ", l.Addr()) + go listen(l) return nil } diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index 7fd197e9..38bfa17c 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -95,7 +95,7 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st } } } - if dest.Port == 0 { + if dest.Port == 0 && port != "" { dest.Port = net.Port(common.Must2(strconv.Atoi(port))) } if d.portMap != nil && d.portMap[port] != "" {