mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-08-28 17:35:31 +00:00
Try fix Wireguard inbound context sharing problem
This commit is contained in:
parent
105b306d07
commit
ea7f8ef0e7
@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/xtls/xray-core/common"
|
"github.com/xtls/xray-core/common"
|
||||||
"github.com/xtls/xray-core/common/buf"
|
"github.com/xtls/xray-core/common/buf"
|
||||||
|
c "github.com/xtls/xray-core/common/ctx"
|
||||||
"github.com/xtls/xray-core/common/errors"
|
"github.com/xtls/xray-core/common/errors"
|
||||||
"github.com/xtls/xray-core/common/log"
|
"github.com/xtls/xray-core/common/log"
|
||||||
"github.com/xtls/xray-core/common/net"
|
"github.com/xtls/xray-core/common/net"
|
||||||
@ -30,10 +31,8 @@ type Server struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type routingInfo struct {
|
type routingInfo struct {
|
||||||
ctx context.Context
|
|
||||||
dispatcher routing.Dispatcher
|
dispatcher routing.Dispatcher
|
||||||
inboundTag *session.Inbound
|
inboundTag *session.Inbound
|
||||||
outboundTag *session.Outbound
|
|
||||||
contentTag *session.Content
|
contentTag *session.Content
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,18 +77,9 @@ func (*Server) Network() []net.Network {
|
|||||||
|
|
||||||
// Process implements proxy.Inbound.
|
// Process implements proxy.Inbound.
|
||||||
func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error {
|
func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error {
|
||||||
inbound := session.InboundFromContext(ctx)
|
|
||||||
inbound.Name = "wireguard"
|
|
||||||
inbound.CanSpliceCopy = 3
|
|
||||||
outbounds := session.OutboundsFromContext(ctx)
|
|
||||||
ob := outbounds[len(outbounds)-1]
|
|
||||||
|
|
||||||
s.info = routingInfo{
|
s.info = routingInfo{
|
||||||
ctx: core.ToBackgroundDetachedContext(ctx),
|
|
||||||
dispatcher: dispatcher,
|
dispatcher: dispatcher,
|
||||||
inboundTag: session.InboundFromContext(ctx),
|
inboundTag: session.InboundFromContext(ctx),
|
||||||
outboundTag: ob,
|
|
||||||
contentTag: session.ContentFromContext(ctx),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ep, err := s.bindServer.ParseEndpoint(conn.RemoteAddr().String())
|
ep, err := s.bindServer.ParseEndpoint(conn.RemoteAddr().String())
|
||||||
@ -128,12 +118,26 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
|
|||||||
|
|
||||||
func (s *Server) forwardConnection(dest net.Destination, conn net.Conn) {
|
func (s *Server) forwardConnection(dest net.Destination, conn net.Conn) {
|
||||||
if s.info.dispatcher == nil {
|
if s.info.dispatcher == nil {
|
||||||
errors.LogError(s.info.ctx, "unexpected: dispatcher == nil")
|
errors.LogError(context.Background(), "unexpected: dispatcher == nil")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(core.ToBackgroundDetachedContext(s.info.ctx))
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
sid := session.NewID()
|
||||||
|
ctx = c.ContextWithID(ctx, sid)
|
||||||
|
if s.info.inboundTag != nil {
|
||||||
|
ctx = session.ContextWithInbound(ctx, s.info.inboundTag)
|
||||||
|
}
|
||||||
|
if s.info.contentTag != nil {
|
||||||
|
ctx = session.ContextWithContent(ctx, s.info.contentTag)
|
||||||
|
}
|
||||||
|
inbound := session.InboundFromContext(ctx)
|
||||||
|
inbound.Name = "wireguard"
|
||||||
|
inbound.CanSpliceCopy = 3
|
||||||
|
outbounds := []*session.Outbound{{}}
|
||||||
|
ctx = session.ContextWithOutbounds(ctx, outbounds) // since promiscuousModeHandler mixed-up context, we need to define new Outbounds here
|
||||||
|
|
||||||
plcy := s.policyManager.ForLevel(0)
|
plcy := s.policyManager.ForLevel(0)
|
||||||
timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
|
timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
|
||||||
|
|
||||||
@ -144,25 +148,9 @@ func (s *Server) forwardConnection(dest net.Destination, conn net.Conn) {
|
|||||||
Reason: "",
|
Reason: "",
|
||||||
})
|
})
|
||||||
|
|
||||||
if s.info.inboundTag != nil {
|
|
||||||
ctx = session.ContextWithInbound(ctx, s.info.inboundTag)
|
|
||||||
}
|
|
||||||
|
|
||||||
// what's this?
|
|
||||||
// Session information should not be shared between different connections
|
|
||||||
// why reuse them in server level? This will cause incorrect destoverride and unexpected routing behavior.
|
|
||||||
// Disable it temporarily. Maybe s.info should be removed.
|
|
||||||
|
|
||||||
// if s.info.outboundTag != nil {
|
|
||||||
// ctx = session.ContextWithOutbounds(ctx, []*session.Outbound{s.info.outboundTag})
|
|
||||||
// }
|
|
||||||
// if s.info.contentTag != nil {
|
|
||||||
// ctx = session.ContextWithContent(ctx, s.info.contentTag)
|
|
||||||
// }
|
|
||||||
|
|
||||||
link, err := s.info.dispatcher.Dispatch(ctx, dest)
|
link, err := s.info.dispatcher.Dispatch(ctx, dest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errors.LogErrorInner(s.info.ctx, err, "dispatch connection")
|
errors.LogErrorInner(ctx, err, "dispatch connection")
|
||||||
}
|
}
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@ -188,7 +176,7 @@ func (s *Server) forwardConnection(dest net.Destination, conn net.Conn) {
|
|||||||
if err := task.Run(ctx, requestDonePost, responseDone); err != nil {
|
if err := task.Run(ctx, requestDonePost, responseDone); err != nil {
|
||||||
common.Interrupt(link.Reader)
|
common.Interrupt(link.Reader)
|
||||||
common.Interrupt(link.Writer)
|
common.Interrupt(link.Writer)
|
||||||
errors.LogDebugInner(s.info.ctx, err, "connection ends")
|
errors.LogDebugInner(ctx, err, "connection ends")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user