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
3ea2add3
Commit
3ea2add3
authored
Mar 21, 2015
by
ginuerzh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bugs
parent
2502ef30
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
136 additions
and
31 deletions
+136
-31
gost.go
gost.go
+132
-30
gost2
gost2
+0
-0
socks5.go
socks5.go
+4
-1
No files found.
gost.go
View file @
3ea2add3
package
main
package
main
import
(
import
(
//
"bufio"
"bufio"
//
"bytes"
"bytes"
//"crypto/tls"
//"crypto/tls"
//
"errors"
"errors"
"io"
"io"
//"io/ioutil"
//"io/ioutil"
"log"
"log"
"net"
"net"
//
"net/http"
"net/http"
//
"strconv"
"strconv"
//
"strings"
"strings"
//"sync/atomic"
//"sync/atomic"
"time"
"time"
)
)
...
@@ -42,58 +42,158 @@ func (g *Gost) Run() error {
...
@@ -42,58 +42,158 @@ func (g *Gost) Run() error {
log
.
Println
(
"accept:"
,
err
)
log
.
Println
(
"accept:"
,
err
)
continue
continue
}
}
go
g
.
serv
e
(
conn
)
go
g
.
handl
e
(
conn
)
}
}
return
ln
.
Close
()
return
ln
.
Close
()
}
}
func
(
g
*
Gost
)
serve
(
conn
net
.
Conn
)
error
{
func
(
g
*
Gost
)
handle
(
conn
net
.
Conn
)
{
var
pconn
net
.
Conn
defer
conn
.
Close
()
defer
conn
.
Close
()
paddr
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
g
.
Proxy
)
// as client
if
len
(
g
.
Saddr
)
>
0
{
g
.
cli
(
conn
)
return
}
// as server
g
.
srv
(
conn
)
}
func
(
g
*
Gost
)
cli
(
conn
net
.
Conn
)
{
sconn
,
err
:=
g
.
connect
(
g
.
Saddr
)
if
err
!=
nil
{
return
}
defer
sconn
.
Close
()
g
.
transport
(
conn
,
sconn
)
return
}
func
(
g
*
Gost
)
srv
(
conn
net
.
Conn
)
{
b
:=
make
([]
byte
,
8192
)
n
,
err
:=
conn
.
Read
(
b
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Println
(
err
)
log
.
Println
(
err
)
return
}
}
if
paddr
!=
nil
{
pconn
,
err
=
net
.
DialTCP
(
"tcp"
,
nil
,
paddr
)
if
bytes
.
Equal
(
b
[
:
n
],
[]
byte
{
5
,
1
,
0
})
{
// socks5,NO AUTHENTICATION
log
.
Println
(
"read cmd:"
,
b
[
:
n
])
if
_
,
err
:=
conn
.
Write
([]
byte
{
5
,
0
});
err
!=
nil
{
log
.
Println
(
err
)
return
}
cmd
,
err
:=
ReadCmd
(
conn
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
}
}
return
g
.
foward
(
conn
,
pconn
)
host
:=
cmd
.
Addr
+
":"
+
strconv
.
Itoa
(
int
(
cmd
.
Port
))
log
.
Println
(
"connect"
,
host
)
tconn
,
err
:=
g
.
connect
(
host
)
if
err
!=
nil
{
log
.
Println
(
err
)
NewCmd
(
ConnRefused
,
0
,
""
,
0
)
.
Write
(
conn
)
return
}
defer
tconn
.
Close
()
if
err
=
NewCmd
(
Succeeded
,
AddrIPv4
,
"0.0.0.0"
,
0
)
.
Write
(
conn
);
err
!=
nil
{
log
.
Println
(
err
)
return
}
g
.
transport
(
conn
,
tconn
)
return
}
}
saddr
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
g
.
Saddr
)
//log.Println(string(b[:n]))
req
,
err
:=
http
.
ReadRequest
(
bufio
.
NewReader
(
bytes
.
NewReader
(
b
[
:
n
])))
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Println
(
err
)
log
.
Println
(
err
)
return
}
}
if
saddr
!=
nil
{
sconn
,
err
:=
net
.
DialTCP
(
"tcp"
,
nil
,
saddr
)
if
err
!=
nil
{
return
err
}
defer
sconn
.
Close
()
return
g
.
transport
(
conn
,
sconn
)
log
.
Println
(
req
.
Method
,
req
.
RequestURI
)
host
:=
req
.
Host
if
!
strings
.
Contains
(
host
,
":"
)
{
host
=
host
+
":80"
}
tconn
,
err
:=
g
.
connect
(
host
)
if
err
!=
nil
{
log
.
Println
(
err
)
conn
.
Write
([]
byte
(
"HTTP/1.1 503 Service unavailable
\r\n
"
+
"Proxy-Agent: gost/1.0
\r\n\r\n
"
))
return
}
defer
tconn
.
Close
()
if
req
.
Method
==
"CONNECT"
{
if
_
,
err
=
conn
.
Write
(
[]
byte
(
"HTTP/1.1 200 Connection established
\r\n
"
+
"Proxy-Agent: gost/1.0
\r\n\r\n
"
));
err
!=
nil
{
return
}
}
else
{
if
err
:=
req
.
Write
(
tconn
);
err
!=
nil
{
return
}
}
}
return
nil
g
.
transport
(
conn
,
tconn
)
}
}
func
(
g
*
Gost
)
foward
(
conn
,
pconn
net
.
Conn
)
error
{
func
(
g
*
Gost
)
connect
(
addr
string
)
(
net
.
Conn
,
error
)
{
defer
pconn
.
Close
()
if
len
(
g
.
Proxy
)
==
0
{
taddr
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
addr
)
if
err
!=
nil
{
return
nil
,
err
}
return
net
.
DialTCP
(
"tcp"
,
nil
,
taddr
)
}
saddr
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
g
.
Saddr
)
paddr
,
err
:=
net
.
ResolveTCPAddr
(
"tcp"
,
g
.
Proxy
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Println
(
err
)
return
nil
,
err
}
pconn
,
err
:=
net
.
DialTCP
(
"tcp"
,
nil
,
paddr
)
if
err
!=
nil
{
return
nil
,
err
}
b
:=
make
([]
byte
,
1500
)
buffer
:=
bytes
.
NewBuffer
(
b
)
buffer
.
WriteString
(
"CONNECT "
+
addr
+
" HTTP/1.1
\r\n
"
)
buffer
.
WriteString
(
"Host: "
+
addr
+
"
\r\n
"
)
buffer
.
WriteString
(
"Proxy-Connection: keep-alive
\r\n\r\n
"
)
if
_
,
err
=
pconn
.
Write
(
buffer
.
Bytes
());
err
!=
nil
{
pconn
.
Close
()
return
nil
,
err
}
}
if
saddr
!=
nil
{
r
:=
""
for
!
strings
.
HasSuffix
(
r
,
"
\r\n\r\n
"
)
{
n
:=
0
if
n
,
err
=
pconn
.
Read
(
b
);
err
!=
nil
{
pconn
.
Close
()
return
nil
,
err
}
r
+=
string
(
b
[
:
n
])
}
log
.
Println
(
r
)
if
!
strings
.
Contains
(
r
,
"200"
)
{
log
.
Println
(
"connection failed:
\n
"
,
r
)
err
=
errors
.
New
(
r
)
pconn
.
Close
()
return
nil
,
err
}
}
return
nil
return
pconn
,
nil
}
}
func
(
g
*
Gost
)
pipe
(
src
io
.
Reader
,
dst
io
.
Writer
,
c
chan
<-
error
)
{
func
(
g
*
Gost
)
pipe
(
src
io
.
Reader
,
dst
io
.
Writer
,
c
chan
<-
error
)
{
...
@@ -101,7 +201,7 @@ func (g *Gost) pipe(src io.Reader, dst io.Writer, c chan<- error) {
...
@@ -101,7 +201,7 @@ func (g *Gost) pipe(src io.Reader, dst io.Writer, c chan<- error) {
c
<-
err
c
<-
err
}
}
func
(
g
*
Gost
)
transport
(
conn
net
.
Conn
,
conn2
net
.
Conn
)
(
err
error
)
{
func
(
g
*
Gost
)
transport
(
conn
,
conn2
net
.
Conn
)
(
err
error
)
{
rChan
:=
make
(
chan
error
,
1
)
rChan
:=
make
(
chan
error
,
1
)
wChan
:=
make
(
chan
error
,
1
)
wChan
:=
make
(
chan
error
,
1
)
...
@@ -110,7 +210,9 @@ func (g *Gost) transport(conn net.Conn, conn2 net.Conn) (err error) {
...
@@ -110,7 +210,9 @@ func (g *Gost) transport(conn net.Conn, conn2 net.Conn) (err error) {
select
{
select
{
case
err
=
<-
wChan
:
case
err
=
<-
wChan
:
//log.Println("w exit", err)
case
err
=
<-
rChan
:
case
err
=
<-
rChan
:
//log.Println("r exit", err)
}
}
return
return
...
...
gost2
deleted
100755 → 0
View file @
2502ef30
File deleted
socks5.go
View file @
3ea2add3
...
@@ -4,6 +4,7 @@ import (
...
@@ -4,6 +4,7 @@ import (
"encoding/binary"
"encoding/binary"
"errors"
"errors"
"io"
"io"
"log"
"net"
"net"
)
)
...
@@ -91,6 +92,7 @@ func ReadCmd(r io.Reader) (*Cmd, error) {
...
@@ -91,6 +92,7 @@ func ReadCmd(r io.Reader) (*Cmd, error) {
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
log
.
Println
(
"read cmd:"
,
b
[
:
n
])
if
n
<
10
{
if
n
<
10
{
return
nil
,
ErrBadFormat
return
nil
,
ErrBadFormat
}
}
...
@@ -128,7 +130,7 @@ func ReadCmd(r io.Reader) (*Cmd, error) {
...
@@ -128,7 +130,7 @@ func ReadCmd(r io.Reader) (*Cmd, error) {
cmd
.
Addr
=
string
(
b
[
pos
:
pos
+
length
])
cmd
.
Addr
=
string
(
b
[
pos
:
pos
+
length
])
pos
+=
length
pos
+=
length
default
:
default
:
return
nil
,
ErrBadAddrType
pos
+=
4
}
}
cmd
.
Port
=
binary
.
BigEndian
.
Uint16
(
b
[
pos
:
])
cmd
.
Port
=
binary
.
BigEndian
.
Uint16
(
b
[
pos
:
])
...
@@ -157,6 +159,7 @@ func (cmd *Cmd) Write(w io.Writer) (err error) {
...
@@ -157,6 +159,7 @@ func (cmd *Cmd) Write(w io.Writer) (err error) {
binary
.
BigEndian
.
PutUint16
(
b
[
pos
:
],
cmd
.
Port
)
binary
.
BigEndian
.
PutUint16
(
b
[
pos
:
],
cmd
.
Port
)
pos
+=
2
pos
+=
2
log
.
Println
(
"write cmd:"
,
b
[
:
pos
])
_
,
err
=
w
.
Write
(
b
[
:
pos
])
_
,
err
=
w
.
Write
(
b
[
:
pos
])
return
return
...
...
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