add handle options for sniffer
This commit is contained in:
+1
-1
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user