diff --git a/go.mod b/go.mod index de8911ea0..4dda10d58 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,6 @@ toolchain go1.22.7 require ( github.com/adrg/xdg v0.5.3 - github.com/apernet/hysteria/core/v2 v2.4.5 - github.com/apernet/quic-go v0.45.2-0.20240702221538-ed74cfbe8b6e github.com/go-chi/chi/v5 v5.1.0 github.com/go-chi/render v1.0.3 github.com/go-playground/validator/v10 v10.22.1 @@ -67,8 +65,10 @@ require ( github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/klauspost/reedsolomon v1.11.7 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mustafaturan/monoton v1.0.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/onsi/ginkgo/v2 v2.17.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pion/logging v0.2.2 // indirect @@ -76,10 +76,8 @@ require ( github.com/pion/sctp v1.8.7 // indirect github.com/pion/transport/v3 v3.0.7 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/quic-go/qpack v0.5.1 // indirect github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect github.com/secure-io/siv-go v0.0.0-20180922214919-5ff40651e2c4 // indirect - github.com/stretchr/objx v0.5.2 // indirect github.com/xtaci/smux v1.5.24 // indirect go.uber.org/mock v0.4.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect @@ -88,8 +86,7 @@ require ( golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.22.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect ) replace github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 => github.com/xiaokangwang/struc v0.0.0-20231031203518-0e381172f248 - -replace github.com/apernet/hysteria/core/v2 v2.4.5 => github.com/JimmyHuang454/hysteria/core/v2 v2.0.0-20240724161647-b3347cf6334d diff --git a/go.sum b/go.sum index 5d3d9f05b..928232422 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,6 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/FlowerWrong/water v0.0.0-20180301012659-01a4eaa1f6f2/go.mod h1:xrG5L7lq7T2DLnPr2frMnL906CNEoKRwLB+VYFhPq2w= -github.com/JimmyHuang454/hysteria/core/v2 v2.0.0-20240724161647-b3347cf6334d h1:DN3vqWeuVa1anRkwCueIqPEUPnSyFCk4PR2LcyJKrZk= -github.com/JimmyHuang454/hysteria/core/v2 v2.0.0-20240724161647-b3347cf6334d/go.mod h1:3OIt9vhWrxoHUMPm6WcpAg7jUEqfy6Q4IyFZA67Azcg= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= @@ -27,8 +25,6 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/apernet/quic-go v0.45.2-0.20240702221538-ed74cfbe8b6e h1:KBs8aBfKl5AKPKGpfn3bl0joDJXDq5fnH+AjFODiU+A= -github.com/apernet/quic-go v0.45.2-0.20240702221538-ed74cfbe8b6e/go.mod h1:MjGWpXA31DZZWESdX3/PjIpSWIT1fOm8FNCqyXXFZFU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -54,6 +50,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -192,11 +189,10 @@ github.com/klauspost/reedsolomon v1.11.7/go.mod h1:4bXRN+cVzMdml6ti7qLouuYi32KHJ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lunixbochs/struc v0.0.0-20190916212049-a5c72983bc42/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg= @@ -225,6 +221,8 @@ github.com/mustafaturan/monoton v1.0.0/go.mod h1:FOnE7NV3s3EWPXb8/7+/OSdiMBbdlkV github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo/v2 v2.17.0 h1:kdnunFXpBjbzN56hcJHrXZ8M+LOkenKA7NnBzTNigTI= github.com/onsi/ginkgo/v2 v2.17.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= @@ -273,8 +271,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= -github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= @@ -283,8 +279,6 @@ github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -313,8 +307,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -358,8 +350,6 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.starlark.net v0.0.0-20230612165344-9532f5667272 h1:2/wtqS591wZyD2OsClsVBKRPEvBsQt/Js+fsCiYhwu8= go.starlark.net v0.0.0-20230612165344-9532f5667272/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -580,8 +570,8 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= diff --git a/infra/conf/v4/hysteria2.go b/infra/conf/v4/hysteria2.go deleted file mode 100644 index 690513be7..000000000 --- a/infra/conf/v4/hysteria2.go +++ /dev/null @@ -1,78 +0,0 @@ -package v4 - -import ( - "github.com/golang/protobuf/proto" - - "github.com/v2fly/v2ray-core/v5/common/net/packetaddr" - "github.com/v2fly/v2ray-core/v5/common/protocol" - "github.com/v2fly/v2ray-core/v5/common/serial" - "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon" - "github.com/v2fly/v2ray-core/v5/proxy/hysteria2" -) - -// Hysteria2ServerTarget is configuration of a single hysteria2 server -type Hysteria2ServerTarget struct { - Address *cfgcommon.Address `json:"address"` - Port uint16 `json:"port"` - Email string `json:"email"` - Level byte `json:"level"` -} - -// Hysteria2ClientConfig is configuration of hysteria2 servers -type Hysteria2ClientConfig struct { - Servers []*Hysteria2ServerTarget `json:"servers"` -} - -// Build implements Buildable -func (c *Hysteria2ClientConfig) Build() (proto.Message, error) { - config := new(hysteria2.ClientConfig) - - if len(c.Servers) == 0 { - return nil, newError("0 Hysteria2 server configured.") - } - - serverSpecs := make([]*protocol.ServerEndpoint, len(c.Servers)) - for idx, rec := range c.Servers { - if rec.Address == nil { - return nil, newError("Hysteria2 server address is not set.") - } - if rec.Port == 0 { - return nil, newError("Invalid Hysteria2 port.") - } - account := &hysteria2.Account{} - hysteria2 := &protocol.ServerEndpoint{ - Address: rec.Address.Build(), - Port: uint32(rec.Port), - User: []*protocol.User{ - { - Level: uint32(rec.Level), - Email: rec.Email, - Account: serial.ToTypedMessage(account), - }, - }, - } - - serverSpecs[idx] = hysteria2 - } - - config.Server = serverSpecs - - return config, nil -} - -// Hysteria2ServerConfig is Inbound configuration -type Hysteria2ServerConfig struct { - PacketEncoding string `json:"packetEncoding"` -} - -// Build implements Buildable -func (c *Hysteria2ServerConfig) Build() (proto.Message, error) { - config := new(hysteria2.ServerConfig) - switch c.PacketEncoding { - case "Packet": - config.PacketEncoding = packetaddr.PacketAddrType_Packet - case "", "None": - config.PacketEncoding = packetaddr.PacketAddrType_None - } - return config, nil -} diff --git a/infra/conf/v4/transport_internet.go b/infra/conf/v4/transport_internet.go index 61412d958..5612bf986 100644 --- a/infra/conf/v4/transport_internet.go +++ b/infra/conf/v4/transport_internet.go @@ -16,7 +16,6 @@ import ( "github.com/v2fly/v2ray-core/v5/transport/internet/domainsocket" httpheader "github.com/v2fly/v2ray-core/v5/transport/internet/headers/http" "github.com/v2fly/v2ray-core/v5/transport/internet/http" - "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" "github.com/v2fly/v2ray-core/v5/transport/internet/kcp" "github.com/v2fly/v2ray-core/v5/transport/internet/quic" "github.com/v2fly/v2ray-core/v5/transport/internet/tcp" @@ -144,26 +143,6 @@ type Hy2ConfigCongestion struct { DownMbps uint64 `json:"down_mbps"` } -type Hy2Config struct { - Password string `json:"password"` - Congestion Hy2ConfigCongestion `json:"congestion"` - UseUdpExtension bool `json:"use_udp_extension"` - IgnoreClientBandwidth bool `json:"ignore_client_bandwidth"` -} - -// Build implements Buildable. -func (c *Hy2Config) Build() (proto.Message, error) { - return &hysteria2.Config{Password: c.Password, - Congestion: &hysteria2.Congestion{ - Type: c.Congestion.Type, - DownMbps: c.Congestion.DownMbps, - UpMbps: c.Congestion.UpMbps, - }, - UseUdpExtension: c.UseUdpExtension, - IgnoreClientBandwidth: c.IgnoreClientBandwidth, - }, nil -} - type WebSocketConfig struct { Path string `json:"path"` Headers map[string]string `json:"headers"` @@ -306,8 +285,6 @@ func (p TransportProtocol) Build() (string, error) { return "quic", nil case "gun", "grpc": return "gun", nil - case "hy2", "hysteria2": - return "hysteria2", nil default: return "", newError("Config: unknown transport protocol: ", p) } @@ -325,7 +302,6 @@ type StreamConfig struct { QUICSettings *QUICConfig `json:"quicSettings"` GunSettings *GunConfig `json:"gunSettings"` GRPCSettings *GunConfig `json:"grpcSettings"` - Hy2Settings *Hy2Config `json:"hy2Settings"` SocketSettings *socketcfg.SocketConfig `json:"sockopt"` } @@ -427,16 +403,6 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) { Settings: serial.ToTypedMessage(gs), }) } - if c.Hy2Settings != nil { - hy2, err := c.Hy2Settings.Build() - if err != nil { - return nil, newError("Failed to build hy2 config.").Base(err) - } - config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ - ProtocolName: "hysteria2", - Settings: serial.ToTypedMessage(hy2), - }) - } if c.SocketSettings != nil { ss, err := c.SocketSettings.Build() if err != nil { diff --git a/infra/conf/v4/v2ray.go b/infra/conf/v4/v2ray.go index 4f1190175..9ca662d13 100644 --- a/infra/conf/v4/v2ray.go +++ b/infra/conf/v4/v2ray.go @@ -35,7 +35,6 @@ var ( "vless": func() interface{} { return new(VLessInboundConfig) }, "vmess": func() interface{} { return new(VMessInboundConfig) }, "trojan": func() interface{} { return new(TrojanServerConfig) }, - "hysteria2": func() interface{} { return new(Hysteria2ServerConfig) }, }, "protocol", "settings") outboundConfigLoader = loader.NewJSONConfigLoader(loader.ConfigCreatorCache{ @@ -47,7 +46,6 @@ var ( "vless": func() interface{} { return new(VLessOutboundConfig) }, "vmess": func() interface{} { return new(VMessOutboundConfig) }, "trojan": func() interface{} { return new(TrojanClientConfig) }, - "hysteria2": func() interface{} { return new(Hysteria2ClientConfig) }, "dns": func() interface{} { return new(DNSOutboundConfig) }, "loopback": func() interface{} { return new(LoopbackConfig) }, }, "protocol", "settings") diff --git a/main/distro/all/all.go b/main/distro/all/all.go index ba86a4920..f81eb8437 100644 --- a/main/distro/all/all.go +++ b/main/distro/all/all.go @@ -53,7 +53,6 @@ import ( _ "github.com/v2fly/v2ray-core/v5/proxy/vlite/inbound" _ "github.com/v2fly/v2ray-core/v5/proxy/vlite/outbound" - _ "github.com/v2fly/v2ray-core/v5/proxy/hysteria2" _ "github.com/v2fly/v2ray-core/v5/proxy/shadowsocks2022" // Transports @@ -83,8 +82,6 @@ import ( _ "github.com/v2fly/v2ray-core/v5/transport/internet/httpupgrade" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" - // Transport headers _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/http" _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/noop" diff --git a/proxy/hysteria2/client.go b/proxy/hysteria2/client.go deleted file mode 100644 index b4bfa3a1b..000000000 --- a/proxy/hysteria2/client.go +++ /dev/null @@ -1,216 +0,0 @@ -package hysteria2 - -import ( - "context" - - hyProtocol "github.com/apernet/hysteria/core/v2/international/protocol" - - core "github.com/v2fly/v2ray-core/v5" - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/common/buf" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/common/net/packetaddr" - "github.com/v2fly/v2ray-core/v5/common/protocol" - "github.com/v2fly/v2ray-core/v5/common/retry" - "github.com/v2fly/v2ray-core/v5/common/session" - "github.com/v2fly/v2ray-core/v5/common/signal" - "github.com/v2fly/v2ray-core/v5/common/task" - "github.com/v2fly/v2ray-core/v5/features/policy" - "github.com/v2fly/v2ray-core/v5/proxy" - "github.com/v2fly/v2ray-core/v5/transport" - "github.com/v2fly/v2ray-core/v5/transport/internet" - hyTransport "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" - "github.com/v2fly/v2ray-core/v5/transport/internet/udp" -) - -// Client is an inbound handler -type Client struct { - serverPicker protocol.ServerPicker - policyManager policy.Manager -} - -// NewClient create a new client. -func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { - serverList := protocol.NewServerList() - for _, rec := range config.Server { - s, err := protocol.NewServerSpecFromPB(rec) - if err != nil { - return nil, newError("failed to parse server spec").Base(err) - } - serverList.AddServer(s) - } - if serverList.Size() == 0 { - return nil, newError("0 server") - } - - v := core.MustFromContext(ctx) - client := &Client{ - serverPicker: protocol.NewRoundRobinServerPicker(serverList), - policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), - } - return client, nil -} - -// Process implements OutboundHandler.Process(). -func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { - outbound := session.OutboundFromContext(ctx) - if outbound == nil || !outbound.Target.IsValid() { - return newError("target not specified") - } - destination := outbound.Target - network := destination.Network - - var server *protocol.ServerSpec - var conn internet.Connection - - err := retry.ExponentialBackoff(5, 100).On(func() error { - server = c.serverPicker.PickServer() - rawConn, err := dialer.Dial(ctx, server.Destination()) - if err != nil { - return err - } - - conn = rawConn - return nil - }) - if err != nil { - return newError("failed to find an available destination").AtWarning().Base(err) - } - newError("tunneling request to ", destination, " via ", server.Destination().NetAddr()).WriteToLog(session.ExportIDToError(ctx)) - - defer conn.Close() - - iConn := conn - if statConn, ok := conn.(*internet.StatCouterConnection); ok { - iConn = statConn.Connection // will not count the UDP traffic. - } - hyConn, IsHy2Transport := iConn.(*hyTransport.HyConn) - - if !IsHy2Transport && network == net.Network_UDP { - // hysteria2 need to use udp extension to proxy UDP. - return newError(hyTransport.CanNotUseUdpExtension) - } - - user := server.PickUser() - userLevel := uint32(0) - if user != nil { - userLevel = user.Level - } - sessionPolicy := c.policyManager.ForLevel(userLevel) - ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) - - if packetConn, err := packetaddr.ToPacketAddrConn(link, destination); err == nil { - postRequest := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) - - var buffer [2048]byte - n, addr, err := packetConn.ReadFrom(buffer[:]) - if err != nil { - return newError("failed to read a packet").Base(err) - } - dest := net.DestinationFromAddr(addr) - - bufferWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) - connWriter := &ConnWriter{Writer: bufferWriter, Target: dest} - packetWriter := &PacketWriter{Writer: connWriter, Target: dest, HyConn: hyConn} - - // write some request payload to buffer - if _, err := packetWriter.WriteTo(buffer[:n], addr); err != nil { - return newError("failed to write a request payload").Base(err) - } - - // Flush; bufferWriter.WriteMultiBuffer now is bufferWriter.writer.WriteMultiBuffer - if err = bufferWriter.SetBuffered(false); err != nil { - return newError("failed to flush payload").Base(err).AtWarning() - } - - return udp.CopyPacketConn(packetWriter, packetConn, udp.UpdateActivity(timer)) - } - - getResponse := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) - - packetReader := &PacketReader{Reader: conn, HyConn: hyConn} - packetConnectionReader := &PacketConnectionReader{reader: packetReader} - - return udp.CopyPacketConn(packetConn, packetConnectionReader, udp.UpdateActivity(timer)) - } - - responseDoneAndCloseWriter := task.OnSuccess(getResponse, task.Close(link.Writer)) - if err := task.Run(ctx, postRequest, responseDoneAndCloseWriter); err != nil { - return newError("connection ends").Base(err) - } - - return nil - } - - postRequest := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) - - var bodyWriter buf.Writer - bufferWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) - connWriter := &ConnWriter{Writer: bufferWriter, Target: destination} - bodyWriter = connWriter - - if network == net.Network_UDP { - bodyWriter = &PacketWriter{Writer: connWriter, Target: destination, HyConn: hyConn} - } else { - // write some request payload to buffer - err = buf.CopyOnceTimeout(link.Reader, bodyWriter, proxy.FirstPayloadTimeout) - switch err { - case buf.ErrNotTimeoutReader, buf.ErrReadTimeout: - if err := connWriter.WriteTCPHeader(); err != nil { - return newError("failed to write request header").Base(err).AtWarning() - } - case nil: - default: - return newError("failed to write a request payload").Base(err).AtWarning() - } - // Flush; bufferWriter.WriteMultiBuffer now is bufferWriter.writer.WriteMultiBuffer - if err = bufferWriter.SetBuffered(false); err != nil { - return newError("failed to flush payload").Base(err).AtWarning() - } - } - - if err = buf.Copy(link.Reader, bodyWriter, buf.UpdateActivity(timer)); err != nil { - return newError("failed to transfer request payload").Base(err).AtInfo() - } - - return nil - } - - getResponse := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) - - var reader buf.Reader - if network == net.Network_UDP { - reader = &PacketReader{ - Reader: conn, HyConn: hyConn, - } - } else { - ok, msg, err := hyProtocol.ReadTCPResponse(conn) - if err != nil { - return err - } - if !ok { - return newError(msg) - } - reader = buf.NewReader(conn) - } - return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) - } - - responseDoneAndCloseWriter := task.OnSuccess(getResponse, task.Close(link.Writer)) - if err := task.Run(ctx, postRequest, responseDoneAndCloseWriter); err != nil { - return newError("connection ends").Base(err) - } - - return nil -} - -func init() { - common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { - return NewClient(ctx, config.(*ClientConfig)) - })) -} diff --git a/proxy/hysteria2/config.go b/proxy/hysteria2/config.go deleted file mode 100644 index 853d84d65..000000000 --- a/proxy/hysteria2/config.go +++ /dev/null @@ -1,18 +0,0 @@ -package hysteria2 - -import ( - "github.com/v2fly/v2ray-core/v5/common/protocol" -) - -// MemoryAccount is an account type converted from Account. -type MemoryAccount struct{} - -// AsAccount implements protocol.AsAccount. -func (a *Account) AsAccount() (protocol.Account, error) { - return &MemoryAccount{}, nil -} - -// Equals implements protocol.Account.Equals(). -func (a *MemoryAccount) Equals(another protocol.Account) bool { - return false -} diff --git a/proxy/hysteria2/config.pb.go b/proxy/hysteria2/config.pb.go deleted file mode 100644 index 1d9d291fa..000000000 --- a/proxy/hysteria2/config.pb.go +++ /dev/null @@ -1,282 +0,0 @@ -package hysteria2 - -import ( - packetaddr "github.com/v2fly/v2ray-core/v5/common/net/packetaddr" - protocol "github.com/v2fly/v2ray-core/v5/common/protocol" - _ "github.com/v2fly/v2ray-core/v5/common/protoext" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Account struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Account) Reset() { - *x = Account{} - if protoimpl.UnsafeEnabled { - mi := &file_proxy_hysteria2_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Account) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Account) ProtoMessage() {} - -func (x *Account) ProtoReflect() protoreflect.Message { - mi := &file_proxy_hysteria2_config_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Account.ProtoReflect.Descriptor instead. -func (*Account) Descriptor() ([]byte, []int) { - return file_proxy_hysteria2_config_proto_rawDescGZIP(), []int{0} -} - -type ClientConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"` -} - -func (x *ClientConfig) Reset() { - *x = ClientConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_proxy_hysteria2_config_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientConfig) ProtoMessage() {} - -func (x *ClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_proxy_hysteria2_config_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. -func (*ClientConfig) Descriptor() ([]byte, []int) { - return file_proxy_hysteria2_config_proto_rawDescGZIP(), []int{1} -} - -func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint { - if x != nil { - return x.Server - } - return nil -} - -type ServerConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PacketEncoding packetaddr.PacketAddrType `protobuf:"varint,1,opt,name=packet_encoding,json=packetEncoding,proto3,enum=v2ray.core.net.packetaddr.PacketAddrType" json:"packet_encoding,omitempty"` -} - -func (x *ServerConfig) Reset() { - *x = ServerConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_proxy_hysteria2_config_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServerConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServerConfig) ProtoMessage() {} - -func (x *ServerConfig) ProtoReflect() protoreflect.Message { - mi := &file_proxy_hysteria2_config_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. -func (*ServerConfig) Descriptor() ([]byte, []int) { - return file_proxy_hysteria2_config_proto_rawDescGZIP(), []int{2} -} - -func (x *ServerConfig) GetPacketEncoding() packetaddr.PacketAddrType { - if x != nil { - return x.PacketEncoding - } - return packetaddr.PacketAddrType(0) -} - -var File_proxy_hysteria2_config_proto protoreflect.FileDescriptor - -var file_proxy_hysteria2_config_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, - 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2e, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x1a, 0x22, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x61, 0x64, 0x64, - 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x65, - 0x78, 0x74, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x09, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6d, - 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, - 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x19, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x12, 0x09, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x22, 0x7c, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x52, 0x0a, - 0x0f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x61, 0x64, - 0x64, 0x72, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0e, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x3a, 0x18, 0x82, 0xb5, 0x18, 0x14, 0x0a, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x09, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x42, 0x6f, 0x0a, 0x1e, 0x63, - 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x50, 0x01, 0x5a, - 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x66, 0x6c, - 0x79, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x35, 0x2f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0xaa, - 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x2e, 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_proxy_hysteria2_config_proto_rawDescOnce sync.Once - file_proxy_hysteria2_config_proto_rawDescData = file_proxy_hysteria2_config_proto_rawDesc -) - -func file_proxy_hysteria2_config_proto_rawDescGZIP() []byte { - file_proxy_hysteria2_config_proto_rawDescOnce.Do(func() { - file_proxy_hysteria2_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_hysteria2_config_proto_rawDescData) - }) - return file_proxy_hysteria2_config_proto_rawDescData -} - -var file_proxy_hysteria2_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_proxy_hysteria2_config_proto_goTypes = []any{ - (*Account)(nil), // 0: v2ray.core.proxy.hysteria2.Account - (*ClientConfig)(nil), // 1: v2ray.core.proxy.hysteria2.ClientConfig - (*ServerConfig)(nil), // 2: v2ray.core.proxy.hysteria2.ServerConfig - (*protocol.ServerEndpoint)(nil), // 3: v2ray.core.common.protocol.ServerEndpoint - (packetaddr.PacketAddrType)(0), // 4: v2ray.core.net.packetaddr.PacketAddrType -} -var file_proxy_hysteria2_config_proto_depIdxs = []int32{ - 3, // 0: v2ray.core.proxy.hysteria2.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint - 4, // 1: v2ray.core.proxy.hysteria2.ServerConfig.packet_encoding:type_name -> v2ray.core.net.packetaddr.PacketAddrType - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_proxy_hysteria2_config_proto_init() } -func file_proxy_hysteria2_config_proto_init() { - if File_proxy_hysteria2_config_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_proxy_hysteria2_config_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Account); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proxy_hysteria2_config_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*ClientConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proxy_hysteria2_config_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ServerConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proxy_hysteria2_config_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_proxy_hysteria2_config_proto_goTypes, - DependencyIndexes: file_proxy_hysteria2_config_proto_depIdxs, - MessageInfos: file_proxy_hysteria2_config_proto_msgTypes, - }.Build() - File_proxy_hysteria2_config_proto = out.File - file_proxy_hysteria2_config_proto_rawDesc = nil - file_proxy_hysteria2_config_proto_goTypes = nil - file_proxy_hysteria2_config_proto_depIdxs = nil -} diff --git a/proxy/hysteria2/config.proto b/proxy/hysteria2/config.proto deleted file mode 100644 index ccda75b5e..000000000 --- a/proxy/hysteria2/config.proto +++ /dev/null @@ -1,28 +0,0 @@ -syntax = "proto3"; - -package v2ray.core.proxy.hysteria2; -option csharp_namespace = "V2Ray.Core.Proxy.Hysteria2"; -option go_package = "github.com/v2fly/v2ray-core/v5/proxy/hysteria2"; -option java_package = "com.v2ray.core.proxy.hysteria2"; -option java_multiple_files = true; - -import "common/net/packetaddr/config.proto"; -import "common/protocol/server_spec.proto"; -import "common/protoext/extensions.proto"; - -message Account { -} - -message ClientConfig { - option (v2ray.core.common.protoext.message_opt).type = "outbound"; - option (v2ray.core.common.protoext.message_opt).short_name = "hysteria2"; - - repeated v2ray.core.common.protocol.ServerEndpoint server = 1; -} - -message ServerConfig { - option (v2ray.core.common.protoext.message_opt).type = "inbound"; - option (v2ray.core.common.protoext.message_opt).short_name = "hysteria2"; - - v2ray.core.net.packetaddr.PacketAddrType packet_encoding = 1; -} diff --git a/proxy/hysteria2/errors.generated.go b/proxy/hysteria2/errors.generated.go deleted file mode 100644 index 105317031..000000000 --- a/proxy/hysteria2/errors.generated.go +++ /dev/null @@ -1,9 +0,0 @@ -package hysteria2 - -import "github.com/v2fly/v2ray-core/v5/common/errors" - -type errPathObjHolder struct{} - -func newError(values ...interface{}) *errors.Error { - return errors.New(values...).WithPathObj(errPathObjHolder{}) -} diff --git a/proxy/hysteria2/hysteria2.go b/proxy/hysteria2/hysteria2.go deleted file mode 100644 index 013f7d5cc..000000000 --- a/proxy/hysteria2/hysteria2.go +++ /dev/null @@ -1 +0,0 @@ -package hysteria2 diff --git a/proxy/hysteria2/protocol.go b/proxy/hysteria2/protocol.go deleted file mode 100644 index d78737a99..000000000 --- a/proxy/hysteria2/protocol.go +++ /dev/null @@ -1,210 +0,0 @@ -package hysteria2 - -import ( - "io" - "math/rand" - - hyProtocol "github.com/apernet/hysteria/core/v2/international/protocol" - "github.com/apernet/quic-go/quicvarint" - - "github.com/v2fly/v2ray-core/v5/common/buf" - "github.com/v2fly/v2ray-core/v5/common/net" - hyTransport "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" -) - -const ( - paddingChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -) - -// ConnWriter is TCP Connection Writer Wrapper -type ConnWriter struct { - io.Writer - Target net.Destination - TCPHeaderSent bool -} - -// Write implements io.Writer -func (c *ConnWriter) Write(p []byte) (n int, err error) { - if !c.TCPHeaderSent { - if err := c.writeTCPHeader(); err != nil { - return 0, newError("failed to write request header").Base(err) - } - } - - return c.Writer.Write(p) -} - -// WriteMultiBuffer implements buf.Writer -func (c *ConnWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { - defer buf.ReleaseMulti(mb) - - for _, b := range mb { - if !b.IsEmpty() { - if _, err := c.Write(b.Bytes()); err != nil { - return err - } - } - } - - return nil -} - -func (c *ConnWriter) WriteTCPHeader() error { - if !c.TCPHeaderSent { - if err := c.writeTCPHeader(); err != nil { - return err - } - } - return nil -} - -func QuicLen(s int) int { - return int(quicvarint.Len(uint64(s))) -} - -func (c *ConnWriter) writeTCPHeader() error { - c.TCPHeaderSent = true - - paddingLen := 64 + rand.Intn(512-64) - padding := make([]byte, paddingLen) - for i := range padding { - padding[i] = paddingChars[rand.Intn(len(paddingChars))] - } - addressAndPort := c.Target.NetAddr() - addressLen := len(addressAndPort) - if addressLen > hyProtocol.MaxAddressLength { - return newError("address length too large: ", addressLen) - } - size := QuicLen(addressLen) + addressLen + QuicLen(paddingLen) + paddingLen - - buf := make([]byte, size) - i := hyProtocol.VarintPut(buf, uint64(addressLen)) - i += copy(buf[i:], addressAndPort) - i += hyProtocol.VarintPut(buf[i:], uint64(paddingLen)) - copy(buf[i:], padding) - - _, err := c.Writer.Write(buf) - return err -} - -// PacketWriter UDP Connection Writer Wrapper -type PacketWriter struct { - io.Writer - HyConn *hyTransport.HyConn - Target net.Destination -} - -// WriteMultiBuffer implements buf.Writer -func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { - for _, b := range mb { - if b.IsEmpty() { - continue - } - if _, err := w.writePacket(b.Bytes(), w.Target); err != nil { - buf.ReleaseMulti(mb) - return err - } - } - - return nil -} - -// WriteMultiBufferWithMetadata writes udp packet with destination specified -func (w *PacketWriter) WriteMultiBufferWithMetadata(mb buf.MultiBuffer, dest net.Destination) error { - for _, b := range mb { - if b.IsEmpty() { - continue - } - if _, err := w.writePacket(b.Bytes(), dest); err != nil { - buf.ReleaseMulti(mb) - return err - } - } - - return nil -} - -func (w *PacketWriter) WriteTo(payload []byte, addr net.Addr) (int, error) { - dest := net.DestinationFromAddr(addr) - - return w.writePacket(payload, dest) -} - -func (w *PacketWriter) writePacket(payload []byte, dest net.Destination) (int, error) { - return w.HyConn.WritePacket(payload, dest) -} - -// ConnReader is TCP Connection Reader Wrapper -type ConnReader struct { - io.Reader - Target net.Destination -} - -// Read implements io.Reader -func (c *ConnReader) Read(p []byte) (int, error) { - return c.Reader.Read(p) -} - -// ReadMultiBuffer implements buf.Reader -func (c *ConnReader) ReadMultiBuffer() (buf.MultiBuffer, error) { - b := buf.New() - _, err := b.ReadFrom(c) - if err != nil { - return nil, err - } - return buf.MultiBuffer{b}, nil -} - -// PacketPayload combines udp payload and destination -type PacketPayload struct { - Target net.Destination - Buffer buf.MultiBuffer -} - -// PacketReader is UDP Connection Reader Wrapper -type PacketReader struct { - io.Reader - HyConn *hyTransport.HyConn -} - -// ReadMultiBuffer implements buf.Reader -func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { - p, err := r.ReadMultiBufferWithMetadata() - if p != nil { - return p.Buffer, err - } - return nil, err -} - -// ReadMultiBufferWithMetadata reads udp packet with destination -func (r *PacketReader) ReadMultiBufferWithMetadata() (*PacketPayload, error) { - _, data, dest, err := r.HyConn.ReadPacket() - if err != nil { - return nil, err - } - b := buf.FromBytes(data) - return &PacketPayload{Target: *dest, Buffer: buf.MultiBuffer{b}}, nil -} - -type PacketConnectionReader struct { - reader *PacketReader - payload *PacketPayload -} - -func (r *PacketConnectionReader) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - if r.payload == nil || r.payload.Buffer.IsEmpty() { - r.payload, err = r.reader.ReadMultiBufferWithMetadata() - if err != nil { - return - } - } - - addr = &net.UDPAddr{ - IP: r.payload.Target.Address.IP(), - Port: int(r.payload.Target.Port), - } - - r.payload.Buffer, n = buf.SplitFirstBytes(r.payload.Buffer, p) - - return -} diff --git a/proxy/hysteria2/server.go b/proxy/hysteria2/server.go deleted file mode 100644 index cbefadc37..000000000 --- a/proxy/hysteria2/server.go +++ /dev/null @@ -1,216 +0,0 @@ -package hysteria2 - -import ( - "context" - "io" - "time" - - hyProtocol "github.com/apernet/hysteria/core/v2/international/protocol" - - core "github.com/v2fly/v2ray-core/v5" - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/common/buf" - "github.com/v2fly/v2ray-core/v5/common/errors" - "github.com/v2fly/v2ray-core/v5/common/log" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/common/net/packetaddr" - udp_proto "github.com/v2fly/v2ray-core/v5/common/protocol/udp" - "github.com/v2fly/v2ray-core/v5/common/session" - "github.com/v2fly/v2ray-core/v5/common/signal" - "github.com/v2fly/v2ray-core/v5/common/task" - "github.com/v2fly/v2ray-core/v5/features/policy" - "github.com/v2fly/v2ray-core/v5/features/routing" - "github.com/v2fly/v2ray-core/v5/transport/internet" - hyTransport "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" - "github.com/v2fly/v2ray-core/v5/transport/internet/udp" -) - -func init() { - common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { - return NewServer(ctx, config.(*ServerConfig)) - })) -} - -// Server is an inbound connection handler that handles messages in protocol. -type Server struct { - policyManager policy.Manager - packetEncoding packetaddr.PacketAddrType -} - -// NewServer creates a new inbound handler. -func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { - v := core.MustFromContext(ctx) - server := &Server{ - policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), - packetEncoding: config.PacketEncoding, - } - return server, nil -} - -// Network implements proxy.Inbound.Network(). -func (s *Server) Network() []net.Network { - return []net.Network{net.Network_TCP, net.Network_UNIX} -} - -// Process implements proxy.Inbound.Process(). -func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { - sid := session.ExportIDToError(ctx) - - iConn := conn - if statConn, ok := conn.(*internet.StatCouterConnection); ok { - iConn = statConn.Connection // will not count the UDP traffic. - } - hyConn, IsHy2Transport := iConn.(*hyTransport.HyConn) - - if IsHy2Transport && hyConn.IsUDPExtension { - network = net.Network_UDP - } - - if !IsHy2Transport && network == net.Network_UDP { - return newError(hyTransport.CanNotUseUdpExtension) - } - - sessionPolicy := s.policyManager.ForLevel(0) - if err := conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil { - return newError("unable to set read deadline").Base(err).AtWarning() - } - - bufferedReader := &buf.BufferedReader{ - Reader: buf.NewReader(conn), - } - clientReader := &ConnReader{Reader: bufferedReader} - - if err := conn.SetReadDeadline(time.Time{}); err != nil { - return newError("unable to set read deadline").Base(err).AtWarning() - } - - if network == net.Network_UDP { // handle udp request - return s.handleUDPPayload(ctx, - &PacketReader{Reader: clientReader, HyConn: hyConn}, - &PacketWriter{Writer: conn, HyConn: hyConn}, dispatcher) - } - - var reqAddr string - var err error - reqAddr, err = hyProtocol.ReadTCPRequest(conn) - if err != nil { - return newError("failed to parse header").Base(err) - } - err = hyProtocol.WriteTCPResponse(conn, true, "") - if err != nil { - return newError("failed to send response").Base(err) - } - - address, stringPort, err := net.SplitHostPort(reqAddr) - if err != nil { - return err - } - port, err := net.PortFromString(stringPort) - if err != nil { - return err - } - destination := net.Destination{Network: network, Address: net.ParseAddress(address), Port: port} - - inbound := session.InboundFromContext(ctx) - if inbound == nil { - panic("no inbound metadata") - } - sessionPolicy = s.policyManager.ForLevel(0) - - ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ - From: conn.RemoteAddr(), - To: destination, - Status: log.AccessAccepted, - Reason: "", - }) - - newError("received request for ", destination).WriteToLog(sid) - return s.handleConnection(ctx, sessionPolicy, destination, clientReader, buf.NewWriter(conn), dispatcher) -} - -func (s *Server) handleConnection(ctx context.Context, sessionPolicy policy.Session, - destination net.Destination, - clientReader buf.Reader, - clientWriter buf.Writer, dispatcher routing.Dispatcher, -) error { - ctx, cancel := context.WithCancel(ctx) - timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) - ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) - - link, err := dispatcher.Dispatch(ctx, destination) - if err != nil { - return newError("failed to dispatch request to ", destination).Base(err) - } - - requestDone := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) - - if err := buf.Copy(clientReader, link.Writer, buf.UpdateActivity(timer)); err != nil { - return newError("failed to transfer request").Base(err) - } - return nil - } - - responseDone := func() error { - defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) - - if err := buf.Copy(link.Reader, clientWriter, buf.UpdateActivity(timer)); err != nil { - return newError("failed to write response").Base(err) - } - return nil - } - - requestDonePost := task.OnSuccess(requestDone, task.Close(link.Writer)) - if err := task.Run(ctx, requestDonePost, responseDone); err != nil { - common.Must(common.Interrupt(link.Reader)) - common.Must(common.Interrupt(link.Writer)) - return newError("connection ends").Base(err) - } - - return nil -} - -func (s *Server) handleUDPPayload(ctx context.Context, clientReader *PacketReader, clientWriter *PacketWriter, dispatcher routing.Dispatcher) error { - udpDispatcherConstructor := udp.NewSplitDispatcher - switch s.packetEncoding { - case packetaddr.PacketAddrType_None: - case packetaddr.PacketAddrType_Packet: - packetAddrDispatcherFactory := udp.NewPacketAddrDispatcherCreator(ctx) - udpDispatcherConstructor = packetAddrDispatcherFactory.NewPacketAddrDispatcher - } - - udpServer := udpDispatcherConstructor(dispatcher, func(ctx context.Context, packet *udp_proto.Packet) { - if err := clientWriter.WriteMultiBufferWithMetadata(buf.MultiBuffer{packet.Payload}, packet.Source); err != nil { - newError("failed to write response").Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) - } - }) - - inbound := session.InboundFromContext(ctx) - - for { - select { - case <-ctx.Done(): - return nil - default: - p, err := clientReader.ReadMultiBufferWithMetadata() - if err != nil { - if errors.Cause(err) != io.EOF { - return newError("unexpected EOF").Base(err) - } - return nil - } - currentPacketCtx := ctx - currentPacketCtx = log.ContextWithAccessMessage(currentPacketCtx, &log.AccessMessage{ - From: inbound.Source, - To: p.Target, - Status: log.AccessAccepted, - Reason: "", - }) - newError("tunnelling request to ", p.Target).WriteToLog(session.ExportIDToError(ctx)) - - for _, b := range p.Buffer { - udpServer.Dispatch(currentPacketCtx, p.Target, b) - } - } - } -} diff --git a/testing/scenarios/hy2_test.go b/testing/scenarios/hy2_test.go deleted file mode 100644 index b3aa910f6..000000000 --- a/testing/scenarios/hy2_test.go +++ /dev/null @@ -1,468 +0,0 @@ -package scenarios - -import ( - "testing" - "time" - - "golang.org/x/sync/errgroup" - "google.golang.org/protobuf/types/known/anypb" - - core "github.com/v2fly/v2ray-core/v5" - "github.com/v2fly/v2ray-core/v5/app/log" - "github.com/v2fly/v2ray-core/v5/app/proxyman" - "github.com/v2fly/v2ray-core/v5/common" - clog "github.com/v2fly/v2ray-core/v5/common/log" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/common/protocol" - "github.com/v2fly/v2ray-core/v5/common/protocol/tls/cert" - "github.com/v2fly/v2ray-core/v5/common/serial" - "github.com/v2fly/v2ray-core/v5/common/uuid" - "github.com/v2fly/v2ray-core/v5/proxy/dokodemo" - "github.com/v2fly/v2ray-core/v5/proxy/freedom" - "github.com/v2fly/v2ray-core/v5/proxy/hysteria2" - "github.com/v2fly/v2ray-core/v5/proxy/vmess" - "github.com/v2fly/v2ray-core/v5/proxy/vmess/inbound" - "github.com/v2fly/v2ray-core/v5/proxy/vmess/outbound" - "github.com/v2fly/v2ray-core/v5/testing/servers/tcp" - "github.com/v2fly/v2ray-core/v5/testing/servers/udp" - "github.com/v2fly/v2ray-core/v5/transport/internet" - "github.com/v2fly/v2ray-core/v5/transport/internet/headers/http" - hyTransport "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" - tcpTransport "github.com/v2fly/v2ray-core/v5/transport/internet/tcp" - "github.com/v2fly/v2ray-core/v5/transport/internet/tls" -) - -func TestVMessHysteria2Congestion(t *testing.T) { - for _, v := range []string{"bbr", "brutal"} { - testVMessHysteria2(t, v) - } -} - -func testVMessHysteria2(t *testing.T, congestionType string) { - tcpServer := tcp.Server{ - MsgProcessor: xor, - } - dest, err := tcpServer.Start() - common.Must(err) - defer tcpServer.Close() - - userID := protocol.NewID(uuid.New()) - serverPort := udp.PickPort() - serverConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(serverPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - - StreamSettings: &internet.StreamConfig{ - ProtocolName: "hysteria2", - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - ProtocolName: "hysteria2", - Settings: serial.ToTypedMessage(&hyTransport.Config{ - Congestion: &hyTransport.Congestion{Type: congestionType, UpMbps: 100, DownMbps: 100}, - Password: "password", - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&inbound.Config{ - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&vmess.Account{ - Id: userID.String(), - AlterId: 0, - }), - }, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - ProxySettings: serial.ToTypedMessage(&freedom.Config{}), - }, - }, - } - - clientPort := tcp.PickPort() - clientConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(clientPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - }), - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ - Address: net.NewIPOrDomain(dest.Address), - Port: uint32(dest.Port), - NetworkList: &net.NetworkList{ - Network: []net.Network{net.Network_TCP}, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ - StreamSettings: &internet.StreamConfig{ - ProtocolName: "hysteria2", - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - ServerName: "www.v2fly.org", - AllowInsecure: true, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - ProtocolName: "hysteria2", - Settings: serial.ToTypedMessage(&hyTransport.Config{ - Congestion: &hyTransport.Congestion{Type: congestionType, UpMbps: 100, DownMbps: 100}, - Password: "password", - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&outbound.Config{ - Receiver: []*protocol.ServerEndpoint{ - { - Address: net.NewIPOrDomain(net.LocalHostIP), - Port: uint32(serverPort), - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&vmess.Account{ - Id: userID.String(), - AlterId: 0, - SecuritySettings: &protocol.SecurityConfig{ - Type: protocol.SecurityType_NONE, - }, - }), - }, - }, - }, - }, - }), - }, - }, - } - - servers, err := InitializeServerConfigs(serverConfig, clientConfig) - if err != nil { - t.Fatal("Failed to initialize all servers: ", err.Error()) - } - defer CloseAllServers(servers) - - var errg errgroup.Group - for i := 0; i < 10; i++ { - errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) - } - - if err := errg.Wait(); err != nil { - t.Error(err) - } -} - -func TestHysteria2Offical(t *testing.T) { - for _, v := range []bool{true, false} { - testHysteria2Offical(t, v) - } -} - -func testHysteria2Offical(t *testing.T, isUDP bool) { - var dest net.Destination - var err error - if isUDP { - udpServer := udp.Server{ - MsgProcessor: xor, - } - dest, err = udpServer.Start() - common.Must(err) - defer udpServer.Close() - } else { - tcpServer := tcp.Server{ - MsgProcessor: xor, - } - dest, err = tcpServer.Start() - common.Must(err) - defer tcpServer.Close() - } - - serverPort := udp.PickPort() - serverConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(serverPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - StreamSettings: &internet.StreamConfig{ - ProtocolName: "hysteria2", - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - ProtocolName: "hysteria2", - Settings: serial.ToTypedMessage(&hyTransport.Config{ - Congestion: &hyTransport.Congestion{Type: "brutal", UpMbps: 100, DownMbps: 100}, - UseUdpExtension: true, - Password: "password", - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&hysteria2.ServerConfig{}), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - ProxySettings: serial.ToTypedMessage(&freedom.Config{}), - }, - }, - } - - clientPort := tcp.PickPort() - clientConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(clientPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - }), - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ - Address: net.NewIPOrDomain(dest.Address), - Port: uint32(dest.Port), - NetworkList: &net.NetworkList{ - Network: []net.Network{net.Network_TCP, net.Network_UDP}, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ - StreamSettings: &internet.StreamConfig{ - ProtocolName: "hysteria2", - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - ServerName: "www.v2fly.org", - AllowInsecure: true, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - ProtocolName: "hysteria2", - Settings: serial.ToTypedMessage(&hyTransport.Config{ - Congestion: &hyTransport.Congestion{Type: "brutal", UpMbps: 100, DownMbps: 100}, - UseUdpExtension: true, - Password: "password", - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&hysteria2.ClientConfig{ - Server: []*protocol.ServerEndpoint{ - { - Address: net.NewIPOrDomain(net.LocalHostIP), - Port: uint32(serverPort), - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&hysteria2.Account{}), - }, - }, - }, - }, - }), - }, - }, - } - - servers, err := InitializeServerConfigs(serverConfig, clientConfig) - if err != nil { - t.Fatal("Failed to initialize all servers: ", err.Error()) - } - defer CloseAllServers(servers) - - var errg errgroup.Group - for i := 0; i < 10; i++ { - if isUDP { - errg.Go(testUDPConn(clientPort, 1024, time.Second*4)) - } else { - errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) - } - } - - if err := errg.Wait(); err != nil { - t.Error(err) - } -} - -func TestHysteria2OnTCP(t *testing.T) { - tcpServer := tcp.Server{ - MsgProcessor: xor, - } - dest, err := tcpServer.Start() - common.Must(err) - defer tcpServer.Close() - - serverPort := udp.PickPort() - serverConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(serverPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - StreamSettings: &internet.StreamConfig{ - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - Protocol: internet.TransportProtocol_TCP, - Settings: serial.ToTypedMessage(&tcpTransport.Config{ - HeaderSettings: serial.ToTypedMessage(&http.Config{}), - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&hysteria2.ServerConfig{}), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - ProxySettings: serial.ToTypedMessage(&freedom.Config{}), - }, - }, - } - - clientPort := tcp.PickPort() - clientConfig := &core.Config{ - App: []*anypb.Any{ - serial.ToTypedMessage(&log.Config{ - Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console}, - }), - }, - Inbound: []*core.InboundHandlerConfig{ - { - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ - PortRange: net.SinglePortRange(clientPort), - Listen: net.NewIPOrDomain(net.LocalHostIP), - }), - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ - Address: net.NewIPOrDomain(dest.Address), - Port: uint32(dest.Port), - NetworkList: &net.NetworkList{ - Network: []net.Network{net.Network_TCP}, - }, - }), - }, - }, - Outbound: []*core.OutboundHandlerConfig{ - { - SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ - StreamSettings: &internet.StreamConfig{ - SecurityType: serial.GetMessageType(&tls.Config{}), - SecuritySettings: []*anypb.Any{ - serial.ToTypedMessage( - &tls.Config{ - ServerName: "www.v2fly.org", - AllowInsecure: true, - }, - ), - }, - TransportSettings: []*internet.TransportConfig{ - { - Protocol: internet.TransportProtocol_TCP, - Settings: serial.ToTypedMessage(&tcpTransport.Config{ - HeaderSettings: serial.ToTypedMessage(&http.Config{}), - }), - }, - }, - }, - }), - ProxySettings: serial.ToTypedMessage(&hysteria2.ClientConfig{ - Server: []*protocol.ServerEndpoint{ - { - Address: net.NewIPOrDomain(net.LocalHostIP), - Port: uint32(serverPort), - User: []*protocol.User{ - { - Account: serial.ToTypedMessage(&hysteria2.Account{}), - }, - }, - }, - }, - }), - }, - }, - } - - servers, err := InitializeServerConfigs(serverConfig, clientConfig) - if err != nil { - t.Fatal("Failed to initialize all servers: ", err.Error()) - } - defer CloseAllServers(servers) - - var errg errgroup.Group - for i := 0; i < 1; i++ { - errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) - } - - if err := errg.Wait(); err != nil { - t.Error(err) - } -} diff --git a/transport/internet/hysteria2/config.pb.go b/transport/internet/hysteria2/config.pb.go deleted file mode 100644 index f42e82e1b..000000000 --- a/transport/internet/hysteria2/config.pb.go +++ /dev/null @@ -1,271 +0,0 @@ -package hysteria2 - -import ( - _ "github.com/v2fly/v2ray-core/v5/common/protoext" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Congestion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - UpMbps uint64 `protobuf:"varint,2,opt,name=up_mbps,json=upMbps,proto3" json:"up_mbps,omitempty"` - DownMbps uint64 `protobuf:"varint,3,opt,name=down_mbps,json=downMbps,proto3" json:"down_mbps,omitempty"` -} - -func (x *Congestion) Reset() { - *x = Congestion{} - if protoimpl.UnsafeEnabled { - mi := &file_transport_internet_hysteria2_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Congestion) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Congestion) ProtoMessage() {} - -func (x *Congestion) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_hysteria2_config_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Congestion.ProtoReflect.Descriptor instead. -func (*Congestion) Descriptor() ([]byte, []int) { - return file_transport_internet_hysteria2_config_proto_rawDescGZIP(), []int{0} -} - -func (x *Congestion) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *Congestion) GetUpMbps() uint64 { - if x != nil { - return x.UpMbps - } - return 0 -} - -func (x *Congestion) GetDownMbps() uint64 { - if x != nil { - return x.DownMbps - } - return 0 -} - -type Config struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` - Congestion *Congestion `protobuf:"bytes,4,opt,name=congestion,proto3" json:"congestion,omitempty"` - IgnoreClientBandwidth bool `protobuf:"varint,5,opt,name=ignore_client_bandwidth,json=ignoreClientBandwidth,proto3" json:"ignore_client_bandwidth,omitempty"` - UseUdpExtension bool `protobuf:"varint,6,opt,name=use_udp_extension,json=useUdpExtension,proto3" json:"use_udp_extension,omitempty"` -} - -func (x *Config) Reset() { - *x = Config{} - if protoimpl.UnsafeEnabled { - mi := &file_transport_internet_hysteria2_config_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_hysteria2_config_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_hysteria2_config_proto_rawDescGZIP(), []int{1} -} - -func (x *Config) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -func (x *Config) GetCongestion() *Congestion { - if x != nil { - return x.Congestion - } - return nil -} - -func (x *Config) GetIgnoreClientBandwidth() bool { - if x != nil { - return x.IgnoreClientBandwidth - } - return false -} - -func (x *Config) GetUseUdpExtension() bool { - if x != nil { - return x.UseUdpExtension - } - return false -} - -var File_transport_internet_hysteria2_config_proto protoreflect.FileDescriptor - -var file_transport_internet_hysteria2_config_proto_rawDesc = []byte{ - 0x0a, 0x29, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x27, 0x76, 0x32, 0x72, - 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x79, 0x73, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x32, 0x1a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x65, 0x78, 0x74, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x70, 0x5f, 0x6d, - 0x62, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x70, 0x4d, 0x62, 0x70, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x62, 0x70, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x62, 0x70, 0x73, 0x22, 0xf9, - 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x53, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, - 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6e, 0x64, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x69, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x64, 0x70, 0x5f, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, - 0x73, 0x65, 0x55, 0x64, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x1a, - 0x82, 0xb5, 0x18, 0x16, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x09, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x42, 0x96, 0x01, 0x0a, 0x2b, 0x63, - 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x2e, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x66, 0x6c, 0x79, 0x2f, 0x76, - 0x32, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, - 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x69, 0x61, 0x32, 0xaa, 0x02, 0x27, 0x56, 0x32, 0x52, 0x61, - 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_transport_internet_hysteria2_config_proto_rawDescOnce sync.Once - file_transport_internet_hysteria2_config_proto_rawDescData = file_transport_internet_hysteria2_config_proto_rawDesc -) - -func file_transport_internet_hysteria2_config_proto_rawDescGZIP() []byte { - file_transport_internet_hysteria2_config_proto_rawDescOnce.Do(func() { - file_transport_internet_hysteria2_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_hysteria2_config_proto_rawDescData) - }) - return file_transport_internet_hysteria2_config_proto_rawDescData -} - -var file_transport_internet_hysteria2_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_transport_internet_hysteria2_config_proto_goTypes = []any{ - (*Congestion)(nil), // 0: v2ray.core.transport.internet.hysteria2.Congestion - (*Config)(nil), // 1: v2ray.core.transport.internet.hysteria2.Config -} -var file_transport_internet_hysteria2_config_proto_depIdxs = []int32{ - 0, // 0: v2ray.core.transport.internet.hysteria2.Config.congestion:type_name -> v2ray.core.transport.internet.hysteria2.Congestion - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_transport_internet_hysteria2_config_proto_init() } -func file_transport_internet_hysteria2_config_proto_init() { - if File_transport_internet_hysteria2_config_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_transport_internet_hysteria2_config_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Congestion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_transport_internet_hysteria2_config_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Config); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_transport_internet_hysteria2_config_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_hysteria2_config_proto_goTypes, - DependencyIndexes: file_transport_internet_hysteria2_config_proto_depIdxs, - MessageInfos: file_transport_internet_hysteria2_config_proto_msgTypes, - }.Build() - File_transport_internet_hysteria2_config_proto = out.File - file_transport_internet_hysteria2_config_proto_rawDesc = nil - file_transport_internet_hysteria2_config_proto_goTypes = nil - file_transport_internet_hysteria2_config_proto_depIdxs = nil -} diff --git a/transport/internet/hysteria2/config.proto b/transport/internet/hysteria2/config.proto deleted file mode 100644 index 2796c3f61..000000000 --- a/transport/internet/hysteria2/config.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; - -package v2ray.core.transport.internet.hysteria2; -option csharp_namespace = "V2Ray.Core.Transport.Internet.Hysteria2"; -option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2"; -option java_package = "com.v2ray.core.transport.internet.hysteria2"; -option java_multiple_files = true; - -import "common/protoext/extensions.proto"; - -message Congestion{ - string type = 1; - - uint64 up_mbps = 2; - uint64 down_mbps = 3; -} - -message Config { - option (v2ray.core.common.protoext.message_opt).type = "transport"; - option (v2ray.core.common.protoext.message_opt).short_name = "hysteria2"; - - string password = 3; - Congestion congestion = 4; - bool ignore_client_bandwidth = 5; - bool use_udp_extension = 6; -} diff --git a/transport/internet/hysteria2/conn.go b/transport/internet/hysteria2/conn.go deleted file mode 100644 index fbafd6924..000000000 --- a/transport/internet/hysteria2/conn.go +++ /dev/null @@ -1,127 +0,0 @@ -package hysteria2 - -import ( - "time" - - hyClient "github.com/apernet/hysteria/core/v2/client" - "github.com/apernet/hysteria/core/v2/international/protocol" - hyServer "github.com/apernet/hysteria/core/v2/server" - "github.com/apernet/quic-go" - - "github.com/v2fly/v2ray-core/v5/common/net" -) - -const CanNotUseUdpExtension = "Only hysteria2 proxy protocol can use udpExtension." -const Hy2MustNeedTLS = "Hysteria2 based on QUIC that requires TLS." - -type HyConn struct { - IsUDPExtension bool - IsServer bool - ClientUDPSession hyClient.HyUDPConn - ServerUDPSession *hyServer.UdpSessionEntry - - stream quic.Stream - local net.Addr - remote net.Addr -} - -func (c *HyConn) Read(b []byte) (int, error) { - if c.IsUDPExtension { - n, data, _, err := c.ReadPacket() - copy(b, data) - return n, err - } - return c.stream.Read(b) -} - -func (c *HyConn) Write(b []byte) (int, error) { - if c.IsUDPExtension { - dest, _ := net.ParseDestination("udp:v2fly.org:6666") - return c.WritePacket(b, dest) - } - return c.stream.Write(b) -} - -func (c *HyConn) WritePacket(b []byte, dest net.Destination) (int, error) { - if !c.IsUDPExtension { - return 0, newError(CanNotUseUdpExtension) - } - - if c.IsServer { - msg := &protocol.UDPMessage{ - SessionID: c.ServerUDPSession.ID, - PacketID: 0, - FragID: 0, - FragCount: 1, - Addr: dest.NetAddr(), - Data: b, - } - c.ServerUDPSession.SendCh <- msg - return len(b), nil - } - return len(b), c.ClientUDPSession.Send(b, dest.NetAddr()) -} - -func (c *HyConn) ReadPacket() (int, []byte, *net.Destination, error) { - if !c.IsUDPExtension { - return 0, nil, nil, newError(CanNotUseUdpExtension) - } - - if c.IsServer { - msg := <-c.ServerUDPSession.ReceiveCh - dest, err := net.ParseDestination("udp:" + msg.Addr) - return len(msg.Data), msg.Data, &dest, err - } - data, address, err := c.ClientUDPSession.Receive() - if err != nil { - return 0, nil, nil, err - } - dest, err := net.ParseDestination("udp:" + address) - if err != nil { - return 0, nil, nil, err - } - return len(data), data, &dest, nil -} - -func (c *HyConn) Close() error { - if c.IsUDPExtension { - if !c.IsServer && c.ClientUDPSession == nil || (c.IsServer && c.ServerUDPSession == nil) { - return newError(CanNotUseUdpExtension) - } - if c.IsServer { - c.ServerUDPSession.Close() - return c.ServerUDPSession.Conn.Close() - } - return c.ClientUDPSession.Close() - } - return c.stream.Close() -} - -func (c *HyConn) LocalAddr() net.Addr { - return c.local -} - -func (c *HyConn) RemoteAddr() net.Addr { - return c.remote -} - -func (c *HyConn) SetDeadline(t time.Time) error { - if c.IsUDPExtension { - return nil - } - return c.stream.SetDeadline(t) -} - -func (c *HyConn) SetReadDeadline(t time.Time) error { - if c.IsUDPExtension { - return nil - } - return c.stream.SetReadDeadline(t) -} - -func (c *HyConn) SetWriteDeadline(t time.Time) error { - if c.IsUDPExtension { - return nil - } - return c.stream.SetWriteDeadline(t) -} diff --git a/transport/internet/hysteria2/dialer.go b/transport/internet/hysteria2/dialer.go deleted file mode 100644 index 6c9f36882..000000000 --- a/transport/internet/hysteria2/dialer.go +++ /dev/null @@ -1,207 +0,0 @@ -package hysteria2 - -import ( - "context" - "sync" - - hyClient "github.com/apernet/hysteria/core/v2/client" - hyProtocol "github.com/apernet/hysteria/core/v2/international/protocol" - "github.com/apernet/quic-go/quicvarint" - - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/common/session" - "github.com/v2fly/v2ray-core/v5/transport/internet" - "github.com/v2fly/v2ray-core/v5/transport/internet/tls" -) - -type dialerConf struct { - net.Destination - *internet.MemoryStreamConfig -} - -var RunningClient map[dialerConf](hyClient.Client) -var ClientMutex sync.Mutex -var MBps uint64 = 1000000 / 8 // MByte - -func GetClientTLSConfig(dest net.Destination, streamSettings *internet.MemoryStreamConfig) (*hyClient.TLSConfig, error) { - config := tls.ConfigFromStreamSettings(streamSettings) - if config == nil { - return nil, newError(Hy2MustNeedTLS) - } - tlsConfig := config.GetTLSConfig(tls.WithDestination(dest)) - - return &hyClient.TLSConfig{ - RootCAs: tlsConfig.RootCAs, - ServerName: tlsConfig.ServerName, - InsecureSkipVerify: tlsConfig.InsecureSkipVerify, - VerifyPeerCertificate: tlsConfig.VerifyPeerCertificate, - }, nil -} - -func ResolveAddress(dest net.Destination) (net.Addr, error) { - var destAddr *net.UDPAddr - if dest.Address.Family().IsIP() { - destAddr = &net.UDPAddr{ - IP: dest.Address.IP(), - Port: int(dest.Port), - } - } else { - addr, err := net.ResolveUDPAddr("udp", dest.NetAddr()) - if err != nil { - return nil, err - } - destAddr = addr - } - return destAddr, nil -} - -type connFactory struct { - hyClient.ConnFactory - - NewFunc func(addr net.Addr) (net.PacketConn, error) -} - -func (f *connFactory) New(addr net.Addr) (net.PacketConn, error) { - return f.NewFunc(addr) -} - -func NewHyClient(dest net.Destination, streamSettings *internet.MemoryStreamConfig) (hyClient.Client, error) { - tlsConfig, err := GetClientTLSConfig(dest, streamSettings) - if err != nil { - return nil, err - } - - serverAddr, err := ResolveAddress(dest) - if err != nil { - return nil, err - } - - config := streamSettings.ProtocolSettings.(*Config) - client, _, err := hyClient.NewClient(&hyClient.Config{ - Auth: config.GetPassword(), - TLSConfig: *tlsConfig, - ServerAddr: serverAddr, - ConnFactory: &connFactory{ - NewFunc: func(addr net.Addr) (net.PacketConn, error) { - rawConn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ - IP: []byte{0, 0, 0, 0}, - Port: 0, - }, streamSettings.SocketSettings) - if err != nil { - return nil, err - } - return rawConn.(*net.UDPConn), nil - }, - }, - BandwidthConfig: hyClient.BandwidthConfig{MaxTx: config.Congestion.GetUpMbps() * MBps, MaxRx: config.GetCongestion().GetDownMbps() * MBps}, - }) - if err != nil { - return nil, err - } - - return client, nil -} - -func CloseHyClient(dest net.Destination, streamSettings *internet.MemoryStreamConfig) error { - ClientMutex.Lock() - defer ClientMutex.Unlock() - - client, found := RunningClient[dialerConf{dest, streamSettings}] - if found { - delete(RunningClient, dialerConf{dest, streamSettings}) - return client.Close() - } - return nil -} - -func GetHyClient(dest net.Destination, streamSettings *internet.MemoryStreamConfig) (hyClient.Client, error) { - var err error - var client hyClient.Client - - ClientMutex.Lock() - client, found := RunningClient[dialerConf{dest, streamSettings}] - ClientMutex.Unlock() - if !found || !CheckHyClientHealthy(client) { - if found { - // retry - CloseHyClient(dest, streamSettings) - } - client, err = NewHyClient(dest, streamSettings) - if err != nil { - return nil, err - } - ClientMutex.Lock() - RunningClient[dialerConf{dest, streamSettings}] = client - ClientMutex.Unlock() - } - return client, nil -} - -func CheckHyClientHealthy(client hyClient.Client) bool { - quicConn := client.GetQuicConn() - if quicConn == nil { - return false - } - select { - case <-quicConn.Context().Done(): - return false - default: - } - return true -} - -func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { - config := streamSettings.ProtocolSettings.(*Config) - - client, err := GetHyClient(dest, streamSettings) - if err != nil { - CloseHyClient(dest, streamSettings) - return nil, err - } - - quicConn := client.GetQuicConn() - conn := &HyConn{ - local: quicConn.LocalAddr(), - remote: quicConn.RemoteAddr(), - } - - outbound := session.OutboundFromContext(ctx) - network := net.Network_TCP - if outbound != nil { - network = outbound.Target.Network - } - - if network == net.Network_UDP && config.GetUseUdpExtension() { // only hysteria2 can use udpExtension - conn.IsUDPExtension = true - conn.IsServer = false - conn.ClientUDPSession, err = client.UDP() - if err != nil { - CloseHyClient(dest, streamSettings) - return nil, err - } - return conn, nil - } - - conn.stream, err = client.OpenStream() - if err != nil { - CloseHyClient(dest, streamSettings) - return nil, err - } - - // write TCP frame type - frameSize := int(quicvarint.Len(hyProtocol.FrameTypeTCPRequest)) - buf := make([]byte, frameSize) - hyProtocol.VarintPut(buf, hyProtocol.FrameTypeTCPRequest) - _, err = conn.stream.Write(buf) - if err != nil { - CloseHyClient(dest, streamSettings) - return nil, err - } - return conn, nil -} - -func init() { - RunningClient = make(map[dialerConf]hyClient.Client) - common.Must(internet.RegisterTransportDialer(protocolName, Dial)) -} diff --git a/transport/internet/hysteria2/errors.generated.go b/transport/internet/hysteria2/errors.generated.go deleted file mode 100644 index 105317031..000000000 --- a/transport/internet/hysteria2/errors.generated.go +++ /dev/null @@ -1,9 +0,0 @@ -package hysteria2 - -import "github.com/v2fly/v2ray-core/v5/common/errors" - -type errPathObjHolder struct{} - -func newError(values ...interface{}) *errors.Error { - return errors.New(values...).WithPathObj(errPathObjHolder{}) -} diff --git a/transport/internet/hysteria2/hub.go b/transport/internet/hysteria2/hub.go deleted file mode 100644 index 03e574ef3..000000000 --- a/transport/internet/hysteria2/hub.go +++ /dev/null @@ -1,128 +0,0 @@ -package hysteria2 - -import ( - "context" - - hyServer "github.com/apernet/hysteria/core/v2/server" - "github.com/apernet/quic-go" - "github.com/apernet/quic-go/http3" - - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/transport/internet" - "github.com/v2fly/v2ray-core/v5/transport/internet/tls" -) - -// Listener is an internet.Listener that listens for TCP connections. -type Listener struct { - hyServer hyServer.Server - rawConn net.PacketConn - addConn internet.ConnHandler -} - -// Addr implements internet.Listener.Addr. -func (l *Listener) Addr() net.Addr { - return l.rawConn.LocalAddr() -} - -// Close implements internet.Listener.Close. -func (l *Listener) Close() error { - return l.hyServer.Close() -} - -func (l *Listener) StreamHijacker(ft http3.FrameType, conn quic.Connection, stream quic.Stream, err error) (bool, error) { - // err always == nil - - tcpConn := &HyConn{ - stream: stream, - local: conn.LocalAddr(), - remote: conn.RemoteAddr(), - } - l.addConn(tcpConn) - return true, nil -} - -func (l *Listener) UdpHijacker(entry *hyServer.UdpSessionEntry, originalAddr string) { - addr, err := net.ResolveUDPAddr("udp", originalAddr) - if err != nil { - return - } - udpConn := &HyConn{ - IsUDPExtension: true, - IsServer: true, - ServerUDPSession: entry, - remote: addr, - local: l.rawConn.LocalAddr(), - } - l.addConn(udpConn) -} - -// Listen creates a new Listener based on configurations. -func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { - tlsConfig, err := GetServerTLSConfig(streamSettings) - if err != nil { - return nil, err - } - - if address.Family().IsDomain() { - return nil, nil - } - - config := streamSettings.ProtocolSettings.(*Config) - rawConn, err := internet.ListenSystemPacket(context.Background(), - &net.UDPAddr{ - IP: address.IP(), - Port: int(port), - }, streamSettings.SocketSettings) - if err != nil { - return nil, err - } - - listener := &Listener{ - rawConn: rawConn, - addConn: handler, - } - - hyServer, err := hyServer.NewServer(&hyServer.Config{ - Conn: rawConn, - TLSConfig: *tlsConfig, - DisableUDP: !config.GetUseUdpExtension(), - Authenticator: &Authenticator{Password: config.GetPassword()}, - StreamHijacker: listener.StreamHijacker, // acceptStreams - BandwidthConfig: hyServer.BandwidthConfig{MaxTx: config.Congestion.GetUpMbps() * MBps, MaxRx: config.GetCongestion().GetDownMbps() * MBps}, - UdpSessionHijacker: listener.UdpHijacker, // acceptUDPSession - IgnoreClientBandwidth: config.GetIgnoreClientBandwidth(), - }) - if err != nil { - return nil, err - } - - listener.hyServer = hyServer - go hyServer.Serve() - return listener, nil -} - -func GetServerTLSConfig(streamSettings *internet.MemoryStreamConfig) (*hyServer.TLSConfig, error) { - config := tls.ConfigFromStreamSettings(streamSettings) - if config == nil { - return nil, newError(Hy2MustNeedTLS) - } - tlsConfig := config.GetTLSConfig() - - return &hyServer.TLSConfig{Certificates: tlsConfig.Certificates, GetCertificate: tlsConfig.GetCertificate}, nil -} - -type Authenticator struct { - Password string -} - -func (a *Authenticator) Authenticate(addr net.Addr, auth string, tx uint64) (ok bool, id string) { - if auth == a.Password || a.Password == "" { - return true, "user" - } - return false, "" -} - -func init() { - common.Must(internet.RegisterTransportListener(protocolName, Listen)) -} diff --git a/transport/internet/hysteria2/hy2_transport_test.go b/transport/internet/hysteria2/hy2_transport_test.go deleted file mode 100644 index e4a5c1fde..000000000 --- a/transport/internet/hysteria2/hy2_transport_test.go +++ /dev/null @@ -1,155 +0,0 @@ -package hysteria2_test - -import ( - "context" - "crypto/rand" - "fmt" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/common/buf" - "github.com/v2fly/v2ray-core/v5/common/net" - "github.com/v2fly/v2ray-core/v5/common/protocol/tls/cert" - "github.com/v2fly/v2ray-core/v5/common/session" - "github.com/v2fly/v2ray-core/v5/testing/servers/udp" - "github.com/v2fly/v2ray-core/v5/transport/internet" - "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2" - "github.com/v2fly/v2ray-core/v5/transport/internet/tls" -) - -func TestTCP(t *testing.T) { - port := udp.PickPort() - - listener, err := hysteria2.Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ - ProtocolName: "hysteria2", - ProtocolSettings: &hysteria2.Config{Password: "123"}, - SecurityType: "tls", - SecuritySettings: &tls.Config{ - Certificate: []*tls.Certificate{ - tls.ParseCertificate( - cert.MustGenerate(nil, - cert.DNSNames("www.v2fly.org"), - ), - ), - }, - }, - }, func(conn internet.Connection) { - go func() { - defer conn.Close() - - b := buf.New() - defer b.Release() - - for { - b.Clear() - if _, err := b.ReadFrom(conn); err != nil { - fmt.Println(err) - return - } - common.Must2(conn.Write(b.Bytes())) - } - }() - }) - common.Must(err) - - defer listener.Close() - - time.Sleep(time.Second) - - dctx := context.Background() - conn, err := hysteria2.Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ - ProtocolName: "hysteria2", - ProtocolSettings: &hysteria2.Config{Password: "123"}, - SecurityType: "tls", - SecuritySettings: &tls.Config{ - ServerName: "www.v2fly.org", - AllowInsecure: true, - }, - }) - common.Must(err) - defer conn.Close() - - const N = 1000 - b1 := make([]byte, N) - common.Must2(rand.Read(b1)) - b2 := buf.New() - - common.Must2(conn.Write(b1)) - - b2.Clear() - common.Must2(b2.ReadFullFrom(conn, N)) - if r := cmp.Diff(b2.Bytes(), b1); r != "" { - t.Error(r) - } -} - -func TestUDP(t *testing.T) { - port := udp.PickPort() - - listener, err := hysteria2.Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ - ProtocolName: "hysteria2", - ProtocolSettings: &hysteria2.Config{Password: "123", UseUdpExtension: true}, - SecurityType: "tls", - SecuritySettings: &tls.Config{ - Certificate: []*tls.Certificate{ - tls.ParseCertificate( - cert.MustGenerate(nil, - cert.DNSNames("www.v2fly.org"), - ), - ), - }, - }, - }, func(conn internet.Connection) { - fmt.Println("incoming") - go func() { - defer conn.Close() - - b := buf.New() - defer b.Release() - - for { - b.Clear() - if _, err := b.ReadFrom(conn); err != nil { - fmt.Println(err) - return - } - common.Must2(conn.Write(b.Bytes())) - } - }() - }) - common.Must(err) - - defer listener.Close() - - time.Sleep(time.Second) - - address, err := net.ParseDestination("udp:127.0.0.1:1180") - dctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: address}) - - conn, err := hysteria2.Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ - ProtocolName: "hysteria2", - ProtocolSettings: &hysteria2.Config{Password: "123", UseUdpExtension: true}, - SecurityType: "tls", - SecuritySettings: &tls.Config{ - ServerName: "www.v2fly.org", - AllowInsecure: true, - }, - }) - common.Must(err) - defer conn.Close() - - const N = 1000 - b1 := make([]byte, N) - common.Must2(rand.Read(b1)) - common.Must2(conn.Write(b1)) - - b2 := buf.New() - b2.Clear() - common.Must2(b2.ReadFullFrom(conn, N)) - if r := cmp.Diff(b2.Bytes(), b1); r != "" { - t.Error(r) - } -} diff --git a/transport/internet/hysteria2/hysteria2.go b/transport/internet/hysteria2/hysteria2.go deleted file mode 100644 index 031c37763..000000000 --- a/transport/internet/hysteria2/hysteria2.go +++ /dev/null @@ -1,18 +0,0 @@ -package hysteria2 - -import ( - "github.com/v2fly/v2ray-core/v5/common" - "github.com/v2fly/v2ray-core/v5/transport/internet" -) - -//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen - -const ( - protocolName = "hysteria2" -) - -func init() { - common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { - return new(Config) - })) -}