From a98749eb167354677628aacaf301573674a68aeb Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Tue, 12 Apr 2022 21:54:54 +0800 Subject: [PATCH 1/5] Fix: fakeip pool cycle used --- component/fakeip/pool.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/component/fakeip/pool.go b/component/fakeip/pool.go index 2b887fc3..e1a8150a 100644 --- a/component/fakeip/pool.go +++ b/component/fakeip/pool.go @@ -1,22 +1,16 @@ package fakeip import ( + "encoding/binary" "errors" "math/bits" "net/netip" "sync" - _ "unsafe" "github.com/Dreamacro/clash/component/profile/cachefile" "github.com/Dreamacro/clash/component/trie" ) -//go:linkname beUint64 net/netip.beUint64 -func beUint64(b []byte) uint64 - -//go:linkname bePutUint64 net/netip.bePutUint64 -func bePutUint64(b []byte, v uint64) - type uint128 struct { hi uint64 lo uint64 @@ -104,15 +98,22 @@ func (p *Pool) CloneFrom(o *Pool) { } func (p *Pool) get(host string) netip.Addr { - p.offset = p.offset.Next() + for { + p.offset = p.offset.Next() - if !p.offset.Less(p.last) { - p.cycle = true - p.offset = p.first - } + if !p.offset.Less(p.last) { + p.cycle = true + p.offset = p.first + } - if p.cycle { - p.store.DelByIP(p.offset) + if p.cycle { + p.store.DelByIP(p.offset) + break + } + + if !p.store.Exist(p.offset) { + break + } } p.store.PutByIP(p.offset, host) @@ -174,8 +175,8 @@ func add(addr netip.Addr, n uint64) netip.Addr { buf := addr.As16() u := uint128{ - beUint64(buf[:8]), - beUint64(buf[8:]), + binary.BigEndian.Uint64(buf[:8]), + binary.BigEndian.Uint64(buf[8:]), } lo, carry := bits.Add64(u.lo, n, 0) @@ -183,8 +184,8 @@ func add(addr netip.Addr, n uint64) netip.Addr { u.hi = u.hi + carry u.lo = lo - bePutUint64(buf[:8], u.hi) - bePutUint64(buf[8:], u.lo) + binary.BigEndian.PutUint64(buf[:8], u.hi) + binary.BigEndian.PutUint64(buf[8:], u.lo) a := netip.AddrFrom16(buf) From 21a56ea36b7d1dbf61372bfa7b94f54850fd2306 Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Tue, 12 Apr 2022 22:33:10 +0800 Subject: [PATCH 2/5] Chore: adjust ipstack --- listener/tun/device/device.go | 3 - listener/tun/device/iobased/endpoint.go | 27 ++++++-- listener/tun/device/tun/tun_wireguard.go | 17 ++---- listener/tun/device/tun/tun_wireguard_unix.go | 8 +++ ...un_windows.go => tun_wireguard_windows.go} | 5 ++ listener/tun/ipstack/gvisor/option/option.go | 58 ++++++++++++++---- listener/tun/ipstack/gvisor/stack.go | 1 - listener/tun/ipstack/gvisor/tcp.go | 61 +++++++++++++------ listener/tun/ipstack/gvisor/udp.go | 14 +++-- listener/tun/ipstack/system/stack.go | 59 ++++++++++++------ 10 files changed, 180 insertions(+), 73 deletions(-) create mode 100644 listener/tun/device/tun/tun_wireguard_unix.go rename listener/tun/device/tun/{tun_windows.go => tun_wireguard_windows.go} (84%) diff --git a/listener/tun/device/device.go b/listener/tun/device/device.go index 73b03dee..70115cbd 100644 --- a/listener/tun/device/device.go +++ b/listener/tun/device/device.go @@ -29,7 +29,4 @@ type Device interface { // UseIOBased work for other ip stack UseIOBased() error - - // Wait waits for the device to close. - Wait() } diff --git a/listener/tun/device/iobased/endpoint.go b/listener/tun/device/iobased/endpoint.go index c0942d10..e0a4583a 100644 --- a/listener/tun/device/iobased/endpoint.go +++ b/listener/tun/device/iobased/endpoint.go @@ -36,6 +36,9 @@ type Endpoint struct { // once is used to perform the init action once when attaching. once sync.Once + + // wg keeps track of running goroutines. + wg sync.WaitGroup } // New returns stack.LinkEndpoint(.*Endpoint) and error. @@ -60,19 +63,26 @@ func New(rw io.ReadWriter, mtu uint32, offset int) (*Endpoint, error) { }, nil } -func (e *Endpoint) Close() { - e.Endpoint.Close() +func (e *Endpoint) Wait() { + e.wg.Wait() } // Attach launches the goroutine that reads packets from io.Reader and // dispatches them via the provided dispatcher. func (e *Endpoint) Attach(dispatcher stack.NetworkDispatcher) { + e.Endpoint.Attach(dispatcher) e.once.Do(func() { ctx, cancel := context.WithCancel(context.Background()) - go e.dispatchLoop(cancel) - go e.outboundLoop(ctx) + e.wg.Add(2) + go func() { + e.outboundLoop(ctx) + e.wg.Done() + }() + go func() { + e.dispatchLoop(cancel) + e.wg.Done() + }() }) - e.Endpoint.Attach(dispatcher) } // dispatchLoop dispatches packets to upper layer. @@ -81,14 +91,19 @@ func (e *Endpoint) dispatchLoop(cancel context.CancelFunc) { // gracefully after (*Endpoint).dispatchLoop(context.CancelFunc) returns. defer cancel() + mtu := int(e.mtu) for { - data := make([]byte, int(e.mtu)) + data := make([]byte, mtu) n, err := e.rw.Read(data) if err != nil { break } + if n == 0 || n > mtu { + continue + } + if !e.IsAttached() { continue /* unattached, drop packet */ } diff --git a/listener/tun/device/tun/tun_wireguard.go b/listener/tun/device/tun/tun_wireguard.go index 35008425..529a1054 100644 --- a/listener/tun/device/tun/tun_wireguard.go +++ b/listener/tun/device/tun/tun_wireguard.go @@ -32,15 +32,6 @@ func Open(name string, mtu uint32) (_ device.Device, err error) { } }() - var ( - offset = 4 /* 4 bytes TUN_PI */ - defaultMTU = 1500 - ) - if runtime.GOOS == "windows" { - offset = 0 - defaultMTU = 0 /* auto */ - } - t := &TUN{ name: name, mtu: mtu, @@ -101,9 +92,11 @@ func (t *TUN) Write(packet []byte) (int, error) { } func (t *TUN) Close() error { - if t.Endpoint != nil { - t.Endpoint.Close() - } + defer func(ep *iobased.Endpoint) { + if ep != nil { + ep.Close() + } + }(t.Endpoint) return t.nt.Close() } diff --git a/listener/tun/device/tun/tun_wireguard_unix.go b/listener/tun/device/tun/tun_wireguard_unix.go new file mode 100644 index 00000000..d88787fb --- /dev/null +++ b/listener/tun/device/tun/tun_wireguard_unix.go @@ -0,0 +1,8 @@ +//go:build !linux && !windows + +package tun + +const ( + offset = 4 /* 4 bytes TUN_PI */ + defaultMTU = 1500 +) diff --git a/listener/tun/device/tun/tun_windows.go b/listener/tun/device/tun/tun_wireguard_windows.go similarity index 84% rename from listener/tun/device/tun/tun_windows.go rename to listener/tun/device/tun/tun_wireguard_windows.go index 3f6eb444..f7cf8498 100644 --- a/listener/tun/device/tun/tun_windows.go +++ b/listener/tun/device/tun/tun_wireguard_windows.go @@ -5,6 +5,11 @@ import ( "golang.zx2c4.com/wireguard/tun" ) +const ( + offset = 0 + defaultMTU = 0 /* auto */ +) + func init() { guid, _ := windows.GUIDFromString("{330EAEF8-7578-5DF2-D97B-8DADC0EA85CB}") diff --git a/listener/tun/ipstack/gvisor/option/option.go b/listener/tun/ipstack/gvisor/option/option.go index 34508e0d..2076fd58 100644 --- a/listener/tun/ipstack/gvisor/option/option.go +++ b/listener/tun/ipstack/gvisor/option/option.go @@ -37,7 +37,7 @@ const ( // tcpModerateReceiveBufferEnabled is the value used by stack to // enable or disable tcp receive buffer auto-tuning option. - tcpModerateReceiveBufferEnabled = true + tcpModerateReceiveBufferEnabled = false // tcpSACKEnabled is the value used by stack to enable or disable // tcp selective ACK. @@ -47,14 +47,18 @@ const ( tcpRecovery = tcpip.TCPRACKLossDetection // tcpMinBufferSize is the smallest size of a send/recv buffer. - tcpMinBufferSize = tcp.MinBufferSize // 4 KiB + tcpMinBufferSize = tcp.MinBufferSize // tcpMaxBufferSize is the maximum permitted size of a send/recv buffer. - tcpMaxBufferSize = tcp.MaxBufferSize // 4 MiB + tcpMaxBufferSize = tcp.MaxBufferSize - // tcpDefaultBufferSize is the default size of the send/recv buffer for + // tcpDefaultBufferSize is the default size of the send buffer for // a transport endpoint. - tcpDefaultBufferSize = 212 << 10 // 212 KiB + tcpDefaultSendBufferSize = tcp.DefaultSendBufferSize + + // tcpDefaultReceiveBufferSize is the default size of the receive buffer + // for a transport endpoint. + tcpDefaultReceiveBufferSize = tcp.DefaultReceiveBufferSize ) type Option func(*stack.Stack) error @@ -74,7 +78,8 @@ func WithDefault() Option { // in too large buffers. // // Ref: https://github.com/cloudflare/slirpnetstack/blob/master/stack.go - WithTCPBufferSizeRange(tcpMinBufferSize, tcpDefaultBufferSize, tcpMaxBufferSize), + WithTCPSendBufferSizeRange(tcpMinBufferSize, tcpDefaultSendBufferSize, tcpMaxBufferSize), + WithTCPReceiveBufferSizeRange(tcpMinBufferSize, tcpDefaultReceiveBufferSize, tcpMaxBufferSize), WithTCPCongestionControl(tcpCongestionControlAlgorithm), WithTCPDelay(tcpDelayEnabled), @@ -154,17 +159,46 @@ func WithICMPLimit(limit rate.Limit) Option { } } -// WithTCPBufferSizeRange sets the receive and send buffer size range for TCP. -func WithTCPBufferSizeRange(a, b, c int) Option { +// WithTCPSendBufferSize sets default the send buffer size for TCP. +func WithTCPSendBufferSize(size int) Option { + return func(s *stack.Stack) error { + sndOpt := tcpip.TCPSendBufferSizeRangeOption{Min: tcpMinBufferSize, Default: size, Max: tcpMaxBufferSize} + if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &sndOpt); err != nil { + return fmt.Errorf("set TCP send buffer size range: %s", err) + } + return nil + } +} + +// WithTCPSendBufferSizeRange sets the send buffer size range for TCP. +func WithTCPSendBufferSizeRange(a, b, c int) Option { + return func(s *stack.Stack) error { + sndOpt := tcpip.TCPSendBufferSizeRangeOption{Min: a, Default: b, Max: c} + if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &sndOpt); err != nil { + return fmt.Errorf("set TCP send buffer size range: %s", err) + } + return nil + } +} + +// WithTCPReceiveBufferSize sets the default receive buffer size for TCP. +func WithTCPReceiveBufferSize(size int) Option { + return func(s *stack.Stack) error { + rcvOpt := tcpip.TCPReceiveBufferSizeRangeOption{Min: tcpMinBufferSize, Default: size, Max: tcpMaxBufferSize} + if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &rcvOpt); err != nil { + return fmt.Errorf("set TCP receive buffer size range: %s", err) + } + return nil + } +} + +// WithTCPReceiveBufferSizeRange sets the receive buffer size range for TCP. +func WithTCPReceiveBufferSizeRange(a, b, c int) Option { return func(s *stack.Stack) error { rcvOpt := tcpip.TCPReceiveBufferSizeRangeOption{Min: a, Default: b, Max: c} if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &rcvOpt); err != nil { return fmt.Errorf("set TCP receive buffer size range: %s", err) } - sndOpt := tcpip.TCPSendBufferSizeRangeOption{Min: a, Default: b, Max: c} - if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &sndOpt); err != nil { - return fmt.Errorf("set TCP send buffer size range: %s", err) - } return nil } } diff --git a/listener/tun/ipstack/gvisor/stack.go b/listener/tun/ipstack/gvisor/stack.go index 9061995d..c762e6a2 100644 --- a/listener/tun/ipstack/gvisor/stack.go +++ b/listener/tun/ipstack/gvisor/stack.go @@ -25,7 +25,6 @@ func (s *gvStack) Close() error { var err error if s.device != nil { err = s.device.Close() - s.device.Wait() } if s.Stack != nil { s.Stack.Close() diff --git a/listener/tun/ipstack/gvisor/tcp.go b/listener/tun/ipstack/gvisor/tcp.go index 8bffb932..61f5d90e 100644 --- a/listener/tun/ipstack/gvisor/tcp.go +++ b/listener/tun/ipstack/gvisor/tcp.go @@ -1,14 +1,15 @@ package gvisor import ( - "fmt" "time" "github.com/Dreamacro/clash/listener/tun/ipstack/gvisor/adapter" "github.com/Dreamacro/clash/listener/tun/ipstack/gvisor/option" + "github.com/Dreamacro/clash/log" "gvisor.dev/gvisor/pkg/tcpip" "gvisor.dev/gvisor/pkg/tcpip/adapters/gonet" + "gvisor.dev/gvisor/pkg/tcpip/header" "gvisor.dev/gvisor/pkg/tcpip/stack" "gvisor.dev/gvisor/pkg/tcpip/transport/tcp" "gvisor.dev/gvisor/pkg/waiter" @@ -43,8 +44,21 @@ const ( func withTCPHandler(handle adapter.TCPHandleFunc) option.Option { return func(s *stack.Stack) error { tcpForwarder := tcp.NewForwarder(s, defaultWndSize, maxConnAttempts, func(r *tcp.ForwarderRequest) { - var wq waiter.Queue - ep, err := r.CreateEndpoint(&wq) + var ( + wq waiter.Queue + ep tcpip.Endpoint + err tcpip.Error + id = r.ID() + ) + + defer func() { + if err != nil { + log.Warnln("[STACK] forward tcp request %s:%d->%s:%d: %s", id.RemoteAddress, id.RemotePort, id.LocalAddress, id.LocalPort, err) + } + }() + + // Perform a TCP three-way handshake. + ep, err = r.CreateEndpoint(&wq) if err != nil { // RST: prevent potential half-open TCP connection leak. r.Complete(true) @@ -52,11 +66,11 @@ func withTCPHandler(handle adapter.TCPHandleFunc) option.Option { } defer r.Complete(false) - setKeepalive(ep) + err = setSocketOptions(s, ep) conn := &tcpConn{ TCPConn: gonet.NewTCPConn(&wq, ep), - id: r.ID(), + id: id, } handle(conn) }) @@ -65,21 +79,34 @@ func withTCPHandler(handle adapter.TCPHandleFunc) option.Option { } } -func setKeepalive(ep tcpip.Endpoint) error { - ep.SocketOptions().SetKeepAlive(true) +func setSocketOptions(s *stack.Stack, ep tcpip.Endpoint) tcpip.Error { + { /* TCP keepalive options */ + ep.SocketOptions().SetKeepAlive(true) - idle := tcpip.KeepaliveIdleOption(tcpKeepaliveIdle) - if err := ep.SetSockOpt(&idle); err != nil { - return fmt.Errorf("set keepalive idle: %s", err) + idle := tcpip.KeepaliveIdleOption(tcpKeepaliveIdle) + if err := ep.SetSockOpt(&idle); err != nil { + return err + } + + interval := tcpip.KeepaliveIntervalOption(tcpKeepaliveInterval) + if err := ep.SetSockOpt(&interval); err != nil { + return err + } + + if err := ep.SetSockOptInt(tcpip.KeepaliveCountOption, tcpKeepaliveCount); err != nil { + return err + } } + { /* TCP recv/send buffer size */ + var ss tcpip.TCPSendBufferSizeRangeOption + if err := s.TransportProtocolOption(header.TCPProtocolNumber, &ss); err == nil { + ep.SocketOptions().SetReceiveBufferSize(int64(ss.Default), false) + } - interval := tcpip.KeepaliveIntervalOption(tcpKeepaliveInterval) - if err := ep.SetSockOpt(&interval); err != nil { - return fmt.Errorf("set keepalive interval: %s", err) - } - - if err := ep.SetSockOptInt(tcpip.KeepaliveCountOption, tcpKeepaliveCount); err != nil { - return fmt.Errorf("set keepalive count: %s", err) + var rs tcpip.TCPReceiveBufferSizeRangeOption + if err := s.TransportProtocolOption(header.TCPProtocolNumber, &rs); err == nil { + ep.SocketOptions().SetReceiveBufferSize(int64(rs.Default), false) + } } return nil } diff --git a/listener/tun/ipstack/gvisor/udp.go b/listener/tun/ipstack/gvisor/udp.go index 688583a0..502e3a9c 100644 --- a/listener/tun/ipstack/gvisor/udp.go +++ b/listener/tun/ipstack/gvisor/udp.go @@ -6,6 +6,7 @@ import ( "github.com/Dreamacro/clash/common/pool" "github.com/Dreamacro/clash/listener/tun/ipstack/gvisor/adapter" "github.com/Dreamacro/clash/listener/tun/ipstack/gvisor/option" + "github.com/Dreamacro/clash/log" "gvisor.dev/gvisor/pkg/tcpip/adapters/gonet" "gvisor.dev/gvisor/pkg/tcpip/stack" @@ -16,16 +17,19 @@ import ( func withUDPHandler(handle adapter.UDPHandleFunc) option.Option { return func(s *stack.Stack) error { udpForwarder := udp.NewForwarder(s, func(r *udp.ForwarderRequest) { - var wq waiter.Queue + var ( + wq waiter.Queue + id = r.ID() + ) ep, err := r.CreateEndpoint(&wq) if err != nil { - // TODO: handler errors in the future. + log.Warnln("[STACK] udp forwarder request %s:%d->%s:%d: %s", id.RemoteAddress, id.RemotePort, id.LocalAddress, id.LocalPort, err) return } conn := &udpConn{ UDPConn: gonet.NewUDPConn(s, &wq, ep), - id: r.ID(), + id: id, } handle(conn) }) @@ -54,7 +58,7 @@ func (c *packet) Data() []byte { } // WriteBack write UDP packet with source(ip, port) = `addr` -func (c *packet) WriteBack(b []byte, addr net.Addr) (n int, err error) { +func (c *packet) WriteBack(b []byte, _ net.Addr) (n int, err error) { return c.pc.WriteTo(b, c.rAddr) } @@ -64,5 +68,5 @@ func (c *packet) LocalAddr() net.Addr { } func (c *packet) Drop() { - pool.Put(c.payload) + _ = pool.Put(c.payload) } diff --git a/listener/tun/ipstack/system/stack.go b/listener/tun/ipstack/system/stack.go index d8b250ba..d0b24e3a 100644 --- a/listener/tun/ipstack/system/stack.go +++ b/listener/tun/ipstack/system/stack.go @@ -17,6 +17,7 @@ import ( "github.com/Dreamacro/clash/listener/tun/ipstack" D "github.com/Dreamacro/clash/listener/tun/ipstack/commons" "github.com/Dreamacro/clash/listener/tun/ipstack/system/mars" + "github.com/Dreamacro/clash/listener/tun/ipstack/system/mars/nat" "github.com/Dreamacro/clash/log" "github.com/Dreamacro/clash/transport/socks5" ) @@ -24,14 +25,20 @@ import ( type sysStack struct { stack io.Closer device device.Device + + closed bool } -func (s sysStack) Close() error { +func (s *sysStack) Close() error { + defer func() { + if s.device != nil { + _ = s.device.Close() + } + }() + + s.closed = true if s.stack != nil { - _ = s.stack.Close() - } - if s.device != nil { - _ = s.device.Close() + return s.stack.Close() } return nil } @@ -49,17 +56,25 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref return nil, err } + ipStack := &sysStack{stack: stack, device: device} + dnsAddr := dnsHijack tcp := func() { - defer stack.TCP().Close() + defer func(tcp *nat.TCP) { + _ = tcp.Close() + }(stack.TCP()) + defer log.Debugln("TCP: closed") - for stack.TCP().SetDeadline(time.Time{}) == nil { + for !ipStack.closed { + if err = stack.TCP().SetDeadline(time.Time{}); err != nil { + break + } + conn, err := stack.TCP().Accept() if err != nil { log.Debugln("Accept connection: %v", err) - continue } @@ -73,13 +88,19 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref go func() { log.Debugln("[TUN] hijack dns tcp: %s", rAddrPort.String()) - defer conn.Close() + defer func(conn net.Conn) { + _ = conn.Close() + }(conn) buf := pool.Get(pool.UDPBufferSize) - defer pool.Put(buf) + defer func(buf []byte) { + _ = pool.Put(buf) + }(buf) for { - conn.SetReadDeadline(time.Now().Add(C.DefaultTCPTimeout)) + if err = conn.SetReadDeadline(time.Now().Add(C.DefaultTCPTimeout)); err != nil { + break + } length := uint16(0) if err := binary.Read(conn, binary.BigEndian, &length); err != nil { @@ -123,10 +144,13 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref } udp := func() { - defer stack.UDP().Close() + defer func(udp *nat.UDP) { + _ = udp.Close() + }(stack.UDP()) + defer log.Debugln("UDP: closed") - for { + for !ipStack.closed { buf := pool.Get(pool.UDPBufferSize) n, lRAddr, rRAddr, err := stack.UDP().ReadFrom(buf) @@ -143,15 +167,16 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref if D.ShouldHijackDns(dnsAddr, rAddrPort) { go func() { - defer pool.Put(buf) - msg, err := D.RelayDnsPacket(raw) if err != nil { + _ = pool.Put(buf) return } _, _ = stack.UDP().WriteTo(msg, rAddr, lAddr) + _ = pool.Put(buf) + log.Debugln("[TUN] hijack dns udp: %s", rAddrPort.String()) }() @@ -165,7 +190,7 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref return stack.UDP().WriteTo(b, rAddr, lAddr) }, drop: func() { - pool.Put(buf) + _ = pool.Put(buf) }, } @@ -186,5 +211,5 @@ func New(device device.Device, dnsHijack []netip.AddrPort, tunAddress netip.Pref go udp() } - return &sysStack{stack: stack, device: device}, nil + return ipStack, nil } From 643f1ae97080db365cc6910cfd894df91e264074 Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Tue, 12 Apr 2022 22:35:21 +0800 Subject: [PATCH 3/5] Chore: update dependencies --- go.mod | 20 ++++++++++---------- go.sum | 46 +++++++++++++++++++++------------------------- test/go.mod | 16 ++++++++-------- test/go.sum | 33 ++++++++++++++++----------------- 4 files changed, 55 insertions(+), 60 deletions(-) diff --git a/go.mod b/go.mod index 31d291dc..d4f55367 100644 --- a/go.mod +++ b/go.mod @@ -10,37 +10,37 @@ require ( github.com/gofrs/uuid v4.2.0+incompatible github.com/gorilla/websocket v1.5.0 github.com/insomniacslk/dhcp v0.0.0-20220119180841-3c283ff8b7dd - github.com/miekg/dns v1.1.47 - github.com/oschwald/geoip2-golang v1.6.1 + github.com/miekg/dns v1.1.48 + github.com/oschwald/geoip2-golang v1.7.0 github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.7.1 github.com/xtls/go v0.0.0-20210920065950-d4af136d3672 go.etcd.io/bbolt v1.3.6 go.uber.org/atomic v1.9.0 - go.uber.org/automaxprocs v1.4.0 - golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 - golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 + go.uber.org/automaxprocs v1.5.1 + golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 + golang.org/x/net v0.0.0-20220412020605-290c469a71a5 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f + golang.org/x/sys v0.0.0-20220412071739-889880a91fd5 golang.org/x/text v0.3.8-0.20220124021120-d1c84af989ab - golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 + golang.org/x/time v0.0.0-20220411224347-583f2d630306 golang.zx2c4.com/wireguard v0.0.0-20220318042302-193cf8d6a5d6 golang.zx2c4.com/wireguard/windows v0.5.4-0.20220317000008-6432784c2469 google.golang.org/protobuf v1.28.0 gopkg.in/yaml.v2 v2.4.0 - gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84 + gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/btree v1.0.1 // indirect github.com/kr/pretty v0.2.1 // indirect - github.com/oschwald/maxminddb-golang v1.8.0 // indirect + github.com/oschwald/maxminddb-golang v1.9.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/u-root/uio v0.0.0-20210528114334-82958018845c // indirect golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 // indirect golang.org/x/tools v0.1.9 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 479f39bf..56e3f8f3 100644 --- a/go.sum +++ b/go.sum @@ -33,7 +33,6 @@ github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGu github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -46,14 +45,15 @@ github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcK github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= -github.com/miekg/dns v1.1.47 h1:J9bWiXbqMbnZPcY8Qi2E3EWIBsIm6MZzzJB9VRg5gL8= -github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/oschwald/geoip2-golang v1.6.1 h1:GKxT3yaWWNXSb7vj6D7eoJBns+lGYgx08QO0UcNm0YY= -github.com/oschwald/geoip2-golang v1.6.1/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s= -github.com/oschwald/maxminddb-golang v1.8.0 h1:Uh/DSnGoxsyp/KYbY1AuP0tYEwfs0sCph9p/UMXK/Hk= -github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= +github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= +github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/oschwald/geoip2-golang v1.7.0 h1:JW1r5AKi+vv2ujSxjKthySK3jo8w8oKWPyXsw+Qs/S8= +github.com/oschwald/geoip2-golang v1.7.0/go.mod h1:mdI/C7iK7NVMcIDDtf4bCKMJ7r0o7UwGeCo9eiitCMQ= +github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsGojab6EjC1Y= +github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -61,9 +61,7 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/u-root/uio v0.0.0-20210528114334-82958018845c h1:BFvcl34IGnw8yvJi8hlqLFo9EshRInwWBs2M5fGWzQA= @@ -75,14 +73,14 @@ go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= -go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= +go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= +go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4= golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= @@ -99,8 +97,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 h1:EN5+DfgmRMvRUrMGERW2gQl3Vc+Z7ZMnI/xdEpPSf0c= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -113,7 +111,6 @@ golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -125,16 +122,16 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f h1:8w7RhxzTVgUzw/AH/9mUV5q0vMgy40SQRursCcfmkCw= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412071739-889880a91fd5 h1:NubxfvTRuNb4RVzWrIDAUzUvREH1HkCD4JjyQTSG9As= +golang.org/x/sys v0.0.0-20220412071739-889880a91fd5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8-0.20220124021120-d1c84af989ab h1:eHo2TTVBaAPw9lDGK2Gb9GyPMXT6g7O63W6sx3ylbzU= golang.org/x/text v0.3.8-0.20220124021120-d1c84af989ab/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -157,11 +154,10 @@ google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscL google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84 h1:nENO+rT8Nx+Vtp/VK+K7g9VpHdvJwJYCFgdN5yaoAzA= -gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b h1:JW1pUBe6A3H+b0B9DwEOcfK+TLS/04A3A9cettPpfV0= +gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI= diff --git a/test/go.mod b/test/go.mod index 94f109dc..0c6954a5 100644 --- a/test/go.mod +++ b/test/go.mod @@ -6,9 +6,9 @@ require ( github.com/Dreamacro/clash v1.7.2-0.20211108085948-bd2ea2b917aa github.com/docker/docker v20.10.13+incompatible github.com/docker/go-connections v0.4.0 - github.com/miekg/dns v1.1.47 + github.com/miekg/dns v1.1.48 github.com/stretchr/testify v1.7.1 - golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 + golang.org/x/net v0.0.0-20220412020605-290c469a71a5 ) replace github.com/Dreamacro/clash => ../ @@ -30,8 +30,8 @@ require ( github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/oschwald/geoip2-golang v1.6.1 // indirect - github.com/oschwald/maxminddb-golang v1.8.0 // indirect + github.com/oschwald/geoip2-golang v1.7.0 // indirect + github.com/oschwald/maxminddb-golang v1.9.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect @@ -39,12 +39,12 @@ require ( github.com/xtls/go v0.0.0-20210920065950-d4af136d3672 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect + golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f // indirect + golang.org/x/sys v0.0.0-20220412071739-889880a91fd5 // indirect golang.org/x/text v0.3.8-0.20220124021120-d1c84af989ab // indirect - golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect + golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect golang.org/x/tools v0.1.9 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect @@ -56,5 +56,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect gotest.tools/v3 v3.1.0 // indirect - gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84 // indirect + gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b // indirect ) diff --git a/test/go.sum b/test/go.sum index 991673db..ad42d1ba 100644 --- a/test/go.sum +++ b/test/go.sum @@ -597,8 +597,8 @@ github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZ github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.47 h1:J9bWiXbqMbnZPcY8Qi2E3EWIBsIm6MZzzJB9VRg5gL8= -github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= +github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -692,10 +692,10 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3 github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/oschwald/geoip2-golang v1.6.1 h1:GKxT3yaWWNXSb7vj6D7eoJBns+lGYgx08QO0UcNm0YY= -github.com/oschwald/geoip2-golang v1.6.1/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s= -github.com/oschwald/maxminddb-golang v1.8.0 h1:Uh/DSnGoxsyp/KYbY1AuP0tYEwfs0sCph9p/UMXK/Hk= -github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= +github.com/oschwald/geoip2-golang v1.7.0 h1:JW1r5AKi+vv2ujSxjKthySK3jo8w8oKWPyXsw+Qs/S8= +github.com/oschwald/geoip2-golang v1.7.0/go.mod h1:mdI/C7iK7NVMcIDDtf4bCKMJ7r0o7UwGeCo9eiitCMQ= +github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsGojab6EjC1Y= +github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= @@ -913,8 +913,8 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1012,8 +1012,8 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 h1:EN5+DfgmRMvRUrMGERW2gQl3Vc+Z7ZMnI/xdEpPSf0c= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1078,7 +1078,6 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1144,8 +1143,8 @@ golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f h1:8w7RhxzTVgUzw/AH/9mUV5q0vMgy40SQRursCcfmkCw= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412071739-889880a91fd5 h1:NubxfvTRuNb4RVzWrIDAUzUvREH1HkCD4JjyQTSG9As= +golang.org/x/sys v0.0.0-20220412071739-889880a91fd5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1169,8 +1168,8 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1414,8 +1413,8 @@ gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= -gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84 h1:nENO+rT8Nx+Vtp/VK+K7g9VpHdvJwJYCFgdN5yaoAzA= -gvisor.dev/gvisor v0.0.0-20220326024801-5d1f3d24cb84/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI= +gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b h1:JW1pUBe6A3H+b0B9DwEOcfK+TLS/04A3A9cettPpfV0= +gvisor.dev/gvisor v0.0.0-20220412020520-6917e582612b/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From abc8ed4df0dbc819de8f06498d6faf5c88db7aea Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:51:24 +0800 Subject: [PATCH 4/5] Chore: hijack traffic destined for port 80 to mitm proxy server by default --- adapter/outbound/mitm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter/outbound/mitm.go b/adapter/outbound/mitm.go index 80577cd9..faa04a4c 100644 --- a/adapter/outbound/mitm.go +++ b/adapter/outbound/mitm.go @@ -30,7 +30,7 @@ func (d *Mitm) DialContext(ctx context.Context, metadata *C.Metadata, _ ...diale return nil, errIgnored } - if MiddlemanRewriteHosts.Search(metadata.String()) == nil { + if MiddlemanRewriteHosts.Search(metadata.String()) == nil && metadata.DstPort != "80" { return nil, errIgnored } From a3a50f9c7bbec7f6ea9d4f72e7c002b73a260d50 Mon Sep 17 00:00:00 2001 From: yaling888 <73897884+yaling888@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:55:08 +0800 Subject: [PATCH 5/5] Chore: persistence fakeip pool state --- component/fakeip/pool.go | 62 ++++++++++++++++++++++++++-------- component/resolver/enhancer.go | 7 ++++ dns/enhancer.go | 12 +++++-- hub/executor/executor.go | 1 + 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/component/fakeip/pool.go b/component/fakeip/pool.go index e1a8150a..57613a48 100644 --- a/component/fakeip/pool.go +++ b/component/fakeip/pool.go @@ -11,6 +11,11 @@ import ( "github.com/Dreamacro/clash/component/trie" ) +const ( + offsetKey = "key-offset-fake-ip" + cycleKey = "key-cycle-fake-ip" +) + type uint128 struct { hi uint64 lo uint64 @@ -98,22 +103,15 @@ func (p *Pool) CloneFrom(o *Pool) { } func (p *Pool) get(host string) netip.Addr { - for { - p.offset = p.offset.Next() + p.offset = p.offset.Next() - if !p.offset.Less(p.last) { - p.cycle = true - p.offset = p.first - } + if !p.offset.Less(p.last) { + p.cycle = true + p.offset = p.first + } - if p.cycle { - p.store.DelByIP(p.offset) - break - } - - if !p.store.Exist(p.offset) { - break - } + if p.cycle || p.store.Exist(p.offset) { + p.store.DelByIP(p.offset) } p.store.PutByIP(p.offset, host) @@ -121,7 +119,39 @@ func (p *Pool) get(host string) netip.Addr { } func (p *Pool) FlushFakeIP() error { - return p.store.FlushFakeIP() + err := p.store.FlushFakeIP() + if err == nil { + p.cycle = false + p.offset = p.first + } + return err +} + +func (p *Pool) StoreState() { + if s, ok := p.store.(*cachefileStore); ok { + s.PutByHost(offsetKey, p.offset) + if p.cycle { + s.PutByHost(cycleKey, p.offset) + } + } +} + +func (p *Pool) restoreState() { + if s, ok := p.store.(*cachefileStore); ok { + if _, exist := s.GetByHost(cycleKey); exist { + p.cycle = true + } + + if offset, exist := s.GetByHost(offsetKey); exist { + if p.ipnet.Contains(offset) { + p.offset = offset + } else { + _ = p.FlushFakeIP() + } + } else if s.Exist(p.first) { + _ = p.FlushFakeIP() + } + } } type Options struct { @@ -167,6 +197,8 @@ func New(options Options) (*Pool, error) { pool.store = newMemoryStore(options.Size) } + pool.restoreState() + return pool, nil } diff --git a/component/resolver/enhancer.go b/component/resolver/enhancer.go index 77f18374..503211c4 100644 --- a/component/resolver/enhancer.go +++ b/component/resolver/enhancer.go @@ -15,6 +15,7 @@ type Enhancer interface { FindHostByIP(net.IP) (string, bool) FlushFakeIP() error InsertHostByIP(net.IP, string) + StoreFakePoolSate() } func FakeIPEnabled() bool { @@ -77,3 +78,9 @@ func FlushFakeIP() error { } return nil } + +func StoreFakePoolSate() { + if mapper := DefaultHostMapper; mapper != nil { + mapper.StoreFakePoolSate() + } +} diff --git a/dns/enhancer.go b/dns/enhancer.go index 2190f6aa..4e828987 100644 --- a/dns/enhancer.go +++ b/dns/enhancer.go @@ -84,6 +84,13 @@ func (h *ResolverEnhancer) InsertHostByIP(ip net.IP, host string) { } } +func (h *ResolverEnhancer) FlushFakeIP() error { + if h.fakePool != nil { + return h.fakePool.FlushFakeIP() + } + return nil +} + func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) { if h.mapping != nil && o.mapping != nil { o.mapping.CloneTo(h.mapping) @@ -94,11 +101,10 @@ func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) { } } -func (h *ResolverEnhancer) FlushFakeIP() error { +func (h *ResolverEnhancer) StoreFakePoolSate() { if h.fakePool != nil { - return h.fakePool.FlushFakeIP() + h.fakePool.StoreState() } - return nil } func NewEnhancer(cfg Config) *ResolverEnhancer { diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 1af128d6..ace85c51 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -347,6 +347,7 @@ func updateMitm(mitm *config.Mitm) { func Shutdown() { P.Cleanup() tproxy.CleanupTProxyIPTables() + resolver.StoreFakePoolSate() log.Warnln("Clash shutting down") }