Skip to content

Commit

Permalink
refactor: 获取远程目的从tunnel中剔除,移至tracker
Browse files Browse the repository at this point in the history
  • Loading branch information
Skyxim committed May 27, 2022
1 parent 72fb153 commit ac36473
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 22 deletions.
36 changes: 28 additions & 8 deletions adapter/outbound/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"errors"
"github.com/gofrs/uuid"
"net"
"strings"

"github.com/Dreamacro/clash/component/dialer"
C "github.com/Dreamacro/clash/constant"
Expand Down Expand Up @@ -128,12 +129,12 @@ func NewBase(opt BaseOption) *Base {

type conn struct {
net.Conn
chain C.Chain
lastAdapterRemote string
chain C.Chain
actualRemoteDestination string
}

func (c *conn) RemoteDestination() string {
return c.lastAdapterRemote
return c.actualRemoteDestination
}

// Chains implements C.Connection
Expand All @@ -147,17 +148,24 @@ func (c *conn) AppendToChains(a C.ProxyAdapter) {
}

func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn {
return &conn{c, []string{a.Name()}, a.Addr()}
var remoteDestination string
if tcpAddr, ok := c.RemoteAddr().(*net.TCPAddr); ok {
remoteDestination = tcpAddr.IP.String()
} else {
remoteDestination = parseRemoteDestination(a.Addr())
}

return &conn{c, []string{a.Name()}, remoteDestination}
}

type packetConn struct {
net.PacketConn
chain C.Chain
lastAdapterRemote string
chain C.Chain
actualRemoteDestination string
}

func (c *packetConn) RemoteDestination() string {
return c.lastAdapterRemote
return c.actualRemoteDestination
}

// Chains implements C.Connection
Expand All @@ -171,5 +179,17 @@ func (c *packetConn) AppendToChains(a C.ProxyAdapter) {
}

func newPacketConn(pc net.PacketConn, a C.ProxyAdapter) C.PacketConn {
return &packetConn{pc, []string{a.Name()}, a.Addr()}
return &packetConn{pc, []string{a.Name()}, parseRemoteDestination(a.Addr())}
}

func parseRemoteDestination(addr string) string {
if dst, _, err := net.SplitHostPort(addr); err == nil {
return dst
} else {
if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") {
return dst
} else {
return ""
}
}
}
2 changes: 2 additions & 0 deletions tunnel/statistic/tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ func (tt *tcpTracker) Close() error {

func NewTCPTracker(conn C.Conn, manager *Manager, metadata *C.Metadata, rule C.Rule) *tcpTracker {
uuid, _ := uuid.NewV4()
metadata.RemoteDst = conn.RemoteDestination()

t := &tcpTracker{
Conn: conn,
Expand Down Expand Up @@ -116,6 +117,7 @@ func (ut *udpTracker) Close() error {

func NewUDPTracker(conn C.PacketConn, manager *Manager, metadata *C.Metadata, rule C.Rule) *udpTracker {
uuid, _ := uuid.NewV4()
metadata.RemoteDst = conn.RemoteDestination()

ut := &udpTracker{
PacketConn: conn,
Expand Down
14 changes: 0 additions & 14 deletions tunnel/tunnel.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"path/filepath"
"runtime"
"strconv"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -288,15 +287,6 @@ func handleUDPConn(packet *inbound.PacketAdapter) {
}
pCtx.InjectPacketConn(rawPc)

addr := rawPc.RemoteDestination()
if dst, _, err := net.SplitHostPort(addr); err == nil {
metadata.RemoteDst = dst
} else {
if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") {
metadata.RemoteDst = addr
}
}

pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule)

switch true {
Expand Down Expand Up @@ -359,10 +349,6 @@ func handleTCPConn(connCtx C.ConnContext) {
return
}

if tcpAddr, ok := remoteConn.RemoteAddr().(*net.TCPAddr); ok {
metadata.RemoteDst = tcpAddr.IP.String()
}

remoteConn = statistic.NewTCPTracker(remoteConn, statistic.DefaultManager, metadata, rule)
defer func(remoteConn C.Conn) {
_ = remoteConn.Close()
Expand Down

0 comments on commit ac36473

Please sign in to comment.