mirror of https://github.com/ginuerzh/gost
17 changed files with 241 additions and 1638 deletions
@ -1,220 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"bufio" |
|||
"flag" |
|||
"log" |
|||
"net/http" |
|||
"net/http/httputil" |
|||
"net/url" |
|||
"sync" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
"golang.org/x/net/http2" |
|||
) |
|||
|
|||
var ( |
|||
requests, concurrency int |
|||
quiet bool |
|||
swg, ewg sync.WaitGroup |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.IntVar(&requests, "n", 1, "Number of requests to perform") |
|||
flag.IntVar(&concurrency, "c", 1, "Number of multiple requests to make at a time") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&http2.VerboseLogs, "v", false, "HTTP2 verbose logs") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
chain := gost.NewChain( |
|||
|
|||
/* |
|||
// http+tcp
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:18080", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
gost.TCPTransporter(), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// socks5+tcp
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:11080", |
|||
Client: gost.NewClient( |
|||
gost.SOCKS5Connector(url.UserPassword("admin", "123456")), |
|||
gost.TCPTransporter(), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// ss+tcp
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:18338", |
|||
Client: gost.NewClient( |
|||
gost.ShadowConnector(url.UserPassword("chacha20", "123456")), |
|||
gost.TCPTransporter(), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+ws
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:18000", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
gost.WSTransporter(nil), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+wss
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:18443", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
gost.WSSTransporter(nil), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+tls
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:11443", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
gost.TLSTransporter(), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http2
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:1443", |
|||
Client: &gost.Client{ |
|||
Connector: gost.HTTP2Connector(url.UserPassword("admin", "123456")), |
|||
Transporter: gost.HTTP2Transporter(nil), |
|||
}, |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+kcp
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:18388", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(nil), |
|||
gost.KCPTransporter(nil), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+ssh
|
|||
gost.Node{ |
|||
Addr: "127.0.0.1:12222", |
|||
Client: gost.NewClient( |
|||
gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
gost.SSHTunnelTransporter(), |
|||
), |
|||
}, |
|||
*/ |
|||
|
|||
/* |
|||
// http+quic
|
|||
gost.Node{ |
|||
Addr: "localhost:6121", |
|||
Client: &gost.Client{ |
|||
Connector: gost.HTTPConnector(url.UserPassword("admin", "123456")), |
|||
Transporter: gost.QUICTransporter(nil), |
|||
}, |
|||
}, |
|||
*/ |
|||
// socks5+h2
|
|||
gost.Node{ |
|||
Addr: "localhost:8443", |
|||
Client: &gost.Client{ |
|||
// Connector: gost.HTTPConnector(url.UserPassword("admin", "123456")),
|
|||
Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), |
|||
// Transporter: gost.H2CTransporter(), // HTTP2 h2c mode
|
|||
Transporter: gost.H2Transporter(nil), // HTTP2 h2
|
|||
}, |
|||
}, |
|||
) |
|||
|
|||
total := 0 |
|||
for total < requests { |
|||
if total+concurrency > requests { |
|||
concurrency = requests - total |
|||
} |
|||
startChan := make(chan struct{}) |
|||
for i := 0; i < concurrency; i++ { |
|||
swg.Add(1) |
|||
ewg.Add(1) |
|||
go request(chain, startChan) |
|||
} |
|||
|
|||
start := time.Now() |
|||
swg.Wait() // wait for workers ready
|
|||
close(startChan) // start signal
|
|||
ewg.Wait() // wait for workers done
|
|||
|
|||
duration := time.Since(start) |
|||
total += concurrency |
|||
log.Printf("%d/%d/%d requests done (%v/%v)", total, requests, concurrency, duration, duration/time.Duration(concurrency)) |
|||
} |
|||
} |
|||
|
|||
func request(chain *gost.Chain, start <-chan struct{}) { |
|||
defer ewg.Done() |
|||
|
|||
swg.Done() |
|||
<-start |
|||
|
|||
conn, err := chain.Dial("localhost:18888") |
|||
if err != nil { |
|||
log.Println(err) |
|||
return |
|||
} |
|||
defer conn.Close() |
|||
//conn = tls.Client(conn, &tls.Config{InsecureSkipVerify: true})
|
|||
req, err := http.NewRequest(http.MethodGet, "http://localhost:18888", nil) |
|||
if err != nil { |
|||
log.Println(err) |
|||
return |
|||
} |
|||
if err := req.Write(conn); err != nil { |
|||
log.Println(err) |
|||
return |
|||
} |
|||
resp, err := http.ReadResponse(bufio.NewReader(conn), req) |
|||
if err != nil { |
|||
log.Println(err) |
|||
return |
|||
} |
|||
defer resp.Body.Close() |
|||
|
|||
if gost.Debug { |
|||
rb, _ := httputil.DumpRequest(req, true) |
|||
log.Println(string(rb)) |
|||
rb, _ = httputil.DumpResponse(resp, true) |
|||
log.Println(string(rb)) |
|||
} |
|||
} |
|||
@ -1,359 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"fmt" |
|||
"log" |
|||
"net/http" |
|||
"net/url" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
"golang.org/x/net/http2" |
|||
) |
|||
|
|||
var ( |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.BoolVar(&http2.VerboseLogs, "v", false, "HTTP2 verbose logs") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
go httpServer() |
|||
go socks5Server() |
|||
go tlsServer() |
|||
go shadowServer() |
|||
go wsServer() |
|||
go wssServer() |
|||
go kcpServer() |
|||
go tcpForwardServer() |
|||
go tcpRemoteForwardServer() |
|||
// go rudpForwardServer()
|
|||
// go tcpRedirectServer()
|
|||
go sshTunnelServer() |
|||
go http2Server() |
|||
go http2TunnelServer() |
|||
go quicServer() |
|||
go shadowUDPServer() |
|||
go testServer() |
|||
select {} |
|||
} |
|||
|
|||
func httpServer() { |
|||
ln, err := gost.TCPListener(":18080") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func socks5Server() { |
|||
ln, err := gost.TCPListener(":11080") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SOCKS5Handler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func shadowServer() { |
|||
ln, err := gost.TCPListener(":18338") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.ShadowHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("chacha20", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func tlsServer() { |
|||
ln, err := gost.TLSListener(":11443", tlsConfig()) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func wsServer() { |
|||
ln, err := gost.WSListener(":18000", nil) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func wssServer() { |
|||
ln, err := gost.WSSListener(":18443", tlsConfig(), nil) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func kcpServer() { |
|||
ln, err := gost.KCPListener(":18388", nil) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler() |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func tcpForwardServer() { |
|||
ln, err := gost.TCPListener(":2222") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.TCPDirectForwardHandler("localhost:22") |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func tcpRemoteForwardServer() { |
|||
ln, err := gost.TCPRemoteForwardListener( |
|||
":1222", |
|||
/* |
|||
gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "tcp", |
|||
Addr: "localhost:12345", |
|||
User: url.UserPassword("admin", "123456"), |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), |
|||
Transporter: gost.TCPTransporter(), |
|||
}, |
|||
}, |
|||
), |
|||
*/ |
|||
nil, |
|||
) |
|||
if err != nil { |
|||
log.Fatal() |
|||
} |
|||
h := gost.TCPRemoteForwardHandler( |
|||
":22", |
|||
//gost.AddrHandlerOption("127.0.0.1:22"),
|
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func rudpForwardServer() { |
|||
ln, err := gost.UDPRemoteForwardListener( |
|||
":10053", |
|||
gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "tcp", |
|||
Addr: "localhost:12345", |
|||
User: url.UserPassword("admin", "123456"), |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), |
|||
Transporter: gost.TCPTransporter(), |
|||
}, |
|||
}, |
|||
), |
|||
30*time.Second, |
|||
) |
|||
if err != nil { |
|||
log.Fatal() |
|||
} |
|||
h := gost.UDPRemoteForwardHandler("localhost:53") |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func tcpRedirectServer() { |
|||
ln, err := gost.TCPListener(":8008") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.TCPRedirectHandler() |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func sshTunnelServer() { |
|||
ln, err := gost.SSHTunnelListener(":12222", &gost.SSHConfig{TLSConfig: tlsConfig()}) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func http2Server() { |
|||
// http2.VerboseLogs = true
|
|||
|
|||
ln, err := gost.HTTP2Listener(":1443", tlsConfig()) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTP2Handler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func http2TunnelServer() { |
|||
ln, err := gost.H2Listener(":8443", tlsConfig()) // HTTP2 h2 mode
|
|||
// ln, err := gost.H2CListener(":8443") // HTTP2 h2c mode
|
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
// h := gost.HTTPHandler(
|
|||
// gost.UsersHandlerOption(url.UserPassword("admin", "123456")),
|
|||
// )
|
|||
h := gost.SOCKS5Handler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func quicServer() { |
|||
ln, err := gost.QUICListener("localhost:6121", &gost.QUICConfig{TLSConfig: tlsConfig()}) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.HTTPHandler( |
|||
gost.UsersHandlerOption(url.UserPassword("admin", "123456")), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
func shadowUDPServer() { |
|||
ln, err := gost.ShadowUDPListener(":18338", url.UserPassword("chacha20", "123456"), 30*time.Second) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.ShadowUDPdHandler( |
|||
/* |
|||
gost.ChainHandlerOption(gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "tcp", |
|||
Addr: "localhost:11080", |
|||
User: url.UserPassword("admin", "123456"), |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), |
|||
Transporter: gost.TCPTransporter(), |
|||
}, |
|||
}, |
|||
)), |
|||
*/ |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{ |
|||
Certificates: []tls.Certificate{cert}, |
|||
PreferServerCipherSuites: true, |
|||
} |
|||
} |
|||
|
|||
func testServer() { |
|||
s := &http.Server{ |
|||
Addr: ":18888", |
|||
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintln(w, "abcdefghijklmnopqrstuvwxyz") |
|||
}), |
|||
} |
|||
log.Fatal(s.ListenAndServe()) |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
func main() { |
|||
tcpForward() |
|||
} |
|||
|
|||
func tcpForward() { |
|||
chain := gost.NewChain( |
|||
gost.Node{ |
|||
Addr: "localhost:11222", |
|||
Client: &gost.Client{ |
|||
Connector: gost.SSHDirectForwardConnector(), |
|||
Transporter: gost.SSHForwardTransporter(), |
|||
}, |
|||
}, |
|||
) |
|||
|
|||
ln, err := gost.TCPListener(":11800") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.TCPDirectForwardHandler( |
|||
"localhost:22", |
|||
gost.ChainHandlerOption(chain), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
@ -1,82 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
func main() { |
|||
sshForwardServer() |
|||
} |
|||
|
|||
func sshForwardServer() { |
|||
ln, err := gost.TCPListener(":11222") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SSHForwardHandler( |
|||
gost.AddrHandlerOption(":11222"), |
|||
// gost.UsersHandlerOption(url.UserPassword("admin", "123456")),
|
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,35 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
func main() { |
|||
sshRemoteForward() |
|||
} |
|||
|
|||
func sshRemoteForward() { |
|||
chain := gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "forward", |
|||
Transport: "ssh", |
|||
Addr: "localhost:11222", |
|||
Client: &gost.Client{ |
|||
Connector: gost.SSHRemoteForwardConnector(), |
|||
Transporter: gost.SSHForwardTransporter(), |
|||
}, |
|||
}, |
|||
) |
|||
|
|||
ln, err := gost.TCPRemoteForwardListener(":11800", chain) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.TCPRemoteForwardHandler( |
|||
"localhost:10000", |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
@ -1,82 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
func main() { |
|||
sshRemoteForwardServer() |
|||
} |
|||
|
|||
func sshRemoteForwardServer() { |
|||
ln, err := gost.TCPListener(":11222") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SSHForwardHandler( |
|||
gost.AddrHandlerOption(":11222"), |
|||
// gost.UsersHandlerOption(url.UserPassword("admin", "123456")),
|
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,53 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"flag" |
|||
"log" |
|||
"net" |
|||
"time" |
|||
) |
|||
|
|||
var ( |
|||
concurrency int |
|||
saddr string |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&saddr, "S", ":18080", "server address") |
|||
flag.IntVar(&concurrency, "c", 1, "Number of multiple echo to make at a time") |
|||
flag.Parse() |
|||
} |
|||
|
|||
func main() { |
|||
for i := 0; i < concurrency; i++ { |
|||
go udpEchoLoop() |
|||
} |
|||
select {} |
|||
} |
|||
|
|||
func udpEchoLoop() { |
|||
addr, err := net.ResolveUDPAddr("udp", saddr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
conn, err := net.DialUDP("udp", nil, addr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
msg := []byte(`abcdefghijklmnopqrstuvwxyz`) |
|||
for { |
|||
if _, err := conn.Write(msg); err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
b := make([]byte, 1024) |
|||
_, err := conn.Read(b) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
// log.Println(string(b[:n]))
|
|||
time.Sleep(100 * time.Millisecond) |
|||
} |
|||
} |
|||
@ -1,57 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"flag" |
|||
"log" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr, faddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":18080", "listen address") |
|||
flag.StringVar(&faddr, "F", ":8080", "forward address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
func main() { |
|||
udpDirectForwardServer() |
|||
} |
|||
|
|||
func udpDirectForwardServer() { |
|||
ln, err := gost.UDPDirectForwardListener(laddr, time.Second*30) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.UDPDirectForwardHandler( |
|||
faddr, |
|||
/* |
|||
gost.ChainHandlerOption(gost.NewChain(gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "tcp", |
|||
Addr: ":11080", |
|||
User: url.UserPassword("admin", "123456"), |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector( |
|||
url.UserPassword("admin", "123456"), |
|||
), |
|||
Transporter: gost.TCPTransporter(), |
|||
}, |
|||
})), |
|||
*/ |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
@ -1,60 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"flag" |
|||
"log" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr, faddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":18080", "listen address") |
|||
flag.StringVar(&faddr, "F", ":8080", "forward address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
func main() { |
|||
udpRemoteForwardServer() |
|||
} |
|||
|
|||
func udpRemoteForwardServer() { |
|||
ln, err := gost.UDPRemoteForwardListener( |
|||
laddr, |
|||
/* |
|||
gost.NewChain(gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "tcp", |
|||
Addr: ":11080", |
|||
User: url.UserPassword("admin", "123456"), |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector( |
|||
url.UserPassword("admin", "123456"), |
|||
), |
|||
Transporter: gost.TCPTransporter(), |
|||
}, |
|||
}), |
|||
*/ |
|||
nil, |
|||
time.Second*30) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.UDPRemoteForwardHandler( |
|||
faddr, |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
@ -1,44 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"flag" |
|||
"log" |
|||
"net" |
|||
) |
|||
|
|||
var ( |
|||
laddr string |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":8080", "listen address") |
|||
flag.Parse() |
|||
} |
|||
func main() { |
|||
udpEchoServer() |
|||
} |
|||
|
|||
func udpEchoServer() { |
|||
addr, err := net.ResolveUDPAddr("udp", laddr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
conn, err := net.ListenUDP("udp", addr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
for { |
|||
b := make([]byte, 1024) |
|||
n, raddr, err := conn.ReadFromUDP(b) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
if _, err = conn.WriteToUDP(b[:n], raddr); err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
} |
|||
} |
|||
@ -1,125 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"log" |
|||
"net/url" |
|||
|
|||
"golang.org/x/net/http2" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
quiet bool |
|||
keyFile, certFile string |
|||
laddr string |
|||
user, passwd string |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":1443", "listen address") |
|||
flag.StringVar(&user, "u", "", "username") |
|||
flag.StringVar(&passwd, "p", "", "password") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.BoolVar(&http2.VerboseLogs, "v", false, "HTTP2 verbose log") |
|||
flag.StringVar(&keyFile, "key", "key.pem", "TLS key file") |
|||
flag.StringVar(&certFile, "cert", "cert.pem", "TLS cert file") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
http2Server() |
|||
} |
|||
|
|||
func http2Server() { |
|||
cert, er := tls.LoadX509KeyPair(certFile, keyFile) |
|||
if er != nil { |
|||
log.Println(er) |
|||
cert, er = tls.X509KeyPair(rawCert, rawKey) |
|||
if er != nil { |
|||
panic(er) |
|||
} |
|||
} |
|||
|
|||
ln, err := gost.HTTP2Listener(laddr, &tls.Config{Certificates: []tls.Certificate{cert}}) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
var users []*url.Userinfo |
|||
if user != "" || passwd != "" { |
|||
users = append(users, url.UserPassword(user, passwd)) |
|||
} |
|||
|
|||
h := gost.HTTP2Handler( |
|||
gost.UsersHandlerOption(users...), |
|||
gost.AddrHandlerOption(laddr), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,110 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"log" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr, faddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":18080", "listen address") |
|||
flag.StringVar(&faddr, "F", "localhost:6121", "forward address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
chain := gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "quic", |
|||
Addr: faddr, |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector(nil), |
|||
Transporter: gost.QUICTransporter(&gost.QUICConfig{Timeout: 30 * time.Second, KeepAlive: true}), |
|||
}, |
|||
}, |
|||
) |
|||
|
|||
ln, err := gost.TCPListener(laddr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SOCKS5Handler( |
|||
gost.ChainHandlerOption(chain), |
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,100 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":6121", "listen address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
|
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
quicServer() |
|||
} |
|||
|
|||
func quicServer() { |
|||
ln, err := gost.QUICListener(laddr, &gost.QUICConfig{TLSConfig: tlsConfig()}) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SOCKS5Handler(gost.TLSConfigHandlerOption(tlsConfig())) |
|||
log.Println("server listen on", laddr) |
|||
|
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,113 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"log" |
|||
"time" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr, faddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":18080", "listen address") |
|||
flag.StringVar(&faddr, "F", ":12222", "forward address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
chain := gost.NewChain( |
|||
gost.Node{ |
|||
Protocol: "socks5", |
|||
Transport: "ssh", |
|||
Addr: faddr, |
|||
HandshakeOptions: []gost.HandshakeOption{ |
|||
gost.IntervalHandshakeOption(30 * time.Second), |
|||
}, |
|||
Client: &gost.Client{ |
|||
Connector: gost.SOCKS5Connector(nil), |
|||
Transporter: gost.SSHTunnelTransporter(), |
|||
}, |
|||
}, |
|||
) |
|||
|
|||
ln, err := gost.TCPListener(laddr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SOCKS5Handler( |
|||
gost.ChainHandlerOption(chain), |
|||
gost.TLSConfigHandlerOption(tlsConfig()), |
|||
) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,99 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
"flag" |
|||
"log" |
|||
|
|||
"github.com/ginuerzh/gost" |
|||
) |
|||
|
|||
var ( |
|||
laddr string |
|||
quiet bool |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFlags(log.LstdFlags | log.Lshortfile) |
|||
|
|||
flag.StringVar(&laddr, "L", ":12222", "listen address") |
|||
flag.BoolVar(&quiet, "q", false, "quiet mode") |
|||
flag.BoolVar(&gost.Debug, "d", false, "debug mode") |
|||
|
|||
flag.Parse() |
|||
|
|||
if quiet { |
|||
gost.SetLogger(&gost.NopLogger{}) |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
sshTunnelServer() |
|||
} |
|||
|
|||
func sshTunnelServer() { |
|||
ln, err := gost.SSHTunnelListener(laddr, &gost.SSHConfig{TLSConfig: tlsConfig()}) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
h := gost.SOCKS5Handler(gost.TLSConfigHandlerOption(tlsConfig())) |
|||
log.Println("server listen on", laddr) |
|||
s := &gost.Server{ln} |
|||
log.Fatal(s.Serve(h)) |
|||
} |
|||
|
|||
var ( |
|||
rawCert = []byte(`-----BEGIN CERTIFICATE----- |
|||
MIIC+jCCAeKgAwIBAgIRAMlREhz8Miu1FQozsxbeqyMwDQYJKoZIhvcNAQELBQAw |
|||
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNzA1MTkwNTM5MDJaFw0xODA1MTkwNTM5 |
|||
MDJaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw |
|||
ggEKAoIBAQCyfqvv0kDriciEAVIW6JaWYFCL9a19jj1wmAGmVGxV3kNsr01kpa6N |
|||
0EBqnrcy7WknhCt1d43CqhKtTcXgJ/J9phZVxlizb8sUB85hm+MvP0N3HCg3f0Jw |
|||
hLuMrPijS6xjyw0fKCK/p6OUYMIfo5cdqeZid2WV4Ozts5uRd6Dmy2kyBe8Zg1F4 |
|||
8YJGuTWZmL2L7uZUiPY4T3q9+1iucq3vUpxymVRi1BTXnTpx+C0GS8NNgeEmevHv |
|||
482vHM5DNflAQ+mvGZvBVduq/AfirCDnt2DIZm1DcZXLrY9F3EPrlRZexmAhCDGR |
|||
LIKnMmoGicBM11Aw1fDIfJAHynk43tjPAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF |
|||
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC |
|||
CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAAx8Lna8DcQv0bRB3L9i2+KRN |
|||
l/UhPCoFagxk1cZore4p0w+1m7OgigOoTpg5jh78DzVDhScZlgJ0bBVYp5rojeJS |
|||
cBDC9lCDcaXQfFmT5LykCAwIgw/gs+rw5Aq0y3D0m8CcqKosyZa9wnZ2cVy/+45w |
|||
emcSdboc65ueZScv38/W7aTUoVRcjyRUv0jv0zW0EPnnDlluVkeZo9spBhiTTwoj |
|||
b3zGODs6alTNIJwZIHNxxyOmfJPpVVp8BzGbMk7YBixSlZ/vbrrYV34TcSiy7J57 |
|||
lNNoVWM+OwiVk1+AEZfQDwaQfef5tsIkAZBUyITkkDKRhygtwM2110dejbEsgg== |
|||
-----END CERTIFICATE-----`) |
|||
rawKey = []byte(`-----BEGIN RSA PRIVATE KEY----- |
|||
MIIEpQIBAAKCAQEAsn6r79JA64nIhAFSFuiWlmBQi/WtfY49cJgBplRsVd5DbK9N |
|||
ZKWujdBAap63Mu1pJ4QrdXeNwqoSrU3F4CfyfaYWVcZYs2/LFAfOYZvjLz9Ddxwo |
|||
N39CcIS7jKz4o0usY8sNHygiv6ejlGDCH6OXHanmYndlleDs7bObkXeg5stpMgXv |
|||
GYNRePGCRrk1mZi9i+7mVIj2OE96vftYrnKt71KccplUYtQU1506cfgtBkvDTYHh |
|||
Jnrx7+PNrxzOQzX5QEPprxmbwVXbqvwH4qwg57dgyGZtQ3GVy62PRdxD65UWXsZg |
|||
IQgxkSyCpzJqBonATNdQMNXwyHyQB8p5ON7YzwIDAQABAoIBAQCG4doj3Apa8z+n |
|||
IShbT1+cOyQi34A+xOIA151Hh7xmFxN0afRd/iWt3JUQ/OcLgQRZbDM7DSD+3W5H |
|||
r+G7xfQkpwFxx/T3g58+f7ehYx+GcJQWyhxJ88zNIkBnyb4KCAE5WBOOW9IGajPe |
|||
yE9pgUGMlPsXpYoKfHIOHg+NGY1pWUGBfBNR2kGrbkpZMmyy5bGa8dyrwAFBFRru |
|||
kcmmKvate8UlbRspFtd4nR/GQLTBrcDJ1k1i1Su/4BpDuDeK6LPI8ZRePGqbdcxk |
|||
TS30lsdYozuGfjZ5Zu8lSIJ//+7RjfDg8r684dpWjpalq8Quen60ZrIs01CSbfyU
|
|||
k8gOzTHhAoGBAOKhp41wXveegq+WylSXFyngm4bzF4dVdTRsSbJVk7NaOx1vCU6o |
|||
/xIHoGEQyLI6wF+EaHmY89/Qu6tSV97XyBbiKeskopv5iXS/BsWTHJ1VbCA1ZLmK |
|||
HgGllEkS0xfc9AdB7b6/K7LxAAQVKP3DtN6+6pSDZh9Sv2M1j0DbhkNbAoGBAMmg |
|||
HcMfExaaeskjHqyLudtKX+znwaIoumleOGuavohR4R+Fpk8Yv8Xhb5U7Yr4gk0vY |
|||
CFmhp1WAi6QMZ/8jePlKKXl3Ney827luoKiMczp2DoYE0t0u2Kw3LfkNKfjADZ7d |
|||
JI6xPJV9/X1erwjq+4UdKqrpOf05SY4nkBMcvr6dAoGAXzisvbDJNiFTp5Mj0Abr |
|||
pJzKvBjHegVeCXi2PkfWlzUCQYu1zWcURO8PY7k5mik1SuzHONAbJ578Oy+N3AOt |
|||
/m9oTXRHHmHqbzMUFU+KZlDN7XqBp7NwiCCZ/Vn7d7tOjP4Wdl68baL07sI1RupD |
|||
xJNS3LOY5PBPmc+XMRkLgKECgYEAgBNDlJSCrZMHeAjlDTncn53I/VXiPD2e3BvL |
|||
vx6W9UT9ueZN1GSmPO6M0MDeYmOS7VSXSUhUYQ28pkJzNTC1QbWITu4YxP7anBnX |
|||
1/kPoQ0pAJzDzVharlqGy3M/PBHTFRzogfO3xkY35ZFlokaR6uayGcr42Q+w16nt |
|||
7RYPXEkCgYEA3GQYirHnGZuQ952jMvduqnpgkJiSnr0fa+94Rwa1pAhxHLFMo5s4 |
|||
fqZOtqKPj2s5X1JR0VCey1ilCcaAhWeb3tXCpbYLZSbMtjtqwA6LUeGY+Xdupsjw |
|||
cfWIcOfHsIm2kP+RCxEnZf1XwiN9wyJeiUKlE0dqmx9j7F0Bm+7YDhI= |
|||
-----END RSA PRIVATE KEY-----`) |
|||
) |
|||
|
|||
func tlsConfig() *tls.Config { |
|||
cert, err := tls.X509KeyPair(rawCert, rawKey) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
return &tls.Config{Certificates: []tls.Certificate{cert}} |
|||
} |
|||
@ -1,65 +0,0 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"bytes" |
|||
"log" |
|||
"net" |
|||
"strconv" |
|||
|
|||
"github.com/go-gost/gosocks5" |
|||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" |
|||
) |
|||
|
|||
func main() { |
|||
ssuClient() |
|||
} |
|||
|
|||
func ssuClient() { |
|||
addr, err := net.ResolveUDPAddr("udp", ":18338") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
laddr, _ := net.ResolveUDPAddr("udp", ":10800") |
|||
conn, err := net.ListenUDP("udp", laddr) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
cp, err := ss.NewCipher("chacha20", "123456") |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
cc := ss.NewSecurePacketConn(conn, cp, false) |
|||
|
|||
raddr, _ := net.ResolveUDPAddr("udp", ":8080") |
|||
msg := []byte(`abcdefghijklmnopqrstuvwxyz`) |
|||
dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, toSocksAddr(raddr)), msg) |
|||
buf := bytes.Buffer{} |
|||
dgram.Write(&buf) |
|||
for { |
|||
log.Printf("%# x", buf.Bytes()[3:]) |
|||
if _, err := cc.WriteTo(buf.Bytes()[3:], addr); err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
b := make([]byte, 1024) |
|||
n, adr, err := cc.ReadFrom(b) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
log.Printf("%s: %# x", adr, b[:n]) |
|||
} |
|||
} |
|||
|
|||
func toSocksAddr(addr net.Addr) *gosocks5.Addr { |
|||
host := "0.0.0.0" |
|||
port := 0 |
|||
if addr != nil { |
|||
h, p, _ := net.SplitHostPort(addr.String()) |
|||
host = h |
|||
port, _ = strconv.Atoi(p) |
|||
} |
|||
return &gosocks5.Addr{ |
|||
Type: gosocks5.AddrIPv4, |
|||
Host: host, |
|||
Port: uint16(port), |
|||
} |
|||
} |
|||
@ -0,0 +1,241 @@ |
|||
package gost |
|||
|
|||
import ( |
|||
"crypto/tls" |
|||
|
|||
"net" |
|||
"net/http" |
|||
"net/http/httputil" |
|||
"time" |
|||
|
|||
"net/url" |
|||
|
|||
"github.com/go-log/log" |
|||
"github.com/gorilla/websocket" |
|||
) |
|||
|
|||
const ( |
|||
defaultWSPath2 = "/ws" |
|||
) |
|||
|
|||
// // WSOptions describes the options for websocket.
|
|||
type WSOptions2 struct { |
|||
ReadBufferSize int |
|||
WriteBufferSize int |
|||
HandshakeTimeout time.Duration |
|||
EnableCompression bool |
|||
UserAgent string |
|||
Path string |
|||
} |
|||
|
|||
type wsTransporter2 struct { |
|||
tcpTransporter |
|||
options *WSOptions |
|||
} |
|||
|
|||
// WSTransporter creates a Transporter that is used by websocket proxy client.
|
|||
func WSTransporter2(opts *WSOptions) Transporter { |
|||
return &wsTransporter{ |
|||
options: opts, |
|||
} |
|||
} |
|||
|
|||
func (tr *wsTransporter2) Handshake(conn net.Conn, options ...HandshakeOption) (net.Conn, error) { |
|||
opts := &HandshakeOptions{} |
|||
for _, option := range options { |
|||
option(opts) |
|||
} |
|||
wsOptions := tr.options |
|||
if opts.WSOptions != nil { |
|||
wsOptions = opts.WSOptions |
|||
} |
|||
if wsOptions == nil { |
|||
wsOptions = &WSOptions{} |
|||
} |
|||
|
|||
path := wsOptions.Path |
|||
if path == "" { |
|||
path = defaultWSPath |
|||
} |
|||
url := url.URL{Scheme: "ws", Host: opts.Host, Path: path} |
|||
return websocketClientConn2(url.String(), conn, nil, wsOptions) |
|||
} |
|||
|
|||
type wsListener2 struct { |
|||
addr net.Addr |
|||
upgrader *websocket.Upgrader |
|||
srv *http.Server |
|||
connChan chan net.Conn |
|||
errChan chan error |
|||
} |
|||
|
|||
// WSListener creates a Listener for websocket proxy server.
|
|||
func WSListener2(ln net.Listener, options *WSOptions) (Listener, error) { |
|||
|
|||
if options == nil { |
|||
options = &WSOptions{} |
|||
} |
|||
l := &wsListener2{ |
|||
upgrader: &websocket.Upgrader{ |
|||
ReadBufferSize: options.ReadBufferSize, |
|||
WriteBufferSize: options.WriteBufferSize, |
|||
CheckOrigin: func(r *http.Request) bool { return true }, |
|||
EnableCompression: options.EnableCompression, |
|||
}, |
|||
connChan: make(chan net.Conn, 1024), |
|||
errChan: make(chan error, 1), |
|||
} |
|||
|
|||
path := options.Path |
|||
if path == "" { |
|||
path = defaultWSPath2 |
|||
} |
|||
mux := http.NewServeMux() |
|||
mux.Handle(path, http.HandlerFunc(l.upgrade)) |
|||
l.srv = &http.Server{ |
|||
Addr: ":18000", |
|||
Handler: mux, |
|||
ReadHeaderTimeout: 30 * time.Second, |
|||
} |
|||
|
|||
l.addr = ln.Addr() |
|||
|
|||
go func() { |
|||
err := l.srv.Serve(ln) |
|||
if err != nil { |
|||
l.errChan <- err |
|||
} |
|||
close(l.errChan) |
|||
}() |
|||
select { |
|||
case err := <-l.errChan: |
|||
return nil, err |
|||
default: |
|||
} |
|||
|
|||
return l, nil |
|||
} |
|||
|
|||
func (l *wsListener2) upgrade(w http.ResponseWriter, r *http.Request) { |
|||
log.Logf("[ws] %s -> %s", r.RemoteAddr, l.addr) |
|||
if Debug { |
|||
dump, _ := httputil.DumpRequest(r, false) |
|||
log.Log(string(dump)) |
|||
} |
|||
conn, err := l.upgrader.Upgrade(w, r, nil) |
|||
if err != nil { |
|||
log.Logf("[ws] %s - %s : %s", r.RemoteAddr, l.addr, err) |
|||
return |
|||
} |
|||
select { |
|||
case l.connChan <- websocketServerConn2(conn): |
|||
default: |
|||
conn.Close() |
|||
log.Logf("[ws] %s - %s: connection queue is full", r.RemoteAddr, l.addr) |
|||
} |
|||
} |
|||
|
|||
func (l *wsListener2) Accept() (conn net.Conn, err error) { |
|||
select { |
|||
case conn = <-l.connChan: |
|||
case err = <-l.errChan: |
|||
} |
|||
return |
|||
} |
|||
|
|||
func (l *wsListener2) Close() error { |
|||
return l.srv.Close() |
|||
} |
|||
|
|||
func (l *wsListener2) Addr() net.Addr { |
|||
return l.addr |
|||
} |
|||
|
|||
// TODO: due to the concurrency control in the websocket.Conn,
|
|||
// a data race may be met when using with multiplexing.
|
|||
// See: https://godoc.org/gopkg.in/gorilla/websocket.v1#hdr-Concurrency
|
|||
type websocketConn2 struct { |
|||
conn *websocket.Conn |
|||
rb []byte |
|||
} |
|||
|
|||
func websocketClientConn2(url string, conn net.Conn, tlsConfig *tls.Config, options *WSOptions) (net.Conn, error) { |
|||
if options == nil { |
|||
options = &WSOptions{} |
|||
} |
|||
|
|||
timeout := options.HandshakeTimeout |
|||
if timeout <= 0 { |
|||
timeout = HandshakeTimeout |
|||
} |
|||
|
|||
dialer := websocket.Dialer{ |
|||
ReadBufferSize: options.ReadBufferSize, |
|||
WriteBufferSize: options.WriteBufferSize, |
|||
TLSClientConfig: tlsConfig, |
|||
HandshakeTimeout: timeout, |
|||
EnableCompression: options.EnableCompression, |
|||
NetDial: func(net, addr string) (net.Conn, error) { |
|||
return conn, nil |
|||
}, |
|||
} |
|||
header := http.Header{} |
|||
header.Set("User-Agent", DefaultUserAgent) |
|||
if options.UserAgent != "" { |
|||
header.Set("User-Agent", options.UserAgent) |
|||
} |
|||
c, resp, err := dialer.Dial(url, header) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
resp.Body.Close() |
|||
return &websocketConn{conn: c}, nil |
|||
} |
|||
|
|||
func websocketServerConn2(conn *websocket.Conn) net.Conn { |
|||
// conn.EnableWriteCompression(true)
|
|||
return &websocketConn{ |
|||
conn: conn, |
|||
} |
|||
} |
|||
|
|||
func (c *websocketConn2) Read(b []byte) (n int, err error) { |
|||
if len(c.rb) == 0 { |
|||
_, c.rb, err = c.conn.ReadMessage() |
|||
} |
|||
n = copy(b, c.rb) |
|||
c.rb = c.rb[n:] |
|||
return |
|||
} |
|||
|
|||
func (c *websocketConn2) Write(b []byte) (n int, err error) { |
|||
err = c.conn.WriteMessage(websocket.BinaryMessage, b) |
|||
n = len(b) |
|||
return |
|||
} |
|||
|
|||
func (c *websocketConn2) Close() error { |
|||
return c.conn.Close() |
|||
} |
|||
|
|||
func (c *websocketConn2) LocalAddr() net.Addr { |
|||
return c.conn.LocalAddr() |
|||
} |
|||
|
|||
func (c *websocketConn2) RemoteAddr() net.Addr { |
|||
return c.conn.RemoteAddr() |
|||
} |
|||
|
|||
func (c *websocketConn2) SetDeadline(t time.Time) error { |
|||
if err := c.SetReadDeadline(t); err != nil { |
|||
return err |
|||
} |
|||
return c.SetWriteDeadline(t) |
|||
} |
|||
func (c *websocketConn2) SetReadDeadline(t time.Time) error { |
|||
return c.conn.SetReadDeadline(t) |
|||
} |
|||
|
|||
func (c *websocketConn2) SetWriteDeadline(t time.Time) error { |
|||
return c.conn.SetWriteDeadline(t) |
|||
} |
|||
Loading…
Reference in new issue