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
c56e4aa7
Commit
c56e4aa7
authored
Jan 11, 2020
by
ginuerzh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add fake TCP transport
parent
e8d5687d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
217 additions
and
1 deletion
+217
-1
cmd/gost/route.go
cmd/gost/route.go
+11
-0
forward.go
forward.go
+1
-1
ftcp.go
ftcp.go
+203
-0
node.go
node.go
+2
-0
No files found.
cmd/gost/route.go
View file @
c56e4aa7
...
...
@@ -171,6 +171,8 @@ func parseChainNode(ns string) (nodes []gost.Node, err error) {
case
"ohttp"
:
host
=
node
.
Get
(
"host"
)
tr
=
gost
.
ObfsHTTPTransporter
()
case
"ftcp"
:
tr
=
gost
.
FakeTCPTransporter
()
default
:
tr
=
gost
.
TCPTransporter
()
}
...
...
@@ -411,6 +413,15 @@ func (r *route) GenRouters() ([]router, error) {
Gateway
:
node
.
Get
(
"gw"
),
}
ln
,
err
=
gost
.
TapListener
(
cfg
)
case
"ftcp"
:
ln
,
err
=
gost
.
FakeTCPListener
(
node
.
Addr
,
&
gost
.
FakeTCPListenConfig
{
TTL
:
ttl
,
Backlog
:
node
.
GetInt
(
"backlog"
),
QueueSize
:
node
.
GetInt
(
"queue"
),
},
)
default
:
ln
,
err
=
gost
.
TCPListener
(
node
.
Addr
)
}
...
...
forward.go
View file @
c56e4aa7
...
...
@@ -534,7 +534,7 @@ func (c *udpServerConn) Write(b []byte) (n int, err error) {
if
n
>
0
{
if
Debug
{
log
.
Logf
(
"[udp] %s <<< %s : length %d"
,
c
.
RemoteAddr
()
,
c
.
LocalAddr
(),
n
)
log
.
Logf
(
"[udp] %s <<< %s : length %d"
,
c
.
raddr
,
c
.
LocalAddr
(),
n
)
}
select
{
...
...
ftcp.go
0 → 100644
View file @
c56e4aa7
package
gost
import
(
"errors"
"net"
"time"
"github.com/go-log/log"
"github.com/xtaci/tcpraw"
)
type
fakeTCPTransporter
struct
{}
// FakeTCPTransporter creates a Transporter that is used by fake tcp client.
func
FakeTCPTransporter
()
Transporter
{
return
&
fakeTCPTransporter
{}
}
func
(
tr
*
fakeTCPTransporter
)
Dial
(
addr
string
,
options
...
DialOption
)
(
conn
net
.
Conn
,
err
error
)
{
opts
:=
&
DialOptions
{}
for
_
,
option
:=
range
options
{
option
(
opts
)
}
raddr
,
er
:=
net
.
ResolveTCPAddr
(
"tcp"
,
addr
)
if
er
!=
nil
{
return
nil
,
er
}
c
,
err
:=
tcpraw
.
Dial
(
"tcp"
,
addr
)
if
err
!=
nil
{
return
}
conn
=
&
fakeTCPConn
{
raddr
:
raddr
,
PacketConn
:
c
,
}
return
conn
,
nil
}
func
(
tr
*
fakeTCPTransporter
)
Handshake
(
conn
net
.
Conn
,
options
...
HandshakeOption
)
(
net
.
Conn
,
error
)
{
return
conn
,
nil
}
func
(
tr
*
fakeTCPTransporter
)
Multiplex
()
bool
{
return
false
}
type
FakeTCPListenConfig
struct
{
TTL
time
.
Duration
Backlog
int
QueueSize
int
}
type
fakeTCPListener
struct
{
ln
net
.
PacketConn
connChan
chan
net
.
Conn
errChan
chan
error
connMap
udpConnMap
config
*
FakeTCPListenConfig
}
// FakeTCPListener creates a Listener for fake TCP server.
func
FakeTCPListener
(
addr
string
,
cfg
*
FakeTCPListenConfig
)
(
Listener
,
error
)
{
ln
,
err
:=
tcpraw
.
Listen
(
"tcp"
,
addr
)
if
err
!=
nil
{
return
nil
,
err
}
if
cfg
==
nil
{
cfg
=
&
FakeTCPListenConfig
{}
}
backlog
:=
cfg
.
Backlog
if
backlog
<=
0
{
backlog
=
defaultBacklog
}
l
:=
&
fakeTCPListener
{
ln
:
ln
,
connChan
:
make
(
chan
net
.
Conn
,
backlog
),
errChan
:
make
(
chan
error
,
1
),
config
:
cfg
,
}
go
l
.
listenLoop
()
return
l
,
nil
}
func
(
l
*
fakeTCPListener
)
listenLoop
()
{
for
{
b
:=
make
([]
byte
,
mediumBufferSize
)
n
,
raddr
,
err
:=
l
.
ln
.
ReadFrom
(
b
)
if
err
!=
nil
{
log
.
Logf
(
"[ftcp] peer -> %s : %s"
,
l
.
Addr
(),
err
)
l
.
Close
()
l
.
errChan
<-
err
close
(
l
.
errChan
)
return
}
conn
,
ok
:=
l
.
connMap
.
Get
(
raddr
.
String
())
if
!
ok
{
cc
:=
&
fakeTCPConn
{
raddr
:
raddr
,
PacketConn
:
l
.
ln
,
}
conn
=
newUDPServerConn
(
cc
,
raddr
,
l
.
config
.
TTL
,
l
.
config
.
QueueSize
)
conn
.
onClose
=
func
()
{
l
.
connMap
.
Delete
(
raddr
.
String
())
log
.
Logf
(
"[ftcp] %s closed (%d)"
,
raddr
,
l
.
connMap
.
Size
())
}
select
{
case
l
.
connChan
<-
conn
:
l
.
connMap
.
Set
(
raddr
.
String
(),
conn
)
log
.
Logf
(
"[ftcp] %s -> %s (%d)"
,
raddr
,
l
.
Addr
(),
l
.
connMap
.
Size
())
default
:
conn
.
Close
()
log
.
Logf
(
"[ftcp] %s - %s: connection queue is full (%d)"
,
raddr
,
l
.
Addr
(),
cap
(
l
.
connChan
))
}
}
select
{
case
conn
.
rChan
<-
b
[
:
n
]
:
if
Debug
{
log
.
Logf
(
"[ftcp] %s >>> %s : length %d"
,
raddr
,
l
.
Addr
(),
n
)
}
default
:
log
.
Logf
(
"[ftcp] %s -> %s : recv queue is full (%d)"
,
raddr
,
l
.
Addr
(),
cap
(
conn
.
rChan
))
}
}
}
func
(
l
*
fakeTCPListener
)
Accept
()
(
conn
net
.
Conn
,
err
error
)
{
var
ok
bool
select
{
case
conn
=
<-
l
.
connChan
:
case
err
,
ok
=
<-
l
.
errChan
:
if
!
ok
{
err
=
errors
.
New
(
"accpet on closed listener"
)
}
}
return
}
func
(
l
*
fakeTCPListener
)
Addr
()
net
.
Addr
{
return
l
.
ln
.
LocalAddr
()
}
func
(
l
*
fakeTCPListener
)
Close
()
error
{
err
:=
l
.
ln
.
Close
()
l
.
connMap
.
Range
(
func
(
k
interface
{},
v
*
udpServerConn
)
bool
{
v
.
Close
()
return
true
})
return
err
}
type
fakeTCPConn
struct
{
mss
int
raddr
net
.
Addr
net
.
PacketConn
}
func
(
c
*
fakeTCPConn
)
Read
(
b
[]
byte
)
(
n
int
,
err
error
)
{
n
,
_
,
err
=
c
.
ReadFrom
(
b
)
return
}
func
(
c
*
fakeTCPConn
)
Write
(
b
[]
byte
)
(
n
int
,
err
error
)
{
return
c
.
WriteTo
(
b
,
c
.
raddr
)
}
func
(
c
*
fakeTCPConn
)
WriteTo
(
b
[]
byte
,
addr
net
.
Addr
)
(
n
int
,
err
error
)
{
mss
:=
c
.
mss
if
mss
<=
0
{
mss
=
1460
}
for
{
if
len
(
b
)
==
0
{
break
}
var
nn
int
if
len
(
b
)
<=
mss
{
nn
,
err
=
c
.
PacketConn
.
WriteTo
(
b
,
addr
)
n
+=
nn
break
}
nn
,
err
=
c
.
PacketConn
.
WriteTo
(
b
[
:
mss
],
addr
)
n
+=
nn
if
err
!=
nil
{
break
}
b
=
b
[
mss
:
]
}
return
}
func
(
c
*
fakeTCPConn
)
RemoteAddr
()
net
.
Addr
{
return
c
.
raddr
}
node.go
View file @
c56e4aa7
...
...
@@ -83,6 +83,7 @@ func ParseNode(s string) (node Node, err error) {
case
"rtcp"
,
"rudp"
:
// rtcp and rudp are for remote port forwarding
case
"ohttp"
:
// obfs-http
case
"tun"
,
"tap"
:
// tun/tap device
case
"ftcp"
:
// fake TCP
default
:
node
.
Transport
=
"tcp"
}
...
...
@@ -95,6 +96,7 @@ func ParseNode(s string) (node Node, err error) {
case
"direct"
,
"remote"
,
"forward"
:
// forwarding
case
"redirect"
:
// TCP transparent proxy
case
"tun"
,
"tap"
:
// tun/tap device
case
"ftcp"
:
// fake TCP
default
:
node
.
Protocol
=
""
}
...
...
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