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