diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go index 61eb4571..84f26764 100644 --- a/adapter/outbound/direct.go +++ b/adapter/outbound/direct.go @@ -3,6 +3,7 @@ package outbound import ( "context" "net" + "net/netip" "github.com/Dreamacro/clash/component/dialer" C "github.com/Dreamacro/clash/constant" @@ -19,12 +20,20 @@ func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ... if err != nil { return nil, err } + tcpKeepAlive(c) + + if !metadata.DstIP.IsValid() && c.RemoteAddr() != nil { + if h, _, err := net.SplitHostPort(c.RemoteAddr().String()); err == nil { + metadata.DstIP = netip.MustParseAddr(h) + } + } + return NewConn(c, d), nil } // ListenPacketContext implements C.ProxyAdapter -func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (d *Direct) ListenPacketContext(ctx context.Context, _ *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { opts = append(opts, dialer.WithDirect()) pc, err := dialer.ListenPacket(ctx, "udp", "", d.Base.DialOptions(opts...)...) if err != nil {