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
64b5f628
Commit
64b5f628
authored
Nov 17, 2017
by
rui.zheng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update README.md
parent
b3068a7d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
27 additions
and
227 deletions
+27
-227
README.md
README.md
+15
-183
cmd/gost/main.go
cmd/gost/main.go
+12
-11
forward.go
forward.go
+0
-33
No files found.
README.md
View file @
64b5f628
...
...
@@ -6,161 +6,52 @@ gost - GO Simple Tunnel
[

](https://godoc.org/github.com/ginuerzh/gost)
[

](https://travis-ci.org/ginuerzh/gost)
[

](https://goreportcard.com/report/github.com/ginuerzh/gost)
[

](https://github.com/ginuerzh/gost/releases/latest)
[

](https://build.snapcraft.io/user/ginuerzh/gost)
[
English README
](
README_en.md
)
特性
------
*
多端口监听
*
可设置转发代理,支持多级转发(代理链)
*
支持标准HTTP/HTTPS/HTTP2/SOCKS4(A)/SOCKS5代理协议
*
[
支持多种隧道类型
](
https://docs.ginuerzh.xyz/gost/configuration/
)
*
SOCKS5代理支持TLS协商加密
*
Tunnel UDP over TCP
*
权限控制 (2.4+)
*
本地/远程TCP/UDP端口转发 (2.1+)
*
Shadowsocks协议 (UDP: 2.4+)
*
KCP协议 (2.3+)
*
TCP透明代理 (2.3+)
*
HTTP2通道 (2.4+)
*
SSH通道 (2.4+)
*
QUIC通道 (2.4+)
*
obfs4通道 (2.4+)
*
SNI (2.5+)
二进制文件下载:https://github.com/ginuerzh/gost/releases
Google讨论组: https://groups.google.com/d/forum/go-gost
*
TCP透明代理
*
[
本地/远程TCP/UDP端口转发
](
https://docs.ginuerzh.xyz/gost/port-forwarding/
)
*
[
支持Shadowsocks(TCP/UDP)协议
](
https://docs.ginuerzh.xyz/gost/ss/
)
*
[
支持SNI代理
](
https://docs.ginuerzh.xyz/gost/sni/
)
*
[
权限控制
](
https://docs.ginuerzh.xyz/gost/permission/
)
*
[
负载均衡
](
https://docs.ginuerzh.xyz/gost/load-balancing/
)
Wiki站点: https://docs.ginuerzh.xyz/gost/
在gost中,gost与其他代理服务都被看作是代理节点,gost可以自己处理请求,或者将请求转发给任意一个或多个代理节点。
Ubuntu Store
------
gost已经上架ubuntu store,在ubuntu 16.04上可以直接通过
`snap`
来安装:
```
bash
$
sudo
snap
install
gost
```
Google讨论组: https://groups.google.com/d/forum/go-gost
参数说明
快速上手
------
#### 代理及代理链
适用于-L和-F参数
```
bash
[
scheme://][user:pass@host]:port
```
scheme分为两部分: protocol+transport
protocol: 代理协议类型(http, socks4(a), socks5, ss, sni), transport: 数据传输方式(ws, wss, tls, mtls, quic, kcp, ssh, h2, h2c, obfs4), 二者可以任意组合,或单独使用:
> http - 标准HTTP代理: http://:8080
> https - 标准HTTPS代理(可能需要提供受信任的证书): http+tls://:443或https://:443
> http2 - 标准HTTP2代理并向下兼容HTTPS: http2://:443
> h2 - HTTP2 h2通道: h2://:443
> h2c - HTTP2 h2c通道: h2c://:443
> socks4(a) - 标准SOCKS4(A)代理: socks4://:1080或socks4a://:1080
> socks5 - 标准SOCKS5代理(支持TLS协商加密): socks5://:1080
> socks5+wss - SOCKS5代理,使用websocket传输数据: socks5+wss://:1080
> tls - HTTP/SOCKS5代理,使用TLS传输数据: tls://:443
> mtls - HTTP/SOCKS5代理,使用TLS以多路复用方式传输数据: mtls://:443
> ss - Shadowsocks代理: ss://chacha20:123456@:8338
> ssu - Shadowsocks UDP relay: ssu://chacha20:123456@:8338
> quic - QUIC通道: quic://:6121
> kcp - KCP通道: kcp://:8388
> redirect - 透明代理: redirect://:12345
> ssh - SSH代理通道: ssh://:2222,SSH转发通道: forward+ssh://:2222
> obfs4 - obfs4通道: obfs4://:8080
> sni - SNI代理: sni://:443
#### 端口转发
适用于-L参数
```
bash
scheme://[bind_address]:port/[host]:hostport
```
> scheme - 端口转发模式, 本地端口转发: tcp, udp; 远程端口转发: rtcp, rudp
> bind_address:port - 本地/远程绑定地址
> host:hostport - 目标访问地址
#### 配置文件
此功能由
[
@septs
](
https://github.com/septs
)
贡献。
> -C : 指定配置文件路径
配置文件为标准json格式:
```
json
{
"ServeNodes"
:
[
":8080"
,
"ss://chacha20:12345678@:8338"
],
"ChainNodes"
:
[
"http://192.168.1.1:8080"
,
"https://10.0.2.1:443"
],
"Debug"
:
true
}
```
`ServeNodes`
等同于
`-L`
参数,
`ChainNodes`
等同于
`-F`
参数,
`Debug`
等同于
`-D`
参数。
使用方法
------
#### 不设置转发代理
<img
src=
"https://ginuerzh.github.io/images/gost_01.png"
/>
*
作为标准HTTP/SOCKS5代理
```
bash
gost
-L
=
:8080
```
*
设置代理认证信息
```
bash
gost
-L
=
admin:123456@localhost:8080
```
*
多组认证信息
```
bash
gost
-L
=
localhost:8080?secrets
=
secrets.txt
```
通过secrets参数可以为HTTP/SOCKS5代理设置多组认证信息,格式为:
```
plain
# username password
test001 123456
test002 12345678
gost
-L
=
admin:123456@localhost:8080
```
*
多端口监听
```
bash
gost
-L
=
http2://:443
-L
=
socks5://:1080
-L
=
ss://aes-128-cfb:123456@:8338
```
...
...
@@ -231,7 +122,7 @@ gost -L=rudp://:5353/192.168.1.1:53?ttl=60 [-F=... -F=socks5://172.24.10.1:1080]
将172.24.10.1:5353上的数据(通过代理链)转发到192.168.1.1:53上。
每条转发通道都有超时时间,当超过此时间,且在此时间段内无任何数据交互,则此通道将关闭。可以通过
`ttl`
参数来设置超时时间,默认值为60秒。
**注:**
转发UDP数据时,如果有代理链,则代理链的末端(最后一个-F参数)必须是
gost SOCKS5类型代理,gost会使用UDP over
TCP方式进行转发。
**注:**
转发UDP数据时,如果有代理链,则代理链的末端(最后一个-F参数)必须是
GOST SOCKS5类型代理,gost会使用UDP-over-
TCP方式进行转发。
#### HTTP2
...
...
@@ -420,62 +311,3 @@ gost -L=:8080 -F="http2://server_domain_name:443?secure=true"
gost
-L
=
:8080
-F
=
"http2://:443?ca=ca.pem"
```
证书锁定功能由
[
@sheerun
](
https://github.com/sheerun
)
贡献
SOCKS5 UDP数据处理
------
#### 不设置转发代理
<img
src=
"https://ginuerzh.github.io/images/udp01.png"
height=
100
/>
gost作为标准SOCKS5代理处理UDP数据
#### 设置转发代理
<img
src=
"https://ginuerzh.github.io/images/udp02.png"
height=
100
/>
#### 设置多个转发代理(代理链)
<img
src=
"https://ginuerzh.github.io/images/udp03.png"
height=
200
/>
当设置转发代理时,gost会使用UDP-over-TCP方式转发UDP数据。proxy1 - proxyN可以为任意HTTP/HTTPS/HTTP2/SOCKS5/Shadowsocks类型代理。
权限控制
------
此功能由
[
@sheerun
](
https://github.com/sheerun
)
贡献。
服务端可以通过白名单(
`whitelist`
参数)和黑名单(
`blacklist`
参数)来控制客户端的请求是否允许被处理。
参数格式为:
`[actions]:[hosts]:[ports]`
`[actions]`
是一个由
`,`
分割的动作列表,可选值有:
`tcp`
(TCP转发),
`udp`
(UDP转发),
`rtcp`
(TCP远程转发),
`rudp`
(UDP远程转发), 或
`*`
(所有动作)。
`[hosts]`
是一个由
`,`
分割的Host列表,代表可以绑定到(rtcp,rudp)或转发到(tcp,udp)的目的主机,支持通配符(
*.google.com)和`*
`(所有主机)。
`
[ports]
`是一个由`
,
`分割的端口列表,代表可以绑定到(rtcp,rudp)或转发到(tcp,udp)的目的端口,可以是`
*
`(所有端口)。
多组权限可以通过`
+
`进行连接:
`
whitelist=rtcp,rudp:localhost,127.0.0.1:2222,8000-9000+udp:8.8.8.8,8.8.4.4:53
`(允许TCP/UDP远程端口转发绑定到localhost,127.0.0.1的2222端口和8000-9000端口范围,同时允许UDP转发到8.8.8.8:53和8.8.4.4:53)。
SSH远程端口转发只能绑定到127.0.0.1:8000
```bash
gost -L=forward+ssh://localhost:8389?whitelist=rtcp:127.0.0.1:8000
```
SOCKS5的TCP/UDP远程端口转发只允许绑定到大于1000的端口
```bash
gost -L=socks://localhost:8389?blacklist=rtcp,rudp:*:0-1000
```
SOCKS5的UDP转发只能转发到8.8.8.8:53
```bash
gost -L=socks://localhost:8389?whitelist=udp:8.8.8.8:53
``
`
限制条件
------
代理链中的HTTP代理节点必须支持CONNECT方法。
如果要转发SOCKS5的BIND和UDP请求,代理链的末端(最后一个-F参数)必须支持gost SOCKS5类型代理。
cmd/gost/main.go
View file @
64b5f628
...
...
@@ -41,6 +41,11 @@ func init() {
flag
.
BoolVar
(
&
printVersion
,
"V"
,
false
,
"print version"
)
flag
.
Parse
()
if
printVersion
{
fmt
.
Fprintf
(
os
.
Stderr
,
"gost %s (%s)
\n
"
,
gost
.
Version
,
runtime
.
Version
())
os
.
Exit
(
0
)
}
if
len
(
options
.
ServeNodes
)
>
0
{
routes
=
append
(
routes
,
options
)
}
...
...
@@ -56,10 +61,6 @@ func init() {
os
.
Exit
(
0
)
}
if
printVersion
{
fmt
.
Fprintf
(
os
.
Stderr
,
"gost %s (%s)
\n
"
,
gost
.
Version
,
runtime
.
Version
())
os
.
Exit
(
0
)
}
}
func
main
()
{
...
...
@@ -378,6 +379,11 @@ func (r *route) serve() error {
case
"h2c"
:
ln
,
err
=
gost
.
H2CListener
(
node
.
Addr
)
case
"tcp"
:
// Directly use SSH port forwarding if the last chain node is forward+ssh
if
chain
.
LastNode
()
.
Protocol
==
"forward"
&&
chain
.
LastNode
()
.
Transport
==
"ssh"
{
chain
.
Nodes
()[
len
(
chain
.
Nodes
())
-
1
]
.
Client
.
Connector
=
gost
.
SSHDirectForwardConnector
()
chain
.
Nodes
()[
len
(
chain
.
Nodes
())
-
1
]
.
Client
.
Transporter
=
gost
.
SSHForwardTransporter
()
}
ln
,
err
=
gost
.
TCPListener
(
node
.
Addr
)
case
"rtcp"
:
// Directly use SSH port forwarding if the last chain node is forward+ssh
...
...
@@ -444,11 +450,6 @@ func (r *route) serve() error {
case
"http"
:
handler
=
gost
.
HTTPHandler
(
handlerOptions
...
)
case
"tcp"
:
// Directly use SSH port forwarding if the last chain node is forward+ssh
if
chain
.
LastNode
()
.
Protocol
==
"forward"
&&
chain
.
LastNode
()
.
Transport
==
"ssh"
{
chain
.
Nodes
()[
len
(
chain
.
Nodes
())
-
1
]
.
Client
.
Connector
=
gost
.
SSHDirectForwardConnector
()
chain
.
Nodes
()[
len
(
chain
.
Nodes
())
-
1
]
.
Client
.
Transporter
=
gost
.
SSHForwardTransporter
()
}
handler
=
gost
.
TCPDirectForwardHandler
(
node
.
Remote
,
handlerOptions
...
)
case
"rtcp"
:
handler
=
gost
.
TCPRemoteForwardHandler
(
node
.
Remote
,
handlerOptions
...
)
...
...
@@ -467,7 +468,7 @@ func (r *route) serve() error {
default
:
// start from 2.5, if remote is not empty, then we assume that it is a forward tunnel
if
node
.
Remote
!=
""
{
handler
=
gost
.
ForwardHandler
(
node
.
Remote
,
handlerOptions
...
)
handler
=
gost
.
TCPDirect
ForwardHandler
(
node
.
Remote
,
handlerOptions
...
)
}
else
{
handler
=
gost
.
AutoHandler
(
handlerOptions
...
)
}
...
...
@@ -662,7 +663,7 @@ func loadPeerConfig(peer string) (config peerConfig, err error) {
func
(
cfg
*
peerConfig
)
Validate
()
{
if
cfg
.
MaxFails
<=
0
{
cfg
.
MaxFails
=
3
cfg
.
MaxFails
=
1
}
if
cfg
.
FailTimeout
<=
0
{
cfg
.
FailTimeout
=
30
// seconds
...
...
forward.go
View file @
64b5f628
...
...
@@ -24,39 +24,6 @@ func (c *forwardConnector) Connect(conn net.Conn, addr string) (net.Conn, error)
return
conn
,
nil
}
type
forwardHandler
struct
{
raddr
string
options
*
HandlerOptions
}
// ForwardHandler creates a server Handler for data forwarding server.
func
ForwardHandler
(
raddr
string
,
opts
...
HandlerOption
)
Handler
{
h
:=
&
forwardHandler
{
raddr
:
raddr
,
options
:
&
HandlerOptions
{},
}
for
_
,
opt
:=
range
opts
{
opt
(
h
.
options
)
}
return
h
}
func
(
h
*
forwardHandler
)
Handle
(
conn
net
.
Conn
)
{
defer
conn
.
Close
()
log
.
Logf
(
"[forward] %s - %s"
,
conn
.
RemoteAddr
(),
h
.
raddr
)
cc
,
err
:=
h
.
options
.
Chain
.
Dial
(
h
.
raddr
)
if
err
!=
nil
{
log
.
Logf
(
"[forward] %s -> %s : %s"
,
conn
.
RemoteAddr
(),
h
.
raddr
,
err
)
return
}
defer
cc
.
Close
()
log
.
Logf
(
"[forward] %s <-> %s"
,
conn
.
RemoteAddr
(),
h
.
raddr
)
transport
(
conn
,
cc
)
log
.
Logf
(
"[forward] %s >-< %s"
,
conn
.
RemoteAddr
(),
h
.
raddr
)
}
type
tcpDirectForwardHandler
struct
{
raddr
string
options
*
HandlerOptions
...
...
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