From 8b959b213fe0ffe6eefa183f838b8eeafa439903 Mon Sep 17 00:00:00 2001 From: naiba Date: Thu, 19 Dec 2024 23:21:31 +0800 Subject: [PATCH] refactor: fallback agent ip to connecting ip --- cmd/dashboard/rpc/rpc.go | 24 ++++++++++++----------- go.mod | 8 ++++---- go.sum | 16 +++++++-------- model/common.go | 1 + service/rpc/nezha.go | 11 ++++++++++- service/singleton/frontend-templates.yaml | 4 ++-- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/cmd/dashboard/rpc/rpc.go b/cmd/dashboard/rpc/rpc.go index dd95637..1618870 100644 --- a/cmd/dashboard/rpc/rpc.go +++ b/cmd/dashboard/rpc/rpc.go @@ -36,22 +36,24 @@ func waf(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handl } func getRealIp(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + var ip, connectingIp string + p, ok := peer.FromContext(ctx) + if ok { + addrPort, err := netip.ParseAddrPort(p.Addr.String()) + if err == nil { + connectingIp = addrPort.Addr().String() + } + } + ctx = context.WithValue(ctx, model.CtxKeyConnectingIP{}, connectingIp) + if singleton.Conf.RealIPHeader == "" { return handler(ctx, req) } - var ip string - if singleton.Conf.RealIPHeader == model.ConfigUsePeerIP { - p, ok := peer.FromContext(ctx) - if !ok { - return nil, fmt.Errorf("peer not found") + if connectingIp == "" { + return nil, fmt.Errorf("connecting ip not found") } - addrPort, err := netip.ParseAddrPort(p.Addr.String()) - if err != nil { - return nil, err - } - ip = addrPort.Addr().String() } else { vals := metadata.ValueFromIncomingContext(ctx, singleton.Conf.RealIPHeader) if len(vals) == 0 { @@ -65,7 +67,7 @@ func getRealIp(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, } if singleton.Conf.Debug { - log.Printf("NEZHA>> gRPC Real IP: %s", ip) + log.Printf("NEZHA>> gRPC Agent Real IP: %s, connecting IP: %s\n", ip, connectingIp) } ctx = context.WithValue(ctx, model.CtxKeyRealIP{}, ip) diff --git a/go.mod b/go.mod index f2526fa..28ef269 100644 --- a/go.mod +++ b/go.mod @@ -31,11 +31,11 @@ require ( github.com/swaggo/swag v1.16.4 github.com/tidwall/gjson v1.18.0 golang.org/x/crypto v0.31.0 - golang.org/x/exp v0.0.0-20241210194714-1829a127f884 - golang.org/x/net v0.32.0 + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 + golang.org/x/net v0.33.0 golang.org/x/sync v0.10.0 - google.golang.org/grpc v1.69.0 - google.golang.org/protobuf v1.35.2 + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/sqlite v1.5.7 gorm.io/gorm v1.25.12 diff --git a/go.sum b/go.sum index e15ae49..8c35b05 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= @@ -196,8 +196,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= @@ -228,10 +228,10 @@ golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.69.0 h1:quSiOM1GJPmPH5XtU+BCoVXcDVJJAzNcoyfC2cCjGkI= -google.golang.org/grpc v1.69.0/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/model/common.go b/model/common.go index 10394e9..294295e 100644 --- a/model/common.go +++ b/model/common.go @@ -10,6 +10,7 @@ const ( ) type CtxKeyRealIP struct{} +type CtxKeyConnectingIP struct{} type Common struct { ID uint64 `gorm:"primaryKey" json:"id,omitempty"` diff --git a/service/rpc/nezha.go b/service/rpc/nezha.go index 672529b..8002f26 100644 --- a/service/rpc/nezha.go +++ b/service/rpc/nezha.go @@ -201,9 +201,18 @@ func (s *NezhaHandler) ReportGeoIP(c context.Context, r *pb.GeoIP) (*pb.GeoIP, e } geoip := model.PB2GeoIP(r) - joinedIP := geoip.IP.Join() use6 := r.GetUse6() + if geoip.IP.IPv4Addr == "" && geoip.IP.IPv6Addr == "" { + ip, _ := c.Value(model.CtxKeyRealIP{}).(string) + if ip == "" { + ip, _ = c.Value(model.CtxKeyConnectingIP{}).(string) + } + geoip.IP.IPv4Addr = ip + } + + joinedIP := geoip.IP.Join() + singleton.ServerLock.RLock() // 检查并更新DDNS if singleton.ServerList[clientID].EnableDDNS && joinedIP != "" && diff --git a/service/singleton/frontend-templates.yaml b/service/singleton/frontend-templates.yaml index 4af8d02..fb4c63a 100644 --- a/service/singleton/frontend-templates.yaml +++ b/service/singleton/frontend-templates.yaml @@ -9,10 +9,10 @@ name: "Official" repository: "https://github.com/hamster1963/nezha-dash-v1" author: "hamster1963" - version: "v1.4.5" + version: "v1.6.1" isofficial: true - path: "nazhua-dist" name: "Nazhua" repository: "https://github.com/hi2shark/nazhua" author: "hi2hi" - version: "v0.4.20" + version: "v0.4.22"