make packets more sticky

This commit is contained in:
Page Fault
2020-05-27 06:10:03 +00:00
parent 958c2b64e7
commit 872ca954f2
7 changed files with 116 additions and 61 deletions
+24 -1
View File
@@ -126,8 +126,8 @@ func ReadByte(r io.Reader) (byte, error) {
}
type RewindConn struct {
R *RewindReader
net.Conn
R *RewindReader
}
func (c *RewindConn) Read(p []byte) (int, error) {
@@ -140,3 +140,26 @@ func NewRewindConn(conn net.Conn) *RewindConn {
R: NewRewindReader(conn),
}
}
type StickyWriter struct {
io.Writer
rawWriter io.Writer
writeBuffer []byte
MaxBuffered int
}
func (w *StickyWriter) Write(p []byte) (int, error) {
if w.MaxBuffered > 0 {
w.MaxBuffered--
w.writeBuffer = append(w.writeBuffer, p...)
if w.MaxBuffered != 0 {
return len(p), nil
}
w.MaxBuffered = 0
_, err := w.rawWriter.Write(w.writeBuffer)
w.writeBuffer = nil
return len(p), err
}
return w.rawWriter.Write(p)
}
+8 -9
View File
@@ -7,9 +7,9 @@ require (
github.com/cenkalti/backoff/v4 v4.0.2 // indirect
github.com/go-acme/lego/v3 v3.5.0
github.com/go-sql-driver/mysql v1.5.0
github.com/golang/protobuf v1.4.1
github.com/golang/protobuf v1.4.2
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
github.com/mediocregopher/radix/v3 v3.5.0
github.com/mediocregopher/radix/v3 v3.5.1
github.com/miekg/dns v1.1.29 // indirect
github.com/onsi/ginkgo v1.10.1 // indirect
github.com/onsi/gomega v1.7.0 // indirect
@@ -17,16 +17,15 @@ require (
github.com/proullon/ramsql v0.0.0-20181213202341-817cee58a244
github.com/refraction-networking/utls v0.0.0-20190909200633-43c36d3c1f57
github.com/smartystreets/goconvey v1.6.4
github.com/xtaci/smux v1.5.12
github.com/xtaci/smux v1.5.14
github.com/ziutek/mymysql v1.5.4 // indirect
go.starlark.net v0.0.0-20200330013621-be5394c419b6 // indirect
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f
go.starlark.net v0.0.0-20200519165436-0aa95694c768 // indirect
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
golang.org/x/sys v0.0.0-20200523222454-059865788121
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31 // indirect
google.golang.org/grpc v1.29.1
google.golang.org/protobuf v1.22.0
google.golang.org/protobuf v1.24.0
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
v2ray.com/core v4.19.1+incompatible
+20 -14
View File
@@ -128,6 +128,8 @@ github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -197,8 +199,8 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mediocregopher/radix/v3 v3.5.0 h1:8QHQmNh2ne9aFxTD3z63u/bkPPiOtknHoz80oP8EA/E=
github.com/mediocregopher/radix/v3 v3.5.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
github.com/mediocregopher/radix/v3 v3.5.1 h1:IOYgQUMA380N4khaL5eNT4v/P2LnHa8b0wnVdwZMFsY=
github.com/mediocregopher/radix/v3 v3.5.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
@@ -290,8 +292,8 @@ github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP080
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xtaci/smux v1.5.12 h1:n9OGjdqQuVZXLh46+L4IR5tR2wvuUFwRABnN/V55bIY=
github.com/xtaci/smux v1.5.12/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
github.com/xtaci/smux v1.5.14 h1:1j+zJYDZRv9FHaWqCJfH5RPizIm0fSzJIFbfVn8zsfg=
github.com/xtaci/smux v1.5.14/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY=
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
@@ -302,8 +304,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.starlark.net v0.0.0-20190919145610-979af19b165c h1:WR7X1xgXJlXhQBdorVc9Db3RhwG+J/kp6bLuMyJjfVw=
go.starlark.net v0.0.0-20190919145610-979af19b165c/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=
go.starlark.net v0.0.0-20200330013621-be5394c419b6 h1:S2s+dYPyDg/vF7KbcRIB2831xVimJoR4zebfoVBzn7Q=
go.starlark.net v0.0.0-20200330013621-be5394c419b6/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
go.starlark.net v0.0.0-20200519165436-0aa95694c768 h1:p1NBjkIS2bHXntFxS9zhyFmZ9VKtazqNnsn5r7okSTo=
go.starlark.net v0.0.0-20200519165436-0aa95694c768/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y=
golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -315,8 +317,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -371,8 +373,8 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -416,8 +418,8 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f h1:mOhmO9WsBaJCNmaZHPtHs9wOcdqdKCjF6OPJlmDM3KI=
golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -503,8 +505,8 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171 h1:xes2Q2k+d/+YNXVw0FpZkIDJiaux4OVrRKXRAzH6A0U=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31 h1:Bz1qTn2YRWV+9OKJtxHJiQKCiXIdf+kwuKXdt9cBxyU=
google.golang.org/genproto v0.0.0-20200507105951-43844f6eee31/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -526,6 +528,10 @@ google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zim
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+12 -5
View File
@@ -1,6 +1,7 @@
package simplesocks
import (
"bytes"
"io"
"github.com/p4gefau1t/trojan-go/common"
@@ -15,6 +16,7 @@ type SimpleSocksConnSession struct {
rwc io.ReadWriteCloser
recv uint64
sent uint64
header []byte
}
func (m *SimpleSocksConnSession) Read(p []byte) (int, error) {
@@ -24,6 +26,11 @@ func (m *SimpleSocksConnSession) Read(p []byte) (int, error) {
}
func (m *SimpleSocksConnSession) Write(p []byte) (int, error) {
if m.header != nil {
_, err := m.rwc.Write(append(m.header, p...))
m.header = nil
return len(p), err
}
n, err := m.rwc.Write(p)
m.sent += uint64(n)
return n, err
@@ -43,9 +50,11 @@ func (m *SimpleSocksConnSession) parseRequest() error {
return m.request.Marshal(m.rwc)
}
func (m *SimpleSocksConnSession) writeRequest(req *protocol.Request) error {
func (m *SimpleSocksConnSession) writeRequest(req *protocol.Request) {
m.request = req
return m.request.Unmarshal(m.rwc)
buf := bytes.NewBuffer(make([]byte, 0, 128))
m.request.Unmarshal(buf)
m.header = buf.Bytes()
}
func NewInboundConnSession(conn io.ReadWriteCloser) (protocol.ConnSession, *protocol.Request, error) {
@@ -62,8 +71,6 @@ func NewOutboundConnSession(req *protocol.Request, conn io.ReadWriteCloser) (pro
m := &SimpleSocksConnSession{
rwc: conn,
}
if err := m.writeRequest(req); err != nil {
return nil, common.NewError("Failed to write mux request").Base(err)
}
m.writeRequest(req)
return m, nil
}
+15 -21
View File
@@ -14,30 +14,24 @@ import (
type TrojanOutboundConnSession struct {
protocol.ConnSession
config *conf.GlobalConfig
rwc io.ReadWriteCloser
request *protocol.Request
sent uint64
recv uint64
auth stat.Authenticator
meter stat.TrafficMeter
trojanHeader []byte
config *conf.GlobalConfig
rwc io.ReadWriteCloser
request *protocol.Request
sent uint64
recv uint64
auth stat.Authenticator
meter stat.TrafficMeter
header []byte
}
func (o *TrojanOutboundConnSession) Write(p []byte) (int, error) {
if o.trojanHeader != nil {
if o.header != nil {
//send the payload after the trojan request header
headerLen := len(o.trojanHeader)
n, err := o.rwc.Write(append(o.trojanHeader, p...))
if n >= headerLen {
n -= headerLen
} else {
n = 0
}
o.meter.AddTraffic(n, 0)
o.sent += uint64(n)
o.trojanHeader = nil
return n, err
_, err := o.rwc.Write(append(o.header, p...))
o.meter.AddTraffic(len(p)+len(o.header), 0)
o.sent += uint64(len(p) + len(o.header))
o.header = nil
return len(p), err
}
n, err := o.rwc.Write(p)
o.meter.AddTraffic(n, 0)
@@ -67,7 +61,7 @@ func (o *TrojanOutboundConnSession) writeRequest() {
buf.Write(crlf)
o.request.Unmarshal(buf)
buf.Write(crlf)
o.trojanHeader = buf.Bytes()
o.header = buf.Bytes()
}
func NewOutboundConnSession(req *protocol.Request, rwc io.ReadWriteCloser, config *conf.GlobalConfig, auth stat.Authenticator) (protocol.ConnSession, error) {
+1 -1
View File
@@ -36,7 +36,7 @@ func (i *TrojanPacketSession) ReadPacket() (*protocol.Request, []byte, error) {
}
func (i *TrojanPacketSession) WritePacket(req *protocol.Request, packet []byte) (int, error) {
buf := bytes.NewBuffer(make([]byte, 0, 128))
buf := bytes.NewBuffer(make([]byte, 0, 512))
common.Must(req.Address.Unmarshal(buf))
length := len(packet)
lengthBuf := [2]byte{}
+36 -10
View File
@@ -16,14 +16,36 @@ import (
"github.com/xtaci/smux"
)
type MuxID uint32
// HACK stick the smux 8 bytes header to the payload
type smuxStickyReadWriteCloser struct {
io.ReadWriteCloser
smuxHeader []byte
}
func generateMuxID() MuxID {
return MuxID(rand.Uint32())
func (rwc *smuxStickyReadWriteCloser) Write(p []byte) (int, error) {
if len(p) == 8 && rwc.smuxHeader == nil {
// check version and command, cmdPSH = 2
if (p[0] == 1 || p[0] == 2) && (p[1] == 2) {
rwc.smuxHeader = p
return 8, nil
}
}
if rwc.smuxHeader != nil {
_, err := rwc.ReadWriteCloser.Write(append(rwc.smuxHeader, p...))
rwc.smuxHeader = nil
return len(p), err
}
return rwc.ReadWriteCloser.Write(p)
}
type muxID uint32
func generateMuxID() muxID {
return muxID(rand.Uint32())
}
type muxClientInfo struct {
id MuxID
id muxID
client *smux.Session
lastActiveTime time.Time
}
@@ -32,7 +54,7 @@ type MuxManager struct {
TransportManager
sync.Mutex
muxPool map[MuxID]*muxClientInfo
muxPool map[muxID]*muxClientInfo
config *conf.GlobalConfig
auth stat.Authenticator
ctx context.Context
@@ -55,14 +77,18 @@ func (m *MuxManager) newMuxClient() (*muxClientInfo, error) {
if err != nil {
return nil, common.NewError("Failed to dail to remote server").Base(err)
}
conn, err := trojan.NewOutboundConnSession(req, rwc, m.config, m.auth)
trojanConn, err := trojan.NewOutboundConnSession(req, rwc, m.config, m.auth)
if err != nil {
rwc.Close()
log.Error(common.NewError("Failed to dial tls tunnel").Base(err))
return nil, err
}
client, err := smux.Client(conn, nil)
smuxRWC := &smuxStickyReadWriteCloser{
ReadWriteCloser: trojanConn,
}
client, err := smux.Client(smuxRWC, nil)
common.Must(err)
log.Info("Mux TLS tunnel established, client id:", id)
return &muxClientInfo{
@@ -94,7 +120,7 @@ func (m *MuxManager) pickMuxClient() (*muxClientInfo, error) {
default:
}
//not found
// not found
info, err := m.newMuxClient()
if err != nil {
return nil, err
@@ -114,7 +140,7 @@ func (m *MuxManager) DialToServer() (io.ReadWriteCloser, error) {
defer m.Unlock()
delete(m.muxPool, info.id)
info.client.Close()
log.Info("Somthing wrong with mux client", info.id, ", closing")
log.Warn("Somthing wrong with mux client", info.id, ", closing")
return nil, err
}
log.Info("New mux conn established with client", info.id)
@@ -165,7 +191,7 @@ func NewMuxPoolManager(ctx context.Context, config *conf.GlobalConfig, auth stat
m := &MuxManager{
ctx: ctx,
config: config,
muxPool: make(map[MuxID]*muxClientInfo),
muxPool: make(map[muxID]*muxClientInfo),
transport: NewTLSManager(config),
auth: auth,
}