Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
gost
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
gost
Commits
346c2c27
Commit
346c2c27
authored
Jul 24, 2017
by
rui.zheng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add HTTP2 proxy support
parent
1c76ca4b
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
581 additions
and
73 deletions
+581
-73
gost/cli/cli.go
gost/cli/cli.go
+48
-25
gost/client.go
gost/client.go
+6
-0
gost/gost.go
gost/gost.go
+4
-0
gost/http.go
gost/http.go
+20
-16
gost/http2.go
gost/http2.go
+444
-0
gost/kcp.go
gost/kcp.go
+5
-1
gost/srv/srv.go
gost/srv/srv.go
+37
-27
gost/ssh.go
gost/ssh.go
+1
-0
gost/tls.go
gost/tls.go
+8
-4
gost/ws.go
gost/ws.go
+8
-0
No files found.
gost/cli/cli.go
View file @
346c2c27
...
@@ -2,9 +2,13 @@ package main
...
@@ -2,9 +2,13 @@ package main
import
(
import
(
"bufio"
"bufio"
"crypto/tls"
"log"
"log"
"net/http"
"net/http"
"net/http/httputil"
"net/http/httputil"
"net/url"
"time"
"github.com/ginuerzh/gost/gost"
"github.com/ginuerzh/gost/gost"
)
)
...
@@ -85,6 +89,20 @@ func main() {
...
@@ -85,6 +89,20 @@ func main() {
},
},
*/
*/
// http2
gost
.
Node
{
Addr
:
"127.0.0.1:1443"
,
Client
:
gost
.
NewClient
(
gost
.
HTTP2Connector
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
gost
.
HTTP2Transporter
(
nil
,
&
tls
.
Config
{
InsecureSkipVerify
:
true
},
time
.
Second
*
60
,
),
),
},
/*
// http+kcp
// http+kcp
gost.Node{
gost.Node{
Addr: "127.0.0.1:8388",
Addr: "127.0.0.1:8388",
...
@@ -93,8 +111,10 @@ func main() {
...
@@ -93,8 +111,10 @@ func main() {
gost.KCPTransporter(nil),
gost.KCPTransporter(nil),
),
),
},
},
*/
)
)
for
i
:=
0
;
i
<
10
;
i
++
{
conn
,
err
:=
chain
.
Dial
(
"localhost:10000"
)
conn
,
err
:=
chain
.
Dial
(
"localhost:10000"
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
log
.
Fatal
(
err
)
...
@@ -117,4 +137,7 @@ func main() {
...
@@ -117,4 +137,7 @@ func main() {
log
.
Println
(
string
(
rb
))
log
.
Println
(
string
(
rb
))
rb
,
_
=
httputil
.
DumpResponse
(
resp
,
true
)
rb
,
_
=
httputil
.
DumpResponse
(
resp
,
true
)
log
.
Println
(
string
(
rb
))
log
.
Println
(
string
(
rb
))
time
.
Sleep
(
100
*
time
.
Millisecond
)
}
}
}
gost/client.go
View file @
346c2c27
...
@@ -63,6 +63,8 @@ type Connector interface {
...
@@ -63,6 +63,8 @@ type Connector interface {
type
Transporter
interface
{
type
Transporter
interface
{
Dial
(
addr
string
)
(
net
.
Conn
,
error
)
Dial
(
addr
string
)
(
net
.
Conn
,
error
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
// Indicate that the Transporter supports multiplex
Multiplex
()
bool
}
}
type
tcpTransporter
struct
{
type
tcpTransporter
struct
{
...
@@ -80,3 +82,7 @@ func (tr *tcpTransporter) Dial(addr string) (net.Conn, error) {
...
@@ -80,3 +82,7 @@ func (tr *tcpTransporter) Dial(addr string) (net.Conn, error) {
func
(
tr
*
tcpTransporter
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
func
(
tr
*
tcpTransporter
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
return
conn
,
nil
return
conn
,
nil
}
}
func
(
tr
*
tcpTransporter
)
Multiplex
()
bool
{
return
false
}
gost/gost.go
View file @
346c2c27
...
@@ -28,6 +28,10 @@ var (
...
@@ -28,6 +28,10 @@ var (
ReadTimeout
=
30
*
time
.
Second
ReadTimeout
=
30
*
time
.
Second
// WriteTimeout is the timeout for writing.
// WriteTimeout is the timeout for writing.
WriteTimeout
=
60
*
time
.
Second
WriteTimeout
=
60
*
time
.
Second
// PingTimeout is the timeout for pinging.
PingTimeout
=
30
*
time
.
Second
// PingRetries is the reties of ping.
PingRetries
=
3
// default udp node TTL in second for udp port forwarding.
// default udp node TTL in second for udp port forwarding.
defaultTTL
=
60
defaultTTL
=
60
)
)
...
...
gost/http.go
View file @
346c2c27
...
@@ -110,21 +110,8 @@ func (h *httpHandler) Handle(conn net.Conn) {
...
@@ -110,21 +110,8 @@ func (h *httpHandler) Handle(conn net.Conn) {
return
return
}
}
valid
:=
false
u
,
p
,
_
:=
basicProxyAuth
(
req
.
Header
.
Get
(
"Proxy-Authorization"
))
u
,
p
,
_
:=
h
.
basicProxyAuth
(
req
.
Header
.
Get
(
"Proxy-Authorization"
))
if
!
authenticate
(
u
,
p
,
h
.
options
.
Users
...
)
{
users
:=
h
.
options
.
Users
for
_
,
user
:=
range
users
{
username
:=
user
.
Username
()
password
,
_
:=
user
.
Password
()
if
(
u
==
username
&&
p
==
password
)
||
(
u
==
username
&&
password
==
""
)
||
(
username
==
""
&&
p
==
password
)
{
valid
=
true
break
}
}
if
len
(
users
)
>
0
&&
!
valid
{
log
.
Logf
(
"[http] %s <- %s : proxy authentication required"
,
conn
.
RemoteAddr
(),
req
.
Host
)
log
.
Logf
(
"[http] %s <- %s : proxy authentication required"
,
conn
.
RemoteAddr
(),
req
.
Host
)
resp
:=
"HTTP/1.1 407 Proxy Authentication Required
\r\n
"
+
resp
:=
"HTTP/1.1 407 Proxy Authentication Required
\r\n
"
+
"Proxy-Authenticate: Basic realm=
\"
gost
\"\r\n
"
+
"Proxy-Authenticate: Basic realm=
\"
gost
\"\r\n
"
+
...
@@ -182,7 +169,7 @@ func (h *httpHandler) Handle(conn net.Conn) {
...
@@ -182,7 +169,7 @@ func (h *httpHandler) Handle(conn net.Conn) {
log
.
Logf
(
"[http] %s >-< %s"
,
conn
.
RemoteAddr
(),
req
.
Host
)
log
.
Logf
(
"[http] %s >-< %s"
,
conn
.
RemoteAddr
(),
req
.
Host
)
}
}
func
(
h
*
httpHandler
)
basicProxyAuth
(
proxyAuth
string
)
(
username
,
password
string
,
ok
bool
)
{
func
basicProxyAuth
(
proxyAuth
string
)
(
username
,
password
string
,
ok
bool
)
{
if
proxyAuth
==
""
{
if
proxyAuth
==
""
{
return
return
}
}
...
@@ -202,3 +189,20 @@ func (h *httpHandler) basicProxyAuth(proxyAuth string) (username, password strin
...
@@ -202,3 +189,20 @@ func (h *httpHandler) basicProxyAuth(proxyAuth string) (username, password strin
return
cs
[
:
s
],
cs
[
s
+
1
:
],
true
return
cs
[
:
s
],
cs
[
s
+
1
:
],
true
}
}
func
authenticate
(
username
,
password
string
,
users
...*
url
.
Userinfo
)
bool
{
if
len
(
users
)
==
0
{
return
true
}
for
_
,
user
:=
range
users
{
u
:=
user
.
Username
()
p
,
_
:=
user
.
Password
()
if
(
u
==
username
&&
p
==
password
)
||
(
u
==
username
&&
p
==
""
)
||
(
u
==
""
&&
p
==
password
)
{
return
true
}
}
return
false
}
gost/http2.go
0 → 100644
View file @
346c2c27
This diff is collapsed.
Click to expand it.
gost/kcp.go
View file @
346c2c27
...
@@ -196,7 +196,7 @@ func (tr *kcpTransporter) Dial(addr string) (conn net.Conn, err error) {
...
@@ -196,7 +196,7 @@ func (tr *kcpTransporter) Dial(addr string) (conn net.Conn, err error) {
if
err
!=
nil
{
if
err
!=
nil
{
tr
.
sessionMutex
.
Lock
()
tr
.
sessionMutex
.
Lock
()
session
.
Close
()
session
.
Close
()
delete
(
tr
.
sessions
,
addr
)
delete
(
tr
.
sessions
,
addr
)
// TODO: we could obtain a new session automatically.
tr
.
sessionMutex
.
Unlock
()
tr
.
sessionMutex
.
Unlock
()
}
}
return
return
...
@@ -245,6 +245,10 @@ func (tr *kcpTransporter) Handshake(conn net.Conn) (net.Conn, error) {
...
@@ -245,6 +245,10 @@ func (tr *kcpTransporter) Handshake(conn net.Conn) (net.Conn, error) {
return
conn
,
nil
return
conn
,
nil
}
}
func
(
tr
*
kcpTransporter
)
Multiplex
()
bool
{
return
true
}
type
kcpListener
struct
{
type
kcpListener
struct
{
config
*
KCPConfig
config
*
KCPConfig
ln
*
kcp
.
Listener
ln
*
kcp
.
Listener
...
...
gost/srv/srv.go
View file @
346c2c27
...
@@ -15,17 +15,18 @@ func init() {
...
@@ -15,17 +15,18 @@ func init() {
}
}
func
main
()
{
func
main
()
{
go
httpServer
()
//
go httpServer()
go
socks5Server
()
//
go socks5Server()
go
tlsServer
()
//
go tlsServer()
go
shadowServer
()
//
go shadowServer()
go
wsServer
()
//
go wsServer()
go
wssServer
()
//
go wssServer()
go
kcpServer
()
//
go kcpServer()
go
tcpForwardServer
()
//
go tcpForwardServer()
go
rtcpForwardServer
()
//
go rtcpForwardServer()
// go rudpForwardServer()
// go rudpForwardServer()
go
tcpRedirectServer
()
// go tcpRedirectServer()
go
http2Server
()
select
{}
select
{}
}
}
...
@@ -43,15 +44,10 @@ func httpServer() {
...
@@ -43,15 +44,10 @@ func httpServer() {
}
}
func
socks5Server
()
{
func
socks5Server
()
{
cert
,
err
:=
tls
.
LoadX509KeyPair
(
"cert.pem"
,
"key.pem"
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
s
:=
&
gost
.
Server
{}
s
:=
&
gost
.
Server
{}
s
.
Handle
(
gost
.
SOCKS5Handler
(
s
.
Handle
(
gost
.
SOCKS5Handler
(
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
gost
.
TLSConfigHandlerOption
(
&
tls
.
Config
{
Certificates
:
[]
tls
.
Certificate
{
cert
}}
),
gost
.
TLSConfigHandlerOption
(
tlsConfig
()
),
))
))
ln
,
err
:=
gost
.
TCPListener
(
":1080"
)
ln
,
err
:=
gost
.
TCPListener
(
":1080"
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -77,11 +73,7 @@ func tlsServer() {
...
@@ -77,11 +73,7 @@ func tlsServer() {
s
.
Handle
(
gost
.
HTTPHandler
(
s
.
Handle
(
gost
.
HTTPHandler
(
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
))
))
cert
,
err
:=
tls
.
LoadX509KeyPair
(
"cert.pem"
,
"key.pem"
)
ln
,
err
:=
gost
.
TLSListener
(
":1443"
,
tlsConfig
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
ln
,
err
:=
gost
.
TLSListener
(
":1443"
,
&
tls
.
Config
{
Certificates
:
[]
tls
.
Certificate
{
cert
}})
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
log
.
Fatal
(
err
)
}
}
...
@@ -105,12 +97,7 @@ func wssServer() {
...
@@ -105,12 +97,7 @@ func wssServer() {
s
.
Handle
(
gost
.
HTTPHandler
(
s
.
Handle
(
gost
.
HTTPHandler
(
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
))
))
ln
,
err
:=
gost
.
WSSListener
(
":8443"
,
&
gost
.
WSOptions
{
TLSConfig
:
tlsConfig
()})
cert
,
err
:=
tls
.
LoadX509KeyPair
(
"cert.pem"
,
"key.pem"
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
ln
,
err
:=
gost
.
WSSListener
(
":8443"
,
&
gost
.
WSOptions
{
TLSConfig
:
&
tls
.
Config
{
Certificates
:
[]
tls
.
Certificate
{
cert
}}})
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
log
.
Fatal
(
err
)
}
}
...
@@ -194,3 +181,26 @@ func tcpRedirectServer() {
...
@@ -194,3 +181,26 @@ func tcpRedirectServer() {
}
}
log
.
Fatal
(
s
.
Serve
(
ln
))
log
.
Fatal
(
s
.
Serve
(
ln
))
}
}
func
http2Server
()
{
// http2.VerboseLogs = true
s
:=
&
gost
.
Server
{}
s
.
Handle
(
gost
.
HTTP2Handler
(
gost
.
UsersHandlerOption
(
url
.
UserPassword
(
"admin"
,
"123456"
)),
))
ln
,
err
:=
gost
.
TLSListener
(
":1443"
,
tlsConfig
())
// ln, err := gost.TCPListener(":1443")
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
log
.
Fatal
(
s
.
Serve
(
ln
))
}
func
tlsConfig
()
*
tls
.
Config
{
cert
,
err
:=
tls
.
LoadX509KeyPair
(
"cert.pem"
,
"key.pem"
)
if
err
!=
nil
{
panic
(
err
)
}
return
&
tls
.
Config
{
Certificates
:
[]
tls
.
Certificate
{
cert
}}
}
gost/ssh.go
0 → 100644
View file @
346c2c27
package
gost
gost/tls.go
View file @
346c2c27
...
@@ -6,13 +6,13 @@ import (
...
@@ -6,13 +6,13 @@ import (
)
)
type
tlsTransporter
struct
{
type
tlsTransporter
struct
{
TLSClient
Config
*
tls
.
Config
tls
Config
*
tls
.
Config
}
}
// TLSTransporter creates a Transporter that is used by TLS proxy client.
// TLSTransporter creates a Transporter that is used by TLS proxy client.
// It accepts a TLS config for TLS handshake.
// It accepts a TLS config for TLS handshake.
func
TLSTransporter
(
cfg
*
tls
.
Config
)
Transporter
{
func
TLSTransporter
(
cfg
*
tls
.
Config
)
Transporter
{
return
&
tlsTransporter
{
TLSClient
Config
:
cfg
}
return
&
tlsTransporter
{
tls
Config
:
cfg
}
}
}
func
(
tr
*
tlsTransporter
)
Dial
(
addr
string
)
(
net
.
Conn
,
error
)
{
func
(
tr
*
tlsTransporter
)
Dial
(
addr
string
)
(
net
.
Conn
,
error
)
{
...
@@ -20,7 +20,11 @@ func (tr *tlsTransporter) Dial(addr string) (net.Conn, error) {
...
@@ -20,7 +20,11 @@ func (tr *tlsTransporter) Dial(addr string) (net.Conn, error) {
}
}
func
(
tr
*
tlsTransporter
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
func
(
tr
*
tlsTransporter
)
Handshake
(
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
return
tls
.
Client
(
conn
,
tr
.
TLSClientConfig
),
nil
return
tls
.
Client
(
conn
,
tr
.
tlsConfig
),
nil
}
func
(
tr
*
tlsTransporter
)
Multiplex
()
bool
{
return
false
}
}
type
tlsListener
struct
{
type
tlsListener
struct
{
...
@@ -33,5 +37,5 @@ func TLSListener(addr string, config *tls.Config) (Listener, error) {
...
@@ -33,5 +37,5 @@ func TLSListener(addr string, config *tls.Config) (Listener, error) {
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
return
&
tlsListener
{
Listener
:
ln
},
nil
return
&
tlsListener
{
ln
},
nil
}
}
gost/ws.go
View file @
346c2c27
...
@@ -120,6 +120,10 @@ func (tr *wsTransporter) Handshake(conn net.Conn) (net.Conn, error) {
...
@@ -120,6 +120,10 @@ func (tr *wsTransporter) Handshake(conn net.Conn) (net.Conn, error) {
return
websocketClientConn
(
url
.
String
(),
conn
,
tr
.
options
)
return
websocketClientConn
(
url
.
String
(),
conn
,
tr
.
options
)
}
}
func
(
tr
*
wsTransporter
)
Multiplex
()
bool
{
return
false
}
type
wssTransporter
struct
{
type
wssTransporter
struct
{
addr
string
addr
string
options
*
WSOptions
options
*
WSOptions
...
@@ -142,6 +146,10 @@ func (tr *wssTransporter) Handshake(conn net.Conn) (net.Conn, error) {
...
@@ -142,6 +146,10 @@ func (tr *wssTransporter) Handshake(conn net.Conn) (net.Conn, error) {
return
websocketClientConn
(
url
.
String
(),
conn
,
tr
.
options
)
return
websocketClientConn
(
url
.
String
(),
conn
,
tr
.
options
)
}
}
func
(
tr
*
wssTransporter
)
Multiplex
()
bool
{
return
false
}
type
wsListener
struct
{
type
wsListener
struct
{
addr
net
.
Addr
addr
net
.
Addr
upgrader
*
websocket
.
Upgrader
upgrader
*
websocket
.
Upgrader
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment