add handle options for sniffer

This commit is contained in:
ginuerzh
2024-10-10 22:49:56 +08:00
parent 9a56c8fba3
commit 8f994ab632
94 changed files with 416 additions and 240 deletions
+1 -1
View File
@@ -10,12 +10,12 @@ import (
"strings" "strings"
"time" "time"
mdutil "github.com/go-gost/core/metadata/util"
"github.com/go-gost/x/config" "github.com/go-gost/x/config"
xnet "github.com/go-gost/x/internal/net" xnet "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/limiter/conn" "github.com/go-gost/x/limiter/conn"
"github.com/go-gost/x/limiter/traffic" "github.com/go-gost/x/limiter/traffic"
mdx "github.com/go-gost/x/metadata" mdx "github.com/go-gost/x/metadata"
mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+1 -1
View File
@@ -8,7 +8,6 @@ import (
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
"github.com/go-gost/core/hop" "github.com/go-gost/core/hop"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
mdutil "github.com/go-gost/core/metadata/util"
"github.com/go-gost/x/config" "github.com/go-gost/x/config"
"github.com/go-gost/x/config/parsing" "github.com/go-gost/x/config/parsing"
bypass_parser "github.com/go-gost/x/config/parsing/bypass" bypass_parser "github.com/go-gost/x/config/parsing/bypass"
@@ -19,6 +18,7 @@ import (
"github.com/go-gost/x/internal/loader" "github.com/go-gost/x/internal/loader"
"github.com/go-gost/x/internal/plugin" "github.com/go-gost/x/internal/plugin"
"github.com/go-gost/x/metadata" "github.com/go-gost/x/metadata"
mdutil "github.com/go-gost/x/metadata/util"
) )
func ParseHop(cfg *config.HopConfig, log logger.Logger) (hop.Hop, error) { func ParseHop(cfg *config.HopConfig, log logger.Logger) (hop.Hop, error) {
+1 -1
View File
@@ -12,7 +12,7 @@ import (
"github.com/go-gost/core/dialer" "github.com/go-gost/core/dialer"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/core/metadata" "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
xauth "github.com/go-gost/x/auth" xauth "github.com/go-gost/x/auth"
xchain "github.com/go-gost/x/chain" xchain "github.com/go-gost/x/chain"
"github.com/go-gost/x/config" "github.com/go-gost/x/config"
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"github.com/go-gost/core/hop" "github.com/go-gost/core/hop"
"github.com/go-gost/core/listener" "github.com/go-gost/core/listener"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/core/observer/stats" "github.com/go-gost/core/observer/stats"
"github.com/go-gost/core/recorder" "github.com/go-gost/core/recorder"
"github.com/go-gost/core/selector" "github.com/go-gost/core/selector"
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/relay" "github.com/go-gost/relay"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
"github.com/google/uuid" "github.com/google/uuid"
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
kcp_util "github.com/go-gost/x/internal/util/kcp" kcp_util "github.com/go-gost/x/internal/util/kcp"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -2,7 +2,7 @@ package tls
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"strings" "strings"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/mitchellh/go-homedir" "github.com/mitchellh/go-homedir"
"github.com/zalando/go-keyring" "github.com/zalando/go-keyring"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/mitchellh/go-homedir" "github.com/mitchellh/go-homedir"
"github.com/zalando/go-keyring" "github.com/zalando/go-keyring"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -9,7 +9,7 @@ require (
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d
github.com/gin-contrib/cors v1.6.0 github.com/gin-contrib/cors v1.6.0
github.com/gin-gonic/gin v1.9.1 github.com/gin-gonic/gin v1.9.1
github.com/go-gost/core v0.1.5 github.com/go-gost/core v0.1.6
github.com/go-gost/gosocks4 v0.0.1 github.com/go-gost/gosocks4 v0.0.1
github.com/go-gost/gosocks5 v0.4.2 github.com/go-gost/gosocks5 v0.4.2
github.com/go-gost/plugin v0.1.1 github.com/go-gost/plugin v0.1.1
+2 -2
View File
@@ -53,8 +53,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-gost/core v0.1.5 h1:Rbj+xq+q2RkxviUErjwyT8wbqCa5WeV+UelyIs99dFI= github.com/go-gost/core v0.1.6 h1:0Vdck2qrcfi1jz5f7fhfj+Uu0qvZhCdTdIisa5NDa98=
github.com/go-gost/core v0.1.5/go.mod h1:WGI43jOka7FAsSAwi/fSMaqxdR+E339ycb4NBGlFr6A= github.com/go-gost/core v0.1.6/go.mod h1:WGI43jOka7FAsSAwi/fSMaqxdR+E339ycb4NBGlFr6A=
github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s= github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s=
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
github.com/go-gost/gosocks5 v0.4.2 h1:IianxHTkACPqCwiOAT3MHoMdSUl+SEPSRu1ikawC1Pc= github.com/go-gost/gosocks5 v0.4.2 h1:IianxHTkACPqCwiOAT3MHoMdSUl+SEPSRu1ikawC1Pc=
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -2,7 +2,7 @@ package file
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+31 -2
View File
@@ -1,16 +1,27 @@
package local package local
import ( import (
"crypto"
"crypto/tls"
"crypto/x509"
"time" "time"
"github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry"
) )
type metadata struct { type metadata struct {
readTimeout time.Duration readTimeout time.Duration
sniffing bool sniffing bool
sniffingTimeout time.Duration sniffingTimeout time.Duration
certificate *x509.Certificate
privateKey crypto.PrivateKey
alpn string
mitmBypass bypass.Bypass
} }
func (h *forwardHandler) parseMetadata(md mdata.Metadata) (err error) { func (h *forwardHandler) parseMetadata(md mdata.Metadata) (err error) {
@@ -18,7 +29,25 @@ func (h *forwardHandler) parseMetadata(md mdata.Metadata) (err error) {
if h.md.readTimeout <= 0 { if h.md.readTimeout <= 0 {
h.md.readTimeout = 15 * time.Second h.md.readTimeout = 15 * time.Second
} }
h.md.sniffing = mdutil.GetBool(md, "sniffing") h.md.sniffing = mdutil.GetBool(md, "sniffing")
h.md.sniffingTimeout = mdutil.GetDuration(md, "sniffing.timeout") h.md.sniffingTimeout = mdutil.GetDuration(md, "sniffing.timeout")
certFile := mdutil.GetString(md, "mitm.certFile", "mitm.caCertFile")
keyFile := mdutil.GetString(md, "mitm.keyFile", "mitm.caKeyFile")
if certFile != "" && keyFile != "" {
tlsCert, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return err
}
h.md.certificate, err = x509.ParseCertificate(tlsCert.Certificate[0])
if err != nil {
return err
}
h.md.privateKey = tlsCert.PrivateKey
}
h.md.alpn = mdutil.GetString(md, "mitm.alpn")
h.md.mitmBypass = registry.BypassRegistry().Get(mdutil.GetString(md, "mitm.bypass"))
return return
} }
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings" "strings"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -2,7 +2,7 @@ package file
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+20 -8
View File
@@ -162,6 +162,9 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han
} }
if cc == nil { if cc == nil {
if h.options.Bypass != nil && h.options.Bypass.Contains(ctx, "tcp", dstAddr.String()) {
return nil, xbypass.ErrBypass
}
var buf bytes.Buffer var buf bytes.Buffer
cc, err = h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", dstAddr.String()) cc, err = h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", dstAddr.String())
ro.Route = buf.String() ro.Route = buf.String()
@@ -170,30 +173,39 @@ func (h *redirectHandler) Handle(ctx context.Context, conn net.Conn, opts ...han
return cc, err return cc, err
} }
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return dial(ctx, network, address)
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: dial,
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return dial(ctx, network, address)
},
} }
conn = xnet.NewReadWriteConn(br, conn, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithBypass(h.options.Bypass),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithBypass(h.options.Bypass),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+18 -10
View File
@@ -154,31 +154,39 @@ func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, rw, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+31 -20
View File
@@ -112,40 +112,51 @@ func (h *sniHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.
proto, _ := sniffing.Sniff(ctx, br) proto, _ := sniffing.Sniff(ctx, br)
ro.Proto = proto ro.Proto = proto
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
var buf bytes.Buffer
cc, err := h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", address)
ro.Route = buf.String()
return cc, err
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
var buf bytes.Buffer
cc, err := h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", address)
ro.Route = buf.String()
if err != nil {
return nil, err
}
cc = tls.Client(cc, cfg)
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
var buf bytes.Buffer
cc, err := h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", address)
ro.Route = buf.String()
return cc, err
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
var buf bytes.Buffer
cc, err := h.options.Router.Dial(ctxvalue.ContextWithBuffer(ctx, &buf), "tcp", address)
ro.Route = buf.String()
if err != nil {
return nil, err
}
cc = tls.Client(cc, cfg)
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, conn, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithBypass(h.options.Bypass),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithBypass(h.options.Bypass),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
default: default:
return errors.New("unknown traffic") return errors.New("unknown traffic")
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+18 -10
View File
@@ -246,31 +246,39 @@ func (h *socks4Handler) handleConnect(ctx context.Context, conn net.Conn, req *g
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, rw, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+18 -10
View File
@@ -91,31 +91,39 @@ func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, networ
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, rw, conn) conn = xnet.NewReadWriteConn(br, rw, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+18 -10
View File
@@ -165,31 +165,39 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.H
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, conn, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+18 -10
View File
@@ -161,30 +161,38 @@ func (h *forwardHandler) handleDirectForward(ctx context.Context, conn *sshd_uti
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, xnet.NewReadWriteConn(br, conn, conn)) return sniffer.HandleHTTP(ctx, xnet.NewReadWriteConn(br, conn, conn),
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, xnet.NewReadWriteConn(br, conn, conn)) return sniffer.HandleTLS(ctx, xnet.NewReadWriteConn(br, conn, conn),
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+1 -1
View File
@@ -2,7 +2,7 @@ package tap
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"github.com/go-gost/core/ingress" "github.com/go-gost/core/ingress"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/core/sd" "github.com/go-gost/core/sd"
"github.com/go-gost/relay" "github.com/go-gost/relay"
xingress "github.com/go-gost/x/ingress" xingress "github.com/go-gost/x/ingress"
+18 -10
View File
@@ -141,31 +141,39 @@ func (h *unixHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
} }
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
}
dialTLS := func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
}
sniffer := &sniffing.Sniffer{ sniffer := &sniffing.Sniffer{
Recorder: h.recorder.Recorder, Recorder: h.recorder.Recorder,
RecorderOptions: h.recorder.Options, RecorderOptions: h.recorder.Options,
RecorderObject: ro,
Certificate: h.md.certificate, Certificate: h.md.certificate,
PrivateKey: h.md.privateKey, PrivateKey: h.md.privateKey,
NegotiatedProtocol: h.md.alpn, NegotiatedProtocol: h.md.alpn,
CertPool: h.certPool, CertPool: h.certPool,
MitmBypass: h.md.mitmBypass, MitmBypass: h.md.mitmBypass,
ReadTimeout: h.md.readTimeout, ReadTimeout: h.md.readTimeout,
Log: log,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return cc, nil
},
DialTLS: func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return cc, nil
},
} }
conn = xnet.NewReadWriteConn(br, conn, conn) conn = xnet.NewReadWriteConn(br, conn, conn)
switch proto { switch proto {
case sniffing.ProtoHTTP: case sniffing.ProtoHTTP:
return sniffer.HandleHTTP(ctx, conn) return sniffer.HandleHTTP(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
case sniffing.ProtoTLS: case sniffing.ProtoTLS:
return sniffer.HandleTLS(ctx, conn) return sniffer.HandleTLS(ctx, conn,
sniffing.WithDial(dial),
sniffing.WithDialTLS(dialTLS),
sniffing.WithRecorderObject(ro),
sniffing.WithLog(log),
)
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"github.com/go-gost/core/bypass" "github.com/go-gost/core/bypass"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )
+141 -65
View File
@@ -21,6 +21,7 @@ import (
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/core/recorder" "github.com/go-gost/core/recorder"
dissector "github.com/go-gost/tls-dissector" dissector "github.com/go-gost/tls-dissector"
xbypass "github.com/go-gost/x/bypass"
xio "github.com/go-gost/x/internal/io" xio "github.com/go-gost/x/internal/io"
xnet "github.com/go-gost/x/internal/net" xnet "github.com/go-gost/x/internal/net"
xhttp "github.com/go-gost/x/internal/net/http" xhttp "github.com/go-gost/x/internal/net/http"
@@ -38,13 +39,50 @@ var (
DefaultCertPool = tls_util.NewMemoryCertPool() DefaultCertPool = tls_util.NewMemoryCertPool()
) )
type Sniffer struct { type HandleOptions struct {
Dial func(ctx context.Context, network, address string) (net.Conn, error) Dial func(ctx context.Context, network, address string) (net.Conn, error)
DialTLS func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) DialTLS func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error)
Bypass bypass.Bypass
RecorderObject *xrecorder.HandlerRecorderObject
Log logger.Logger
}
type HandleOption func(opts *HandleOptions)
func WithDial(dial func(ctx context.Context, network, address string) (net.Conn, error)) HandleOption {
return func(opts *HandleOptions) {
opts.Dial = dial
}
}
func WithDialTLS(dialTLS func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error)) HandleOption {
return func(opts *HandleOptions) {
opts.DialTLS = dialTLS
}
}
func WithBypass(bypass bypass.Bypass) HandleOption {
return func(opts *HandleOptions) {
opts.Bypass = bypass
}
}
func WithRecorderObject(ro *xrecorder.HandlerRecorderObject) HandleOption {
return func(opts *HandleOptions) {
opts.RecorderObject = ro
}
}
func WithLog(log logger.Logger) HandleOption {
return func(opts *HandleOptions) {
opts.Log = log
}
}
type Sniffer struct {
Recorder recorder.Recorder Recorder recorder.Recorder
RecorderOptions *recorder.Options RecorderOptions *recorder.Options
RecorderObject *xrecorder.HandlerRecorderObject
// MITM TLS termination // MITM TLS termination
Certificate *x509.Certificate Certificate *x509.Certificate
@@ -54,21 +92,25 @@ type Sniffer struct {
MitmBypass bypass.Bypass MitmBypass bypass.Bypass
ReadTimeout time.Duration ReadTimeout time.Duration
Log logger.Logger
} }
func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn) error { func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn, opts ...HandleOption) error {
var o HandleOptions
for _, opt := range opts {
opt(&o)
}
br := bufio.NewReader(conn) br := bufio.NewReader(conn)
req, err := http.ReadRequest(br) req, err := http.ReadRequest(br)
if err != nil { if err != nil {
return err return err
} }
if h.Log.IsLevelEnabled(logger.TraceLevel) { if o.Log.IsLevelEnabled(logger.TraceLevel) {
dump, _ := httputil.DumpRequest(req, false) dump, _ := httputil.DumpRequest(req, false)
h.Log.Trace(string(dump)) o.Log.Trace(string(dump))
} }
ro := h.RecorderObject ro := o.RecorderObject
host := req.Host host := req.Host
if host != "" { if host != "" {
if _, _, err := net.SplitHostPort(host); err != nil { if _, _, err := net.SplitHostPort(host); err != nil {
@@ -76,9 +118,13 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn) error {
} }
ro.Host = host ro.Host = host
h.Log = h.Log.WithFields(map[string]any{ o.Log = o.Log.WithFields(map[string]any{
"host": host, "host": host,
}) })
if o.Bypass != nil && o.Bypass.Contains(ctx, "tcp", host) {
return xbypass.ErrBypass
}
} }
// http/2 // http/2
@@ -96,35 +142,39 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn) error {
ro.Time = time.Time{} ro.Time = time.Time{}
tr := &http2.Transport{
DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) {
if dial := o.DialTLS; dial != nil {
return dial(ctx, network, addr, cfg)
}
cc, err := (&net.Dialer{}).DialContext(ctx, network, addr)
if err != nil {
return nil, err
}
cc = tls.Client(cc, cfg)
return cc, nil
},
}
defer tr.CloseIdleConnections()
h2s := &http2.Server{} h2s := &http2.Server{}
h2s.ServeConn(xnet.NewReadWriteConn(br, conn, conn), &http2.ServeConnOpts{ h2s.ServeConn(xnet.NewReadWriteConn(br, conn, conn), &http2.ServeConnOpts{
Context: ctx, Context: ctx,
SawClientPreface: true, SawClientPreface: true,
Handler: &h2Handler{ Handler: &h2Handler{
Client: &http.Client{ transport: tr,
Transport: &http2.Transport{ recorder: h.Recorder,
DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { recorderOptions: h.RecorderOptions,
if dial := h.DialTLS; dial != nil { recorderObject: ro,
return dial(ctx, network, addr, cfg) log: o.Log,
}
cc, err := (&net.Dialer{}).DialContext(ctx, network, addr)
if err != nil {
return nil, err
}
cc = tls.Client(cc, cfg)
return cc, nil
},
},
},
Sniffer: h,
}, },
}) })
return nil return nil
} }
dial := h.Dial dial := o.Dial
if dial == nil { if dial == nil {
dial = (&net.Dialer{}).DialContext dial = (&net.Dialer{}).DialContext
} }
@@ -136,7 +186,7 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn) error {
ro.Time = time.Time{} ro.Time = time.Time{}
shouldClose, err := h.httpRoundTrip(ctx, conn, cc, req) shouldClose, err := h.httpRoundTrip(ctx, conn, cc, req, &o)
if err != nil || shouldClose { if err != nil || shouldClose {
return err return err
} }
@@ -150,35 +200,35 @@ func (h *Sniffer) HandleHTTP(ctx context.Context, conn net.Conn) error {
return err return err
} }
if h.Log.IsLevelEnabled(logger.TraceLevel) { if o.Log.IsLevelEnabled(logger.TraceLevel) {
dump, _ := httputil.DumpRequest(req, false) dump, _ := httputil.DumpRequest(req, false)
h.Log.Trace(string(dump)) o.Log.Trace(string(dump))
} }
if shouldClose, err := h.httpRoundTrip(ctx, conn, cc, req); err != nil || shouldClose { if shouldClose, err := h.httpRoundTrip(ctx, conn, cc, req, &o); err != nil || shouldClose {
return err return err
} }
} }
} }
func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *http.Request) (close bool, err error) { func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *http.Request, o *HandleOptions) (close bool, err error) {
close = true close = true
ro := &xrecorder.HandlerRecorderObject{} ro := &xrecorder.HandlerRecorderObject{}
*ro = *h.RecorderObject *ro = *o.RecorderObject
ro.Time = time.Now() ro.Time = time.Now()
h.Log.Infof("%s <-> %s", ro.RemoteAddr, req.Host) o.Log.Infof("%s <-> %s", ro.RemoteAddr, req.Host)
defer func() { defer func() {
ro.Duration = time.Since(ro.Time) ro.Duration = time.Since(ro.Time)
if err != nil { if err != nil {
ro.Err = err.Error() ro.Err = err.Error()
} }
if err := ro.Record(ctx, h.Recorder); err != nil { if err := ro.Record(ctx, h.Recorder); err != nil {
h.Log.Errorf("record: %v", err) o.Log.Errorf("record: %v", err)
} }
h.Log.WithFields(map[string]any{ o.Log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
}).Infof("%s >-< %s", ro.RemoteAddr, req.Host) }).Infof("%s >-< %s", ro.RemoteAddr, req.Host)
}() }()
@@ -231,7 +281,7 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *
xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout)) xio.SetReadDeadline(cc, time.Now().Add(h.ReadTimeout))
resp, err := http.ReadResponse(bufio.NewReader(cc), req) resp, err := http.ReadResponse(bufio.NewReader(cc), req)
if err != nil { if err != nil {
h.Log.Errorf("read response: %v", err) o.Log.Errorf("read response: %v", err)
return return
} }
defer resp.Body.Close() defer resp.Body.Close()
@@ -241,9 +291,9 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *
ro.HTTP.Response.Header = resp.Header ro.HTTP.Response.Header = resp.Header
ro.HTTP.Response.ContentLength = resp.ContentLength ro.HTTP.Response.ContentLength = resp.ContentLength
if h.Log.IsLevelEnabled(logger.TraceLevel) { if o.Log.IsLevelEnabled(logger.TraceLevel) {
dump, _ := httputil.DumpResponse(resp, false) dump, _ := httputil.DumpResponse(resp, false)
h.Log.Trace(string(dump)) o.Log.Trace(string(dump))
} }
// HTTP/1.0 // HTTP/1.0
@@ -266,7 +316,7 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *
} }
if err = resp.Write(rw); err != nil { if err = resp.Write(rw); err != nil {
h.Log.Errorf("write response: %v", err) o.Log.Errorf("write response: %v", err)
return return
} }
@@ -282,14 +332,19 @@ func (h *Sniffer) httpRoundTrip(ctx context.Context, rw, cc io.ReadWriter, req *
return resp.Close, nil return resp.Close, nil
} }
func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn) error { func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn, opts ...HandleOption) error {
var o HandleOptions
for _, opt := range opts {
opt(&o)
}
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
clientHello, err := dissector.ParseClientHello(io.TeeReader(conn, buf)) clientHello, err := dissector.ParseClientHello(io.TeeReader(conn, buf))
if err != nil { if err != nil {
return err return err
} }
ro := h.RecorderObject ro := o.RecorderObject
ro.TLS = &xrecorder.TLSRecorderObject{ ro.TLS = &xrecorder.TLSRecorderObject{
ServerName: clientHello.ServerName, ServerName: clientHello.ServerName,
ClientHello: hex.EncodeToString(buf.Bytes()), ClientHello: hex.EncodeToString(buf.Bytes()),
@@ -304,9 +359,13 @@ func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn) error {
host = net.JoinHostPort(strings.Trim(host, "[]"), "443") host = net.JoinHostPort(strings.Trim(host, "[]"), "443")
} }
ro.Host = host ro.Host = host
if o.Bypass != nil && o.Bypass.Contains(ctx, "tcp", host) {
return xbypass.ErrBypass
}
} }
dial := h.Dial dial := o.Dial
if dial == nil { if dial == nil {
dial = (&net.Dialer{}).DialContext dial = (&net.Dialer{}).DialContext
} }
@@ -322,7 +381,7 @@ func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn) error {
host = ro.Host host = ro.Host
} }
if h.MitmBypass == nil || !h.MitmBypass.Contains(ctx, "tcp", host) { if h.MitmBypass == nil || !h.MitmBypass.Contains(ctx, "tcp", host) {
return h.terminateTLS(ctx, xnet.NewReadWriteConn(io.MultiReader(buf, conn), conn, conn), cc, clientHello) return h.terminateTLS(ctx, xnet.NewReadWriteConn(io.MultiReader(buf, conn), conn, conn), cc, clientHello, &o)
} }
} }
@@ -353,17 +412,18 @@ func (h *Sniffer) HandleTLS(ctx context.Context, conn net.Conn) error {
return err return err
} }
h.Log.Infof("%s <-> %s", ro.RemoteAddr, ro.Host) o.Log.Infof("%s <-> %s", ro.RemoteAddr, ro.Host)
xnet.Transport(conn, cc) xnet.Transport(conn, cc)
h.Log.WithFields(map[string]any{ o.Log.WithFields(map[string]any{
"duration": time.Since(ro.Time), "duration": time.Since(ro.Time),
}).Infof("%s >-< %s", ro.RemoteAddr, ro.Host) }).Infof("%s >-< %s", ro.RemoteAddr, ro.Host)
return err return err
} }
func (h *Sniffer) terminateTLS(ctx context.Context, conn, cc net.Conn, clientHello *dissector.ClientHelloInfo) error { func (h *Sniffer) terminateTLS(ctx context.Context, conn, cc net.Conn, clientHello *dissector.ClientHelloInfo, o *HandleOptions) error {
ro := h.RecorderObject ro := o.RecorderObject
log := o.Log
nextProtos := clientHello.SupportedProtos nextProtos := clientHello.SupportedProtos
if h.NegotiatedProtocol != "" { if h.NegotiatedProtocol != "" {
@@ -419,8 +479,20 @@ func (h *Sniffer) terminateTLS(ctx context.Context, conn, cc net.Conn, clientHel
serverName = host serverName = host
} }
cert, err := certPool.Get(serverName) cert, err := certPool.Get(serverName)
if cert != nil {
pool := x509.NewCertPool()
pool.AddCert(h.Certificate)
if _, err = cert.Verify(x509.VerifyOptions{
DNSName: serverName,
Roots: pool,
}); err != nil {
log.Warnf("verify cached certificate for %s: %v", serverName, err)
cert = nil
}
}
if cert == nil { if cert == nil {
cert, err = tls_util.GenerateCertificate(serverName, 7*24*time.Hour, h.Certificate, h.PrivateKey) cert, err = tls_util.GenerateCertificate(serverName, 7*24*time.Hour, h.Certificate, h.PrivateKey)
certPool.Put(serverName, cert)
} }
if err != nil { if err != nil {
return nil, err return nil, err
@@ -436,28 +508,32 @@ func (h *Sniffer) terminateTLS(ctx context.Context, conn, cc net.Conn, clientHel
return err return err
} }
sniffer := &Sniffer{} opts := []HandleOption{
*sniffer = *h WithDial(func(ctx context.Context, network, address string) (net.Conn, error) {
return clientConn, nil
sniffer.Dial = func(ctx context.Context, network, address string) (net.Conn, error) { }),
return clientConn, nil WithDialTLS(func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) {
return clientConn, nil
}),
WithRecorderObject(ro),
WithLog(log),
} }
sniffer.DialTLS = func(ctx context.Context, network, address string, cfg *tls.Config) (net.Conn, error) { return h.HandleHTTP(ctx, serverConn, opts...)
return clientConn, nil
}
return sniffer.HandleHTTP(ctx, serverConn)
} }
type h2Handler struct { type h2Handler struct {
Client *http.Client transport http.RoundTripper
Sniffer *Sniffer recorder recorder.Recorder
recorderOptions *recorder.Options
recorderObject *xrecorder.HandlerRecorderObject
log logger.Logger
} }
func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log := h.Sniffer.Log log := h.log
ro := &xrecorder.HandlerRecorderObject{} ro := &xrecorder.HandlerRecorderObject{}
*ro = *h.Sniffer.RecorderObject *ro = *h.recorderObject
ro.Time = time.Now() ro.Time = time.Now()
var err error var err error
@@ -467,7 +543,7 @@ func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err != nil { if err != nil {
ro.Err = err.Error() ro.Err = err.Error()
} }
if err := ro.Record(r.Context(), h.Sniffer.Recorder); err != nil { if err := ro.Record(r.Context(), h.recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
@@ -510,7 +586,7 @@ func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
var reqBody *xhttp.Body var reqBody *xhttp.Body
if opts := h.Sniffer.RecorderOptions; opts != nil && opts.HTTPBody { if opts := h.recorderOptions; opts != nil && opts.HTTPBody {
if req.Body != nil { if req.Body != nil {
maxSize := opts.MaxBodySize maxSize := opts.MaxBodySize
if maxSize <= 0 { if maxSize <= 0 {
@@ -521,7 +597,7 @@ func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
resp, err := h.Client.Do(req.WithContext(r.Context())) resp, err := h.transport.RoundTrip(req.WithContext(r.Context()))
if reqBody != nil { if reqBody != nil {
ro.HTTP.Request.Body = reqBody.Content() ro.HTTP.Request.Body = reqBody.Content()
ro.HTTP.Request.ContentLength = reqBody.Length() ro.HTTP.Request.ContentLength = reqBody.Length()
@@ -546,7 +622,7 @@ func (h *h2Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(resp.StatusCode) w.WriteHeader(resp.StatusCode)
var respBody *xhttp.Body var respBody *xhttp.Body
if opts := h.Sniffer.RecorderOptions; opts != nil && opts.HTTPBody { if opts := h.recorderOptions; opts != nil && opts.HTTPBody {
maxSize := opts.MaxBodySize maxSize := opts.MaxBodySize
if maxSize <= 0 { if maxSize <= 0 {
maxSize = DefaultBodySize maxSize = DefaultBodySize
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -2,7 +2,7 @@ package h2
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -2,7 +2,7 @@ package http2
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
kcp_util "github.com/go-gost/x/internal/util/kcp" kcp_util "github.com/go-gost/x/internal/util/kcp"
) )
+1 -1
View File
@@ -2,7 +2,7 @@ package mtcp
import ( import (
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -2,7 +2,7 @@ package mtls
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -2,7 +2,7 @@ package tls
import ( import (
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"strings" "strings"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -2,7 +2,7 @@ package tcp
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"os" "os"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
ssh_util "github.com/go-gost/x/internal/util/ssh" ssh_util "github.com/go-gost/x/internal/util/ssh"
"github.com/mitchellh/go-homedir" "github.com/mitchellh/go-homedir"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"os" "os"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
ssh_util "github.com/go-gost/x/internal/util/ssh" ssh_util "github.com/go-gost/x/internal/util/ssh"
"github.com/mitchellh/go-homedir" "github.com/mitchellh/go-homedir"
"github.com/zalando/go-keyring" "github.com/zalando/go-keyring"
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings" "strings"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
tap_util "github.com/go-gost/x/internal/util/tap" tap_util "github.com/go-gost/x/internal/util/tap"
) )
+1 -1
View File
@@ -2,7 +2,7 @@ package tcp
import ( import (
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -2,7 +2,7 @@ package tls
import ( import (
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
type metadata struct { type metadata struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/core/router" "github.com/go-gost/core/router"
tun_util "github.com/go-gost/x/internal/util/tun" tun_util "github.com/go-gost/x/internal/util/tun"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
mdata "github.com/go-gost/core/metadata" mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
) )
const ( const (
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"time" "time"
"github.com/go-gost/core/metadata" "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/core/selector" "github.com/go-gost/core/selector"
) )
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/core/metadata" "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util" mdutil "github.com/go-gost/x/metadata/util"
"github.com/go-gost/core/selector" "github.com/go-gost/core/selector"
ctxvalue "github.com/go-gost/x/ctx" ctxvalue "github.com/go-gost/x/ctx"
) )